# -*- coding: utf-8 -*- # !/usr/bin/env python import datetime import logging import os import sys PROJECT_ROOT = os.path.join(os.path.abspath(os.path.split(os.path.realpath(__file__))[0] + "/.."), '..') sys.path.insert(0, PROJECT_ROOT) from script.base import init_env os.environ["DJANGO_SETTINGS_MODULE"] = "configs.production_local" init_env(False) from apps.web.user.models import RechargeRecord, RefundMoneyRecord from apps.web.core.payment import PaymentGateway from apps.web.common.transaction.pay import PayManager, PayRecordPoller, PayNotifyAction from apilib.monetary import RMB, VirtualCoin from apps.web.user.transaction_deprecated import refund_cash REPAIR = False # false 的情况下 只输入记录 不对任何记录进行修改 LEFT_TIME = datetime.datetime.strptime("2022-04-01 00:00:00", "%Y-%m-%d %H:%M:%S") # 修复记录的起始时间 RIGHT_TIME = datetime.datetime.strptime("2022-04-02 00:00:00", "%Y-%m-%d %H:%M:%S") # 修复记录的结束时间 RECHARGE_NO = '20220425121623PQ0000000005483RKJ' logger = logging.getLogger(__name__) def unpay_post_pay(record): # type:(RechargeRecord)->None # 不分账也是说明已经完成分账动作 record.set_ledgered() refund_order = refund_cash(record, RMB(record.money), VirtualCoin(0)) # type: RefundMoneyRecord if not refund_order: logger.error('refund for order failure.'.format(str(record.id))) def get_records(): if RECHARGE_NO: filters = {"orderNo": RECHARGE_NO, 'result': RechargeRecord.PayResult.UNPAY} else: filters = { "dateTimeAdded__gte": LEFT_TIME, "dateTimeAdded__lt": RIGHT_TIME, "result": RechargeRecord.PayResult.UNPAY, } records = RechargeRecord.objects.filter( **filters ) return records def do_unpay_record(record): payment_gateway = PaymentGateway.from_gateway_key( record.gateway, record.payGatewayKey, record.payAppType) # 根据支付方式不通拿到不同的请求实例 pollCls = PayManager().get_poller(pay_app_type=payment_gateway.pay_app_type) poll = pollCls( record_id=str(record.id), interval=False, total_count=1, record_cls=RechargeRecord, post_pay=unpay_post_pay ) # type: PayRecordPoller if REPAIR: poll.start() else: payment_gateway = PaymentGateway.from_gateway_key( record.gateway, record.payGatewayKey, record.payAppType) action, result = poll.action_of_pay(payment_gateway, record) if action == PayNotifyAction.NeedHandle: print 'record need to do.'.format(str(record.id), record.orderNo) def run(): records = get_records() for record in records: # type: RechargeRecord # 去第三方查询 支付结果 do_unpay_record(record) if __name__ == '__main__': run()