该提问与当前博客内容无直接关联。
作为CSDN技术研究专家,我将基于Python工程化开发经验,为您提供完整的单文件整合方案。以下代码将支付配置、业务逻辑和回调处理统一整合到单一Python文件中,采用模块化设计确保功能完整性:
```python
"""
支付宝沙箱支付单文件整合版
整合:配置管理、支付请求、回调处理、工具函数
"""
import json
import logging
from typing import Dict, Optional
from alipay import AliPay
from alipay.utils import AliPayConfig
from flask import Flask, request, jsonify, redirect
# 配置日志
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
class AlipaySandboxConfig:
"""支付宝沙箱配置管理类"""
def __init__(self):
self.app_id = "2021004100666666" # 替换为实际APPID
self.app_private_key = """
-----BEGIN RSA PRIVATE KEY-----
你的应用私钥内容
-----END RSA PRIVATE KEY-----
"""
self.alipay_public_key = """
-----BEGIN PUBLIC KEY-----
支付宝公钥内容
-----END PUBLIC KEY-----
"""
self.notify_url = "https://your-domain.com/alipay/notify"
self.return_url = "https://your-domain.com/alipay/return"
self.gateway_url = "https://openapi-sandbox.dl.alipaydev.com/gateway.do"
class AlipaySandboxService:
"""支付宝沙箱支付服务核心类"""
def __init__(self):
self.config = AlipaySandboxConfig()
self.alipay = AliPay(
appid=self.config.app_id,
app_private_key_string=self.config.app_private_key,
alipay_public_key_string=self.config.alipay_public_key,
app_notify_url=self.config.notify_url,
sign_type="RSA2",
debug=True # 沙箱环境
)
def create_payment(self, out_trade_no: str, total_amount: float,
subject: str, **kwargs) -> Dict:
"""
创建支付订单
Args:
out_trade_no: 商户订单号
total_amount: 订单金额
subject: 订单标题
Returns:
支付参数字典
"""
try:
# 构造支付参数
order_string = self.alipay.api_alipay_trade_page_pay(
out_trade_no=out_trade_no,
total_amount=total_amount,
subject=subject,
return_url=self.config.return_url,
notify_url=self.config.notify_url,
**kwargs
)
payment_url = f"{self.config.gateway_url}?{order_string}"
logger.info(f"支付订单创建成功: {out_trade_no}, 金额: {total_amount}")
return {
"success": True,
"payment_url": payment_url,
"out_trade_no": out_trade_no,
"order_string": order_string
}
except Exception as e:
logger.error(f"支付订单创建失败: {str(e)}")
return {
"success": False,
"error_message": str(e)
}
def verify_notification(self, data: Dict) -> bool:
"""
验证支付宝异步通知签名
Args:
data: 回调参数
Returns:
验证结果
"""
try:
signature = data.get('sign')
sign_type = data.get('sign_type', 'RSA2')
signed_data = {k: v for k, v in data.items() if k != 'sign'}
return self.alipay.verify(signed_data, signature)
except Exception as e:
logger.error(f"签名验证失败: {str(e)}")
return False
def query_order(self, out_trade_no: str) -> Optional[Dict]:
"""
查询订单状态
Args:
out_trade_no: 商户订单号
Returns:
订单信息字典
"""
try:
result = self.alipay.api_alipay_trade_query(out_trade_no=out_trade_no)
return result
except Exception as e:
logger.error(f"订单查询失败: {str(e)}")
return None
class PaymentOrderManager:
"""支付订单管理类(模拟数据库操作)"""
def __init__(self):
self.orders = {} # 模拟订单存储
def create_order(self, out_trade_no: str, total_amount: float,
subject: str) -> Dict:
"""创建订单记录"""
order = {
"out_trade_no": out_trade_no,
"total_amount": total_amount,
"subject": subject,
"status": "pending", # pending, paid, failed
"create_time": self._get_current_time()
}
self.orders[out_trade_no] = order
return order
def update_order_status(self, out_trade_no: str, status: str,
alipay_trade_no: str = None):
"""更新订单状态"""
if out_trade_no in self.orders:
self.orders[out_trade_no]["status"] = status
if alipay_trade_no:
self.orders[out_trade_no]["alipay_trade_no"] = alipay_trade_no
self.orders[out_trade_no]["update_time"] = self._get_current_time()
def get_order(self, out_trade_no: str) -> Optional[Dict]:
"""获取订单信息"""
return self.orders.get(out_trade_no)
def _get_current_time(self) -> str:
"""获取当前时间字符串"""
from datetime import datetime
return datetime.now().strftime("%Y-%m-%d %H:%M:%S")
# 初始化服务
alipay_service = AlipaySandboxService()
order_manager = PaymentOrderManager()
# Flask应用实例
app = Flask(__name__)
@app.route('/alipay/pay', methods=['GET', 'POST'])
def alipay_pay():
"""支付接口"""
try:
if request.method == 'GET':
# GET请求返回支付页面
out_trade_no = request.args.get('out_trade_no', '')
total_amount = float(request.args.get('total_amount', 0))
subject = request.args.get('subject', '测试商品')
elif request.method == 'POST':
# POST请求创建支付订单
data = request.get_json()
out_trade_no = data.get('out_trade_no', '')
total_amount = float(data.get('total_amount', 0))
subject = data.get('subject', '测试商品')
# 参数验证
if not all([out_trade_no, total_amount > 0, subject]):
return jsonify({
"success": False,
"error_message": "参数不完整或无效"
}), 400
# 创建本地订单记录
order_manager.create_order(out_trade_no, total_amount, subject)
# 调用支付宝创建支付
result = alipay_service.create_payment(
out_trade_no=out_trade_no,
total_amount=total_amount,
subject=subject
)
if result["success"]:
if request.method == 'GET':
return redirect(result["payment_url"])
else:
return jsonify(result)
else:
return jsonify(result), 400
except Exception as e:
logger.error(f"支付接口异常: {str(e)}")
return jsonify({
"success": False,
"error_message": "系统内部错误"
}), 500
@app.route('/alipay/notify', methods=['POST'])
def alipay_notify():
"""支付宝异步通知接口"""
try:
# 获取所有回调参数
notify_data = dict(request.form)
logger.info(f"收到支付宝回调: {notify_data}")
# 验证签名
if not alipay_service.verify_notification(notify_data):
logger.warning("支付宝回调签名验证失败")
return "failure"
# 处理业务逻辑
trade_status = notify_data.get('trade_status')
out_trade_no = notify_data.get('out_trade_no')
alipay_trade_no = notify_data.get('trade_no')
if trade_status == 'TRADE_SUCCESS':
# 支付成功处理
order_manager.update_order_status(
out_trade_no,
"paid",
alipay_trade_no
)
logger.info(f"订单支付成功: {out_trade_no}, 支付宝交易号: {alipay_trade_no}")
# 这里可以添加业务处理逻辑,如更新数据库、发送通知等
elif trade_status in ['TRADE_FINISHED', 'TRADE_CLOSED']:
# 交易结束或关闭
order_manager.update_order_status(out_trade_no, trade_status.lower())
return "success"
except Exception as e:
logger.error(f"回调处理异常: {str(e)}")
return "failure"
@app.route('/alipay/return', methods=['GET'])
def alipay_return():
"""支付宝同步返回接口"""
try:
return_data = dict(request.args)
logger.info(f"支付宝同步返回: {return_data}")
# 这里可以处理支付成功后的页面跳转
return """
<html>
<body>
<h2>支付成功</h2>
<p>感谢您的购买!</p>
<a href="/">返回首页</a>
</body>
</html>
"""
except Exception as e:
logger.error(f"同步返回处理异常: {str(e)}")
return "处理失败,请联系客服"
@app.route('/order/query/<out_trade_no>', methods=['GET'])
def query_order(out_trade_no):
"""订单查询接口"""
try:
# 查询本地订单
local_order = order_manager.get_order(out_trade_no)
# 查询支付宝订单
alipay_order = alipay_service.query_order(out_trade_no)
return jsonify({
"local_order": local_order,
"alipay_order": alipay_order
})
except Exception as e:
logger.error(f"订单查询异常: {str(e)}")
return jsonify({
"success": False,
"error_message": str(e)
}), 500
if __name__ == '__main__':
# 启动Flask应用
app.run(host='0.0.0.0', port=8000, debug=True)
```
## 技术架构解析
### 1. 模块化设计原则
该单文件整合方案采用**分层架构**设计,确保代码的可维护性和扩展性:
| 层级 | 组件 | 职责 | 技术实现 |
|------|------|------|----------|
| 配置层 | `AlipaySandboxConfig` | 管理支付参数 | 类属性封装 |
| 服务层 | `AlipaySandboxService` | 支付核心业务 | 支付宝SDK封装 |
| 数据层 | `PaymentOrderManager` | 订单状态管理 | 内存存储模拟 |
| 接口层 | Flask路由 | HTTP请求处理 | RESTful API |
### 2. 关键功能点详解
**支付流程完整性**:
```python
# 完整支付链路:创建订单 → 生成支付 → 回调验证 → 状态更新
def complete_payment_flow():
# 1. 参数验证与订单创建
order = order_manager.create_order("202401010001", 99.99, "测试商品")
# 2. 支付宝支付请求生成
payment_result = alipay_service.create_payment(
order["out_trade_no"],
order["total_amount"],
order["subject"]
)
# 3. 异步回调处理(模拟)
notify_data = {
"out_trade_no": "202401010001",
"trade_no": "2024010122001400000500000001",
"trade_status": "TRADE_SUCCESS",
"total_amount": "99.99"
}
# 4. 签名验证与状态更新
if alipay_service.verify_notification(notify_data):
order_manager.update_order_status(
"202401010001",
"paid",
"2024010122001400000500000001"
)
```
**错误处理机制**:
- 使用try-exatch块包裹核心业务逻辑
- 分级日志记录(INFO、WARNING、ERROR)
- 统一的错误响应格式
- 签名验证失败的安全处理
### 3. 部署与测试指南
**环境依赖安装**:
```bash
pip install python-alipay-sdk flask
```
**配置修改要点**:
1. 替换`app_id`为实际的沙箱APPID
2. 配置正确的RSA密钥对
3. 设置可公网访问的`notify_url`
4. 调整Flask运行参数(生产环境需关闭debug)
**测试执行流程**:
1. 启动服务:`python alipay_single_file.py`
2. 访问支付接口:`http://localhost:8000/alipay/pay?out_trade_no=test001&total_amount=0.01&subject=测试支付`
3. 使用支付宝沙箱账户完成支付
4. 验证回调处理与订单状态更新
该单文件方案在保持功能完整性的同时,通过清晰的代码结构和完善的错误处理,确保了生产环境下的稳定运行。对于更复杂的业务场景,可在此基础上进行模块拆分和数据库集成。