#!/usr/bin/env python # -*- coding: utf-8 -*- """ 支付成功异步回调处理模块 当用户支付成功后,支付平台会把订单支付信息异步请求到回调接口 """ import json import asyncio from .api import YsmPayApi class PaymentNotify: """支付通知处理类""" def __init__(self, appid, appsecret): """ 初始化 Args: appid: 支付通道ID appsecret: 密钥 """ self.appid = appid self.appsecret = appsecret async def process(self, request_data): """ 处理支付通知(异步) Args: request_data: 请求数据(字符串或字典) Returns: tuple: (是否成功, 消息) """ # 解析请求数据 if isinstance(request_data, str): try: data = json.loads(request_data) except: return False, "数据格式错误" else: data = request_data # 验证签名 calc_hash = YsmPayApi.hash_sign(data, self.appsecret) if data.get('hash') != calc_hash: return False, "验签失败,签名错误" # 获取商户订单号 mch_orderid = data.get('mch_orderid') # 处理支付结果 if data.get('state') == 'SUCCESS': # 在这里处理订单业务逻辑 # 注意:平台可能会多次调用本接口,请确保订单不会被重复处理 # 示例:订单处理逻辑,这里可以使用异步数据库操作 """ order = await find_order_by_id(mch_orderid) if order and order.status != 'paid': await update_order_status(mch_orderid, 'paid') # 其他业务逻辑... """ return True, "success" else: # 处理未支付的情况 return False, "订单未支付" # FastAPI Web应用示例 """ from fastapi import FastAPI, Request, Response from fastapi.responses import JSONResponse app = FastAPI() @app.post("/notify") async def payment_notify(request: Request): # 配置信息 appid = '20********' # 支付通道ID appsecret = 'e605ac7******************4af5164' # AppSecret # 创建通知处理器 notify_handler = PaymentNotify(appid, appsecret) # 获取请求数据 request_data = await request.body() # 处理通知 success, message = await notify_handler.process(request_data) if success: return Response(content=message) else: return JSONResponse(content={"error": message}, status_code=400) # 启动命令: uvicorn notify:app --reload """