def init_merchant(cls): # 先创建商户 if not cls.get_merchant_info(): MerchantInfo.create_merchant(m_name=cls.merchant, m_type=MerchantTypeEnum.TEST) # 给商户加钱 rst, msg = MerchantBalanceEvent.update_balance( merchant=cls.merchant, ref_id=OrderUtils.gen_unique_ref_id(), source=OrderSourceEnum.MANUALLY, order_type=PayTypeEnum.MANUALLY, bl_type=BalanceTypeEnum.AVAILABLE, ad_type=BalanceAdjustTypeEnum.PLUS, tx_id=OrderUtils.gen_normal_tx_id(10), value=100000000, comment="手动脚本修改商户可用余额") # print(rst, msg) merchant_fee_list = list() if not cls.get_merchant_fee_config(PayTypeEnum.DEPOSIT): # 商户费率配置 merchant_fee_list.append( dict( merchant=cls.merchant, payment_way=PayTypeEnum.DEPOSIT, value="3", fee_type=PaymentFeeTypeEnum.PERCENT_PER_ORDER, payment_method=cls.channel_enum.conf.payment_method, )) MerchantFeeConfig.update_fee_config(cls.merchant, merchant_fee_list) # 商户费率配置 merchant_fee_list.append( dict( merchant=cls.merchant, payment_way=PayTypeEnum.DEPOSIT, value="3", fee_type=PaymentFeeTypeEnum.PERCENT_PER_ORDER, payment_method=cls.channel_enum2.conf.payment_method, )) MerchantFeeConfig.update_fee_config(cls.merchant, merchant_fee_list) if not cls.get_merchant_fee_config(PayTypeEnum.WITHDRAW): merchant_fee_list.append( dict(merchant=cls.merchant, payment_way=PayTypeEnum.WITHDRAW, value="3.2", fee_type=PaymentFeeTypeEnum.PERCENT_PER_ORDER)) MerchantFeeConfig.update_fee_config(cls.merchant, merchant_fee_list) merchant_config = cls.get_merchant_fee_config(PayTypeEnum.DEPOSIT) assert merchant_config.fee_type == PaymentFeeTypeEnum.PERCENT_PER_ORDER merchant_config = cls.get_merchant_fee_config(PayTypeEnum.WITHDRAW) assert merchant_config.fee_type == PaymentFeeTypeEnum.PERCENT_PER_ORDER
def init_user2(cls): user = cls.get_user2() if not user: user = User.register_account(cls.merchant, account=cls.user_account2, ac_type=AccountTypeEnum.MOBILE, login_pwd=cls.password) data = dict( uid=user.uid, merchant=cls.merchant, ref_id=OrderUtils.gen_unique_ref_id(), source=OrderSourceEnum.MANUALLY, order_type=PayTypeEnum.MANUALLY, bl_type=BalanceTypeEnum.AVAILABLE, ad_type=BalanceAdjustTypeEnum.PLUS, tx_id=OrderUtils.gen_normal_tx_id(user.uid), value=Decimal("500000000"), comment="手动脚本修改用户可用余额", ) rst, msg = UserBalanceEvent.update_user_balance(**data) # print(rst, msg) # 写入数据库 if not cls.get_bank_card(): bank_card = BankCard.add_bank_card( user.merchant, uid=user.uid, bank_name=PaymentBankEnum.ZHONGGUO.desc, bank_code=PaymentBankEnum.ZHONGGUO.bank_code, card_no=cls.bank_card_no2, account_name="王小儿", branch="深圳支行", province="广东省", city="深圳市", )
def transfer(cls, from_user, to_user, merchant: MerchantEnum, amount, comment: str = ''): """ 转账 ref_id = OrderUtils.gen_unique_ref_id() PayTypeEnum.TRANSFER 商户类型是TEST,那么source就是 TEST 否则是 ONLINE """ from app.models.user import UserBindInfo # 记录一个参数日志, locals自动收集这行代码之前出现过的局部变量 params = copy.deepcopy(locals()) params.pop('cls') try: with db.auto_commit(True): # 构造source的值 if merchant.is_test: source = OrderSourceEnum.TESTING else: source = OrderSourceEnum.ONLINE ref_id_a = OrderUtils.gen_unique_ref_id() ref_id_b = OrderUtils.gen_unique_ref_id() tx_id = OrderUtils.gen_normal_tx_id(from_user.uid) in_bind = UserBindInfo.query_bind_by_uid(to_user.uid) if in_bind: in_account = in_bind.name else: in_account = to_user.account out_bind = UserBindInfo.query_bind_by_uid(from_user.uid) if out_bind: out_account = out_bind.name else: out_account = from_user.account # A用户扣钱 flag_a, msg_b = cls.update_user_balance(from_user.uid, merchant, ref_id=ref_id_a, source=source, order_type=PayTypeEnum.TRANSFER, value=amount, bl_type=BalanceTypeEnum.AVAILABLE, ad_type=BalanceAdjustTypeEnum.MINUS, comment=comment, tx_id=tx_id, in_account=in_account, out_account=out_account, commit=False, ) if flag_a != 0: raise RuntimeError(msg_b) # B用户加钱 flag_b, msg_b = cls.update_user_balance(to_user.uid, merchant, ref_id=ref_id_b, source=source, order_type=PayTypeEnum.TRANSFER, value=amount, bl_type=BalanceTypeEnum.AVAILABLE, ad_type=BalanceAdjustTypeEnum.PLUS, comment=comment, tx_id=tx_id, in_account=in_account, out_account=out_account, commit=False, ) if flag_b != 0: raise RuntimeError(msg_b) except RuntimeError as e: # 捕获异常,返回失败 msg = "%s, params: %s" % (str(e), params) current_app.config['SENTRY_DSN'] and current_app.logger.fatal(msg) return -100, msg return True, ''