repaired_unpay.py 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. # -*- coding: utf-8 -*-
  2. # !/usr/bin/env python
  3. import datetime
  4. import logging
  5. import os
  6. import sys
  7. PROJECT_ROOT = os.path.join(os.path.abspath(os.path.split(os.path.realpath(__file__))[0] + "/.."), '..')
  8. sys.path.insert(0, PROJECT_ROOT)
  9. from script.base import init_env
  10. os.environ["DJANGO_SETTINGS_MODULE"] = "configs.production_local"
  11. init_env(False)
  12. from apps.web.user.models import RechargeRecord, RefundMoneyRecord
  13. from apps.web.core.payment import PaymentGateway
  14. from apps.web.common.transaction.pay import PayManager, PayRecordPoller, PayNotifyAction
  15. from apilib.monetary import RMB, VirtualCoin
  16. from apps.web.user.transaction_deprecated import refund_cash
  17. REPAIR = False # false 的情况下 只输入记录 不对任何记录进行修改
  18. LEFT_TIME = datetime.datetime.strptime("2022-04-01 00:00:00", "%Y-%m-%d %H:%M:%S") # 修复记录的起始时间
  19. RIGHT_TIME = datetime.datetime.strptime("2022-04-02 00:00:00", "%Y-%m-%d %H:%M:%S") # 修复记录的结束时间
  20. RECHARGE_NO = '20220425121623PQ0000000005483RKJ'
  21. logger = logging.getLogger(__name__)
  22. def unpay_post_pay(record):
  23. # type:(RechargeRecord)->None
  24. # 不分账也是说明已经完成分账动作
  25. record.set_ledgered()
  26. refund_order = refund_cash(record, RMB(record.money), VirtualCoin(0)) # type: RefundMoneyRecord
  27. if not refund_order:
  28. logger.error('refund for order<id={}> failure.'.format(str(record.id)))
  29. def get_records():
  30. if RECHARGE_NO:
  31. filters = {"orderNo": RECHARGE_NO, 'result': RechargeRecord.PayResult.UNPAY}
  32. else:
  33. filters = {
  34. "dateTimeAdded__gte": LEFT_TIME,
  35. "dateTimeAdded__lt": RIGHT_TIME,
  36. "result": RechargeRecord.PayResult.UNPAY,
  37. }
  38. records = RechargeRecord.objects.filter(
  39. **filters
  40. )
  41. return records
  42. def do_unpay_record(record):
  43. payment_gateway = PaymentGateway.from_gateway_key(
  44. record.gateway,
  45. record.payGatewayKey,
  46. record.payAppType)
  47. # 根据支付方式不通拿到不同的请求实例
  48. pollCls = PayManager().get_poller(pay_app_type=payment_gateway.pay_app_type)
  49. poll = pollCls(
  50. record_id=str(record.id),
  51. interval=False,
  52. total_count=1,
  53. record_cls=RechargeRecord,
  54. post_pay=unpay_post_pay
  55. ) # type: PayRecordPoller
  56. if REPAIR:
  57. poll.start()
  58. else:
  59. payment_gateway = PaymentGateway.from_gateway_key(
  60. record.gateway,
  61. record.payGatewayKey,
  62. record.payAppType)
  63. action, result = poll.action_of_pay(payment_gateway, record)
  64. if action == PayNotifyAction.NeedHandle:
  65. print 'record<id={},order={}> need to do.'.format(str(record.id), record.orderNo)
  66. def run():
  67. records = get_records()
  68. for record in records: # type: RechargeRecord
  69. # 去第三方查询 支付结果
  70. do_unpay_record(record)
  71. if __name__ == '__main__':
  72. run()