# -*- 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"需要实现")