alipay.py 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. # -*- coding: utf-8 -*-
  2. # !/usr/bin/env python
  3. import datetime
  4. import logging
  5. from typing import TYPE_CHECKING, Dict
  6. from apps.web.common.transaction.refund import RefundNotifier, RefundPuller
  7. if TYPE_CHECKING:
  8. from django.core.handlers.wsgi import WSGIRequest
  9. from apps.web.core.payment import PaymentGatewayT
  10. from apps.web.common.transaction.pay import RechargeRecordT, RefundRecordT
  11. logger = logging.getLogger(__name__)
  12. class AliRefundNotifier(RefundNotifier):
  13. def parse_request(self, request): # type:(WSGIRequest) -> Dict
  14. return request.POST.dict() # type: Dict
  15. @property
  16. def refund_order_no(self): # type:() -> str
  17. return self.payload['out_biz_no']
  18. def handle_refund_order(self, refundOrder, post_pay): # type:(RefundRecordT, callable) -> None
  19. """
  20. 只有成功的退款 才会走异步的回调
  21. """
  22. refundTime = self.payload["gmt_refund"]
  23. datetimeRefund = datetime.datetime.strptime(refundTime[: 19], "%Y-%m-%d %H:%M:%S")
  24. matched = refundOrder.succeed(tradeRefundNo = None, finishedTime = datetimeRefund)
  25. if not matched:
  26. return
  27. return post_pay(refundOrder, datetimeRefund)
  28. @property
  29. def errorResponse(self): # type:() -> str
  30. return "error"
  31. @property
  32. def successResponse(self): # type:() -> str
  33. return "success"
  34. def verify_payload(self, payload): # type:(dict) -> bool
  35. return True
  36. class AliRefundPuller(RefundPuller):
  37. def pull(self, payGateWay, payOrder, post_pay): # type:(PaymentGatewayT, RechargeRecordT, callable) -> None
  38. result = payGateWay.api_refund_query(
  39. trade_no = payOrder.wxOrderNo, out_trade_no = payOrder.orderNo, out_request_no = self._refundOrder.orderNo)
  40. if result["code"] != "10000" or result["msg"] != "Success" or result["refund_status"] != "REFUND_SUCCESS":
  41. logger.info(
  42. "RefundPuller {} pull refund order {}, result code = {}, msg = {}".format(
  43. self.__class__.__name__, self._refundOrder, result["code"], result["msg"]))
  44. return
  45. # 对于支付宝来说, 查询的时候通知的时间并没有显示出来, 就用查询的时间代理
  46. gmt_refund_pay = result["gmt_refund_pay"]
  47. datetimeRefund = datetime.datetime.strptime(gmt_refund_pay, "%Y-%m-%d %H:%M:%S")
  48. matched = self._refundOrder.succeed(tradeRefundNo = None, finishedTime = datetimeRefund)
  49. if not matched:
  50. return
  51. post_pay(self._refundOrder, datetimeRefund)