12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091 |
- # -*- coding: utf-8 -*-
- # !/usr/bin/env python
- import logging
- from django.http import HttpResponse
- from typing import TYPE_CHECKING
- from apilib.utils_sys import memcache_lock
- from apps.web.core.payment import PaymentGateway
- if TYPE_CHECKING:
- from django.core.handlers.wsgi import WSGIRequest
- from apps.web.common.transaction.pay import RefundRecordT, RechargeRecordT
- logger = logging.getLogger(__name__)
- class RefundNotifier(object):
- """
- 退款通知基类
- 退款通知主要负责处理三件事情
- 1. 接收数据、解密数据并校验数据的有效性(时效性以及正确性)
- 2. 对于第三方机构进行回复 (外层函数根据是否抛出异常以及异常状态 执行相应的回复策略)
- 3. 相关联订单的状态 信息进行修改、补充、完成 (do 函数执行)
- """
- def __init__(self, request, refund_order_getter):
- self.payload = self.parse_request(request)
- self.refund_order_getter = refund_order_getter
- def parse_request(self, request): # type:(WSGIRequest) -> dict
- """ 从wsgiRequest 中解析出加密数据 """
- raise NotImplementedError(u"需要实现")
- def verify_payload(self, payload): # type:(dict) -> bool
- """ 验证解密后的数据是否有效 """
- raise NotImplementedError(u"需要实现")
- def handle_refund_order(self, refundOrder, post_pay): # type:(RefundRecordT, callable) -> None
- """ 具体的处理订单的逻辑 根据回调中的成功与否决定下一步的走向"""
- raise NotImplementedError(u"需要实现")
- def do(self, post_pay):
- logger.debug(u"refundNotifier {} do work, payload = {}".format(self.__class__.__name__, self.payload))
- if not self.verify_payload(self.payload):
- logger.info(
- u"refundNotifier {} verify payload error, payload = {}".format(
- self.__class__.__name__, self.payload))
- return HttpResponse(self.successResponse)
- refundOrder = self.refund_order_getter(order_no = self.refund_order_no) # type: RefundRecordT
- if not refundOrder:
- logger.info(
- u"refundNotifier {} record not refund, payload = {}".format(self.__class__.__name__, self.payload))
- return HttpResponse(self.successResponse)
- with memcache_lock(key = str(refundOrder.id), value = 1, expire = 60) as acquired:
- if not acquired:
- logger.warning(u"refundNotifier {}, record = {}, not get lock key".format(
- self.__class__.__name__, refundOrder.id))
- return
- self.handle_refund_order(refundOrder, post_pay)
- return HttpResponse(self.successResponse)
- @property
- def successResponse(self): # type:() -> str
- """ 回复异步回调 告知成功处理 不需要再次重发 """
- raise NotImplementedError(u"需要实现")
- @property
- def errorResponse(self): # type:() -> str
- """ 回复异步回调 告知未成功处理 需要重发 """
- raise NotImplementedError(u"需要实现")
- @property
- def refund_order_no(self): # type: ()->str
- raise NotImplementedError(u"需要实现")
- class RefundPuller(object):
- """ 拉取退款单的详情 """
- def __init__(self, refundOrder): # type:(RefundRecordT) -> None
- self._refundOrder = refundOrder
- def pull(self, payGateWay, payOrder, post_pay): # type:(PaymentGateway, RechargeRecordT, callable) -> None
- raise NotImplementedError(u"需要实现")
|