包括使用csv模块进行文件读写,使用requests模块进行文件发送。
def pay_task_by_self(self):
global success_writer, fail_writer, cont
dir_path = os.path.dirname(__file__)
file_path = os.path.join(dir_path, 'test.csv')
fail_path = os.path.join(dir_path, 'fail_pay.csv')
success_path = os.path.join(dir_path, 'success_pay.csv')
with open(file_path, 'r') as f:
reader = csv.reader(f)
next(reader)
# 打开文件对象
fail_file = open(fail_path, 'w', newline='')
fail_flag = True
success_file = open(success_path, 'w', newline='')
success_flag = True
for row in reader:
# 提取文件内的信息
data = dict(mch_no=WHALE_BANK_MCH,)
# data['out_merchant_pay_no'] = row[0]
data['out_merchant_pay_no'] = str(uuid.uuid4()).replace('-', '')
data['card_no'] = row[1]
data['coin'] = row[2]
data['amount'] = row[3]
data['merchant_pay_desc'] = row[4]
user = Assets.objects.filter(card_no=row[1]).first().user
# 请求支付接口
res = self._request(user=user, url=WHALE_BANK_PAY_URL, data=data, method=RequestResponseMethod.PAY)
res['data'] = data
counter = 1
# 代付失败
if res.get('result_code') != WhaleBankResultCode.OK:
print('FAIL-错误信息:' + res['err_msg'])
cont = 'y'
# 支付失败继续支付,可设置失败n次之后选择是否继续支付
while res.get('result_code') != WhaleBankResultCode.OK:
print('卡号:%s的第%s次代付失败...正在重新支付...' % (data['card_no'], counter))
# 第一次写入文件失败字段
if fail_flag:
fail_header = [k for k in res]
fail_writer = csv.DictWriter(fail_file, fieldnames=fail_header)
fail_writer.writeheader()
fail_flag = False
fail_writer.writerow(res)
# 支付失败后重新请求
data.pop('sign')
res = self._request(user=user, url=WHALE_BANK_PAY_URL, data=data, method=RequestResponseMethod.PAY)
res['data'] = data
time.sleep(1)
counter += 1
# 达到n次失败后选择是否继续支付
if counter == 4:
cont = input('失败已达%s次,是否继续?(y/n)' % (counter-1))
if cont == 'y':
pass
else:
break
if cont == 'n':
print('%s取消支付!' % data['card_no'])
else:
print('%s支付成功!' % data['card_no'])
# 代付成功
else:
print('SUCCESS\n支付成功!')
# 第一次写入文件成功字段
if success_flag:
success_header = [k for k in res]
success_writer = csv.DictWriter(success_file, fieldnames=success_header)
success_writer.writeheader()
success_flag = False
success_writer.writerow(res)
time.sleep(0.5)
yield res
# 关闭文件对象
fail_file.close()
success_file.close()
print('批量代付完成!')
注意:open打开一个文件之后,使用read()方法会读取出对象中的信息,再次使用read()读取会返回空的字符串。
运行结果:
SUCCESS
支付成功!
>>>>>>>>>>>>>>>>>>>>>>>>>
SUCCESS
支付成功!
>>>>>>>>>>>>>>>>>>>>>>>>>
SUCCESS
支付成功!
>>>>>>>>>>>>>>>>>>>>>>>>>
FAIL-错误信息:用户卡号错误
卡号:1000000000483907的第1次代付失败...正在重新支付...
卡号:1000000000483907的第2次代付失败...正在重新支付...
卡号:1000000000483907的第3次代付失败...正在重新支付...
失败已达3次,是否继续?(y/n)n
1000000000483907取消支付!
>>>>>>>>>>>>>>>>>>>>>>>>>
批量代付完成!