def initialize(path_to_config_file, path_to_key_info_json): log = logging.getLogger('werkzeug') log.setLevel(logging.ERROR) success = ConfigManager.load(path_to_config_file) if not success: return False config = ConfigManager.getConfig() Logger.setLogFolder(config.server_log_file_folder) success = TransactionSigner.initialize() if not success: return False success = KeyInfoManager.load(path_to_key_info_json) if not success: return False if KeyInfoManager.getKeyInfo(KeyAlias.WHITELIST_CONTROLLER) == None: Logger.printError('%s key info not loaded!' % (KeyAlias.WHITELIST_CONTROLLER)) return False if KeyInfoManager.getKeyInfo(KeyAlias.EXCHANGE_RATE_CONTROLLER) == None: Logger.printError('%s key info not loaded!' % (KeyAlias.EXCHANGE_RATE_CONTROLLER)) return False success = TransactionSigner.initialize() if not success: return False return True
def initialize(): if not ConfigManager.isInitialized(): return False try: theta_abi_file_path = ConfigManager.getConfig( ).getThetaAbiFilePath() with open(theta_abi_file_path) as abi_json_data: TransactionSigner._theta_abi = json.load(abi_json_data) except: return False if TransactionSigner._theta_abi is None: return False try: theta_token_sale_abi_file_path = ConfigManager.getConfig( ).getThetaTokenSaleAbiFilePath() with open(theta_token_sale_abi_file_path) as abi_json_data: TransactionSigner._theta_token_sale_abi = json.load( abi_json_data) except: return False if TransactionSigner._theta_token_sale_abi is None: return False return True
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 _getToAddress(smart_contract_name): if smart_contract_name == SmartContractName.THETA_TOKEN: return ConfigManager.getConfig().getThetaContractAddresss() elif smart_contract_name == SmartContractName.THETA_TOKEN_SALE: return ConfigManager.getConfig().getThetaTokenSaleContractAddresss( ) else: return None
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 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_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 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 __init__(self): obj = ConfigManager.get_ini_obj() self.username = obj.get('param_iko', 'username').strip() self.password = obj.get('param_iko', 'password').strip() self.server_host = obj.get('param_iko', 'server_host').strip() self.port = obj.get('param_iko', 'port').strip() self.ssh = self.connect()
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 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 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 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 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 __init__(self): config = ConfigManager.get_ini_obj() self.db = pymysql.connect(config.get('Mysql', 'server_host'), config.get('Mysql', 'username'), config.get('Mysql', 'password'), config.get('Mysql', 'database'), int(config.get('Mysql', 'port')), charset='utf8') self.cursor = self.db.cursor()
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 remove_mch_accnt_no_settle_key(): """提现接口调用时会写入缓存,自动化脚本跑时会重复提交redis所以需要删除redis的缓存数据""" obj = ConfigManager.get_ini_obj() r = redis.Redis(connection_pool=redis.ConnectionPool( host=obj.get('redis_config', 'server_host'), password=obj.get('redis_config', 'password'), db='0')) keys = 'mch_accnt_no_settle_key' r.delete(keys)
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 remove_withdrawal_info(mch_no, order_no): """提现接口调用时会写入缓存,自动化脚本跑时会重复提交redis所以需要删除redis的缓存数据""" obj = ConfigManager.get_ini_obj() r = redis.Redis(connection_pool=redis.ConnectionPool( host=obj.get('redis_config', 'server_host'), password=obj.get('redis_config', 'password'), db=obj.get('redis_config', 'db'))) keys = 'com.deposit.withdraw:' + mch_no + order_no v = r.get(keys) print('正在清理缓存%s' % v) if v is None: print('没有缓存') return r.delete(keys)
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 __init__(self, ex_name, sheet=0): """ 初始化excle,传入服务名称查询到excle_name和case_data """ # 获取在配置文件中管理的文件名称,然后拿到文件的存储路径 case_dir, case_data = ConfigManager.get_ex_name(ex_name).split(',') path = os.path.join(os.path.dirname(os.path.dirname(__file__)), 'project_data', case_dir, case_data) log.info('准备读取的测试数据为%s' % path) self.data = xlrd.open_workbook(path, encoding_override='utf-8') # 默认选取第一张sheet self.table = self.data.sheet_by_index(sheet) # 获取第一行的值作为key self.keys = self.table.row_values(0) # 获取总行数 self.rowNumber = self.table.nrows # 获取总列数 self.colNumber = self.table.ncols
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_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
# "expected_total_supply" : 1000000000000000000000000000 # } # if __name__ == '__main__': if len(sys.argv) != 4: print( "\nUsage: python run.py <config_file_path> <target_height> <balance_file_path>\n" ) exit(1) #Logger.enableDebugLog() config_file_path = sys.argv[1] target_height = int(sys.argv[2]) balance_file_path = sys.argv[3] cfgMgr = ConfigManager() if not cfgMgr.load(config_file_path): Logger.printError('Failed to load config: %s' % (config_file_path)) exit(1) config = cfgMgr.config ethereum_rpc_url = config.ethereum_rpc_url smart_contract_address = config.smart_contract_address expected_total_supply = config.expected_total_supply genesis_height = config.genesis_height exportTokenBalance(ethereum_rpc_url, smart_contract_address, expected_total_supply, genesis_height, target_height, balance_file_path)
def get_url(): url = ConfigManager.get_service(Constants.HOST.TEST) return url