def get_amount(): '''获取待结算表各账户的余额''' # 存管户 depository_mch_accnt_no = ConfigManager.get_service( Constants.SubMerchant.DEPOSITORY) depository_event_amt = SqlSave.select_his_mch_accnt_keep_event_amt( depository_mch_accnt_no, 'depository') # 在途商户 onway_mch_accnt_no = ConfigManager.get_service( Constants.SubMerchant.ONWAY) onway_event_amt = SqlSave.select_his_mch_accnt_keep_event_amt( onway_mch_accnt_no, 'onway') # 分润商户的损益金额 profit_mch_accnt_no = ConfigManager.get_service( Constants.SubMerchant.PROFIT['profit_1']) profit_event_amt = SqlSave.select_his_mch_accnt_keep_event_amt( profit_mch_accnt_no, 'profit') # 子商户的金额 mch_accnt_no = ConfigManager.get_service( Constants.SubMerchant.MUCSUB['mucsub_1']) mch_accnt_no_event_amt = SqlSave.select_his_mch_accnt_keep_event_amt( mch_accnt_no, 'pay') amount_list = [ depository_event_amt, onway_event_amt, profit_event_amt, mch_accnt_no_event_amt ] return amount_list
def mch_promotion_sttled_amt(self, settled_ant_aft, settled_ant_bef, mach_pay_up_obj, button='pay'): """准备金账户或子商户在请求前和请求后可结算金额变化""" for key, value in settled_ant_aft.items(): if button.__eq__('pay'): if key.__eq__( ConfigManager.get_service( Constants.SubMerchant.PREPAY['prepay_1'])): self.assertEqual( int(value[0][0]) - int(settled_ant_bef[key][0][0]), int(mach_pay_up_obj.trans_amt_dict[key]), msg= '准备金账户号为:%s的商户,对比子商户可结算金额时 请求后的金额:%s - 请求前的金额 %s 不等于 预期金额:-%s' % (key, value[0][0], settled_ant_bef[key][0][0], mach_pay_up_obj.trans_amt_dict[key])) continue else: if key != ConfigManager.get_service( Constants.SubMerchant.PREPAY['prepay_1']): self.assertEqual( int(value[0][0]) - int(settled_ant_bef[key][0][0]), -int(mach_pay_up_obj.trans_amt_dict[key]), msg= '商户账户号为:%s的商户,对比子商户可结算金额时 请求后的金额:%s - 请求前的金额 %s 不等于 预期金额:%s' % (key, value[0][0], settled_ant_bef[key][0][0], mach_pay_up_obj.trans_amt_dict[key]))
def test_error_flow_none_promotion_refund(self, flow_error_none_Promotion): """ 异常活动金额支付流程,没有准备金账户 """ PreconditionKeepingAccounts.mct_promotion_pre(button=Constants.RESULT.FALSE, mch_no=ConfigManager.get_service(Constants.SubMerchant.PREPAY['prepay_2'])) PreconditionKeepingAccounts.mct_promotion_pre(button=Constants.RESULT.FALSE, mch_no=ConfigManager.get_service(Constants.SubMerchant.PREPAY['prepay_1'])) self.err_public(flow_error_none_Promotion) PreconditionKeepingAccounts.mct_promotion_pre(button=Constants.RESULT.TRUE, mch_no=ConfigManager.get_service(Constants.SubMerchant.PREPAY['prepay_1']))
def update_super_money(button): """ 是否开启超额提现开关 True为开启 False为关闭 """ if button: sql = "update mch_other_config set spuer_money = '1' where mch_no = '%s'" % ( ConfigManager.get_service(Constants.Merchant.CS)) else: sql = "update mch_other_config set spuer_money = '0' where mch_no = '%s'" % ( ConfigManager.get_service(Constants.Merchant.CS)) ConnectionMysql().execute_db(sql)
def update_card_name(button): """修改绑定银行卡姓名进行提现测试sql""" if button is False: sql = "update %s set cardholder_name='提现银行卡姓名修改' where mch_accnt_no='%s'" % ( Constants.TableName.BANK_CARD, ConfigManager.get_service( Constants.SubMerchant.MUCSUB['mucsub_4'])) else: sql = "update %s set cardholder_name='靳伟' where mch_accnt_no='%s'" % ( Constants.TableName.BANK_CARD, ConfigManager.get_service( Constants.SubMerchant.MUCSUB['mucsub_4'])) ConnectionMysql().execute_db(sql)
def mct_promotion_pre(button, all=False): """ 在提现时更改备用准备金账户类型为准备金 :return: """ # 多个准备金账户暂时不管 if all: mch_no_list = [ConfigManager.get_service(Constants.SubMerchant.PREPAY['prepay_1']), ConfigManager.get_service(Constants.SubMerchant.PREPAY['prepay_2'])] else: mch_no_list = [ConfigManager.get_service(Constants.SubMerchant.PREPAY['prepay_1'])] for i in mch_no_list: SqlSave.update_accnt_type(i, button=button)
def update_pay_url(pay_type): """更新提现真实请求的url""" success_url = Constants.MockUrl.SUCCESS fail_url = Constants.MockUrl.FAIL wait_url = Constants.MockUrl.WAIT time_out_url = Constants.MockUrl.TIME_OUT default = Constants.MockUrl.DEFAULT select_success_url = Constants.MockUrl.SELECT_SUCCESS select_none_url = Constants.MockUrl.SELECT_NONE select_wait_url = Constants.MockUrl.SELECT_WAIT select_fail_url = Constants.MockUrl.SELECT_FAIL select_long_url = Constants.MockUrl.SELECT_LONG if pay_type == 'success': sql = "update mch_config set pay_url = '%s' where mch_no = '%s'" % ( success_url, ConfigManager.get_service(Constants.Merchant.CS)) elif pay_type == 'fail': sql = "update mch_config set pay_url = '%s' where mch_no = '%s'" % ( fail_url, ConfigManager.get_service(Constants.Merchant.CS)) elif pay_type == 'wait': sql = "update mch_config set pay_url = '%s' where mch_no = '%s'" % ( wait_url, ConfigManager.get_service(Constants.Merchant.CS)) elif pay_type == 'time_out': sql = "update mch_config set pay_url = '%s' where mch_no = '%s'" % ( time_out_url, ConfigManager.get_service(Constants.Merchant.CS)) elif pay_type == 'select_success': sql = "update mch_config set pay_url = '%s' where mch_no = '%s'" % ( select_success_url, ConfigManager.get_service(Constants.Merchant.CS)) elif pay_type == 'select_none': sql = "update mch_config set pay_url = '%s' where mch_no = '%s'" % ( select_none_url, ConfigManager.get_service(Constants.Merchant.CS)) elif pay_type == 'select_wait': sql = "update mch_config set pay_url = '%s' where mch_no = '%s'" % ( select_wait_url, ConfigManager.get_service(Constants.Merchant.CS)) elif pay_type == 'select_fail': sql = "update mch_config set pay_url = '%s' where mch_no = '%s'" % ( select_fail_url, ConfigManager.get_service(Constants.Merchant.CS)) elif pay_type == 'select_long': sql = "update mch_config set pay_url = '%s' where mch_no = '%s'" % ( select_long_url, ConfigManager.get_service(Constants.Merchant.CS)) else: sql = "update mch_config set pay_url = '%s' where mch_no = '%s'" % ( default, ConfigManager.get_service(Constants.Merchant.CS)) ConnectionMysql().execute_db(sql)
def public_handle(data, exc_data): """回填商户号""" if not isinstance(data, dict): data = json.loads(exc_data['data']) i = data.get('biz_content') if i.get('mch_accnt_no') in Constants.SubMerchant.MUCSUB.keys(): i['mch_accnt_no'] = ConfigManager.get_service( Constants.SubMerchant.MUCSUB[i.get('mch_accnt_no')]) if i.get('mch_accnt_no') in Constants.SubMerchant.PROFIT.keys(): i['mch_accnt_no'] = ConfigManager.get_service( Constants.SubMerchant.PROFIT[i.get('mch_accnt_no')]) if i.get('mch_accnt_no') in Constants.SubMerchant.PREPAY.keys(): i['mch_accnt_no'] = ConfigManager.get_service( Constants.SubMerchant.PREPAY[i.get('mch_accnt_no')]) return data
def mch_update_prepay_amount(amt='1000', set_amt='1000'): """ 设置提现准备金账户余额和可结算余额 :return: """ mch = ConfigManager.get_service(Constants.SubMerchant.PREPAY['prepay_1']) SqlSave.update_amount(amt, set_amt, mch)
def update_amount_for_prepay(amt, settled_amt): """更新准备金账户余额为10000""" sql = "update mch_accnt set remain_amt = '%s',settled_amount='%s' where mch_accnt_no = '%s'" % ( amt, settled_amt, ConfigManager.get_service( Constants.SubMerchant.PREPAY['prepay_1'])) ConnectionMysql().execute_db(sql)
def mct_update_amount_pre(unusual_parameter, amt='10000', set_amt='10000', ): """ 设置提现专用子商户的余额和可结算余额amt, set_amt :return: """ data = unusual_parameter['data'] if not isinstance(data, dict): data = json.loads(data) data = data['biz_content'] if data.get('mch_accnt_no') in Constants.SubMerchant.MUCSUB.keys(): mch = ConfigManager.get_service(Constants.SubMerchant.MUCSUB[data.get('mch_accnt_no')]) elif data.get('mch_accnt_no') in Constants.SubMerchant.PROFIT.keys(): mch = ConfigManager.get_service(Constants.SubMerchant.PROFIT[data.get('mch_accnt_no')]) else: mch = ConfigManager.get_service(Constants.SubMerchant.PREPAY[data.get('mch_accnt_no')]) SqlSave.update_amount(amt, set_amt, mch)
def update_change(is_change): """ 更改手续费为29999支付方式,费率为0.01 :return: """ sql = "update mch_other_config set fee_undertaker='%s',is_charge='Y' where mch_no = '%s'" % ( is_change, ConfigManager.get_service(Constants.Merchant.CS)) ConnectionMysql().execute_db(sql)
def select_fix_poundage(): """获取数据库的手续费""" sql = "select fixed_poundage from mch_other_config where mch_no='%s'" % ConfigManager.get_service( Constants.Merchant.CS) result = ConnectionMysql().select_db(sql) if result[0][0] == None: return 0 return result[0][0]
def mch_update_fixed_poundage(button, number): if button is True: sql = "update mch_other_config set fixed_poundage = '%s' where mch_no = '%s'" % ( number, ConfigManager.get_service(Constants.Merchant.CS)) else: sql = "update mch_other_config set fixed_poundage = null where mch_no = '%s'" % ConfigManager.get_service( Constants.Merchant.CS) ConnectionMysql().execute_db(sql)
def send_requests(**kwargs): url = ConfigManager.get_service(Constants.HOST.TEST) # todo 关于接口签名认证的方法可以做进一步处理如:直接去数据库查询等。 headers = { 'User-Agent': ConfigManager.get_basic(Constants.UserAgent.CHROME) } # 请求头默认带浏览器chrome 可配置 headers = headers if kwargs.get('HEADERS') is None else dict( headers, **kwargs.get('HEADERS')) # 和传入的请求头合并 # method = 'post' if kwargs.get('请求类型') is '' else kwargs.get('METHOD') method = 'post' allow_redirects = True if kwargs.get( 'allow_redirects') is None else kwargs.get( 'allow_redirects') # 是否重定向 timeout = 500 if kwargs.get('time_out') is None else kwargs.get( 'time_out') # 超时时间的设置 data = dict() format_data = kwargs.get('data') if isinstance(format_data, str): format_data = json.loads(format_data) format_data['mch_no'] = ConfigManager.get_service( Constants.Merchant.CS) format_data = json.dumps(format_data) data['data'] = format_data log.info("==============================本次请求data:::%s" % format_data) data['sign'] = RequestManager.get_sign(format_data) # 为请求增加签名认证 if method.upper().__eq__('GET'): res = requests.get( url, params=kwargs.get('params'), headers=headers, allow_redirects=allow_redirects, timeout=timeout, verify=False) # verify 由于该请求走fiddler会报错 所以关闭verify保证能抓到请求 return res, res.json() if method.upper().__eq__('POST'): res = requests.post(url, json=kwargs.get('json'), headers=headers, data=data, params=kwargs.get('params'), allow_redirects=allow_redirects, timeout=timeout, verify=False) return res, json.loads(res.json().get('data'))
def get_sub_mch(type_mch): """ type 值为以下几种形式 much_sub = ['mucsub_1','mucsub_2','mucsub_3','mucsub_4'] # 商户子商户 profit = ['profit_1', 'profit_2'] # 商户分润商户 prepay = ['prepay_1', 'prepay_2'] # 准备金账户 """ sub_mch_no = ConfigManager.get_service( Constants.SubMerchant.MUCSUB[type_mch]) return sub_mch_no
def mct_update_acct_type(button): if button is True: sql_1 = "update mch_accnt set accnt_type='%s' where mch_accnt_no='%s'" % ( 'mch_sub', ConfigManager.get_service( Constants.SubMerchant.PROFIT['profit_1'])) sql_2 = "update mch_accnt set accnt_type='%s' where mch_accnt_no='%s'" % ( 'mch_sub', ConfigManager.get_service( Constants.SubMerchant.PROFIT['profit_2'])) else: sql_1 = "update mch_accnt set accnt_type='%s' where mch_accnt_no='%s'" % ( 'profit', ConfigManager.get_service( Constants.SubMerchant.PROFIT['profit_1'])) sql_2 = "update mch_accnt set accnt_type='%s' where mch_accnt_no='%s'" % ( 'profit', ConfigManager.get_service( Constants.SubMerchant.PROFIT['profit_2'])) ConnectionMysql().execute_db(sql_1) ConnectionMysql().execute_db(sql_2)
def public_handle(self, channel, is_change): """进行存管户和在途账户的金额校验""" result = SqlSave.select_reconciliation_result_settle(channel) recon_amt = result[2] profit_loss_amt = result[3] depository_mch_accnt_no = ConfigManager.get_service( Constants.SubMerchant.DEPOSITORY) depository_event_amt = SqlSave.select_his_mch_accnt_keep_event_amt( depository_mch_accnt_no, 'depository') self.assertEqual(depository_event_amt, recon_amt) onway_mch_accnt_no = ConfigManager.get_service( Constants.SubMerchant.ONWAY) onway_event_amt = SqlSave.select_his_mch_accnt_keep_event_amt( onway_mch_accnt_no, 'onway') self.assertEqual(onway_event_amt, recon_amt) profit_mch_accnt_no = ConfigManager.get_service( Constants.SubMerchant.PROFIT['profit_1']) profit_event_amt = SqlSave.select_his_mch_accnt_keep_event_amt( profit_mch_accnt_no, 'profit') self.assertEqual(profit_event_amt, profit_loss_amt) # 进行子商户的金额校验 mch_accnt_no = ConfigManager.get_service( Constants.SubMerchant.MUCSUB['mucsub_1']) mch_accnt_no_event_amt = SqlSave.select_his_mch_accnt_keep_event_amt( mch_accnt_no, 'pay') trans_amount_total = HandleSettle.get_trans_amount_total( channel, is_change) self.assertEqual(trans_amount_total, mch_accnt_no_event_amt)
def machaccnt_pay_channel_rate_common(exc_data): """ 含有手续费的handle处理 exc_data 是给构造预期结果用 copy是给请求用 回填 计算手续费后的金额 """ copy_exc_data = copy.deepcopy(exc_data) comparison_muc_sub_list = [] for key, value in Constants.SubMerchant.MUCSUB.items(): comparison_muc_sub_list.append(ConfigManager.get_service(value)) data = copy_exc_data['data'] if not isinstance(data, dict): data = json.loads(copy_exc_data['data']) trans_amt = data.get('biz_content').get('trans_amt') for i in data.get('biz_content').get('split_accnt_detail'): if i.get('mch_accnt_no') in comparison_muc_sub_list: new_amount = Base.count_charge(trans_amt, i.get('amount')) i['amount'] = new_amount copy_exc_data['data'] = HandleKeepingAccounts.public_handle( data, copy_exc_data) return copy_exc_data
def get_url(): url = ConfigManager.get_service(Constants.HOST.TEST) return url
def get_mch_no(): """子商户号""" mch_no = ConfigManager.get_service(Constants.Merchant.CS) return mch_no
def get_token(): """token""" token = ConfigManager.get_service(Constants.MD5Token.CS) return token
def select_count_mch_details(): """获取解析对账单表中共存在多少条数据""" sql = "select count(id) from mch_account_details where mch_no = '%s'" % ConfigManager.get_service( Constants.Merchant.CS) result = ConnectionMysql().select_db(sql) return result[0][0]
def send_with(): """触发还准备金定时器""" requests.post(url=ConfigManager.get_service(Constants.HOST.TIMER_WITH))
def delete_download_info(): sql = "delete from download_info where mch_no = '%s'" % ConfigManager.get_service( Constants.Merchant.CS) ConnectionMysql().execute_db(sql)
def send_deal_withdraw(): """触发提现""" requests.post(url=ConfigManager.get_service(Constants.HOST.TIMER_TEST))
def delete_mch_account_details(): sql = "delete from mch_account_details where mch_no = '%s'" % ConfigManager.get_service( Constants.Merchant.CS) ConnectionMysql().execute_db(sql)
def delete_reconciliation_result(): sql = "delete from reconciliation_result where mchNo='%s' and beginTime='%s'" % ( ConfigManager.get_service(Constants.Merchant.CS), '2020-05-19') ConnectionMysql().execute_db(sql)
def get_sign(data): """获取请求时需要的sign""" token = ConfigManager.get_service(Constants.MD5Token.CS) sign = ''.join((data, "&", json.loads(data).get('timestamp'), token)) sign_md5 = hashlib.md5(sign.encode(encoding='utf-8')).hexdigest() return sign_md5
def select_download_url(): """获取对账单的名称""" sql = "select download_url,type from download_info where mch_no = '%s'" % ConfigManager.get_service( Constants.Merchant.CS) result = ConnectionMysql().select_db(sql) return result