__init__.py 3.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. # -*- coding: utf-8 -*-
  2. # !/usr/bin/env python
  3. import logging
  4. from django.http import HttpResponse
  5. from typing import TYPE_CHECKING
  6. from apilib.utils_sys import memcache_lock
  7. from apps.web.core.payment import PaymentGateway
  8. if TYPE_CHECKING:
  9. from django.core.handlers.wsgi import WSGIRequest
  10. from apps.web.common.transaction.pay import RefundRecordT, RechargeRecordT
  11. logger = logging.getLogger(__name__)
  12. class RefundNotifier(object):
  13. """
  14. 退款通知基类
  15. 退款通知主要负责处理三件事情
  16. 1. 接收数据、解密数据并校验数据的有效性(时效性以及正确性)
  17. 2. 对于第三方机构进行回复 (外层函数根据是否抛出异常以及异常状态 执行相应的回复策略)
  18. 3. 相关联订单的状态 信息进行修改、补充、完成 (do 函数执行)
  19. """
  20. def __init__(self, request, refund_order_getter):
  21. self.payload = self.parse_request(request)
  22. self.refund_order_getter = refund_order_getter
  23. def parse_request(self, request): # type:(WSGIRequest) -> dict
  24. """ 从wsgiRequest 中解析出加密数据 """
  25. raise NotImplementedError(u"需要实现")
  26. def verify_payload(self, payload): # type:(dict) -> bool
  27. """ 验证解密后的数据是否有效 """
  28. raise NotImplementedError(u"需要实现")
  29. def handle_refund_order(self, refundOrder, post_pay): # type:(RefundRecordT, callable) -> None
  30. """ 具体的处理订单的逻辑 根据回调中的成功与否决定下一步的走向"""
  31. raise NotImplementedError(u"需要实现")
  32. def do(self, post_pay):
  33. logger.debug(u"refundNotifier {} do work, payload = {}".format(self.__class__.__name__, self.payload))
  34. if not self.verify_payload(self.payload):
  35. logger.info(
  36. u"refundNotifier {} verify payload error, payload = {}".format(
  37. self.__class__.__name__, self.payload))
  38. return HttpResponse(self.successResponse)
  39. refundOrder = self.refund_order_getter(order_no = self.refund_order_no) # type: RefundRecordT
  40. if not refundOrder:
  41. logger.info(
  42. u"refundNotifier {} record not refund, payload = {}".format(self.__class__.__name__, self.payload))
  43. return HttpResponse(self.successResponse)
  44. with memcache_lock(key = str(refundOrder.id), value = 1, expire = 60) as acquired:
  45. if not acquired:
  46. logger.warning(u"refundNotifier {}, record = {}, not get lock key".format(
  47. self.__class__.__name__, refundOrder.id))
  48. return
  49. self.handle_refund_order(refundOrder, post_pay)
  50. return HttpResponse(self.successResponse)
  51. @property
  52. def successResponse(self): # type:() -> str
  53. """ 回复异步回调 告知成功处理 不需要再次重发 """
  54. raise NotImplementedError(u"需要实现")
  55. @property
  56. def errorResponse(self): # type:() -> str
  57. """ 回复异步回调 告知未成功处理 需要重发 """
  58. raise NotImplementedError(u"需要实现")
  59. @property
  60. def refund_order_no(self): # type: ()->str
  61. raise NotImplementedError(u"需要实现")
  62. class RefundPuller(object):
  63. """ 拉取退款单的详情 """
  64. def __init__(self, refundOrder): # type:(RefundRecordT) -> None
  65. self._refundOrder = refundOrder
  66. def pull(self, payGateWay, payOrder, post_pay): # type:(PaymentGateway, RechargeRecordT, callable) -> None
  67. raise NotImplementedError(u"需要实现")