- 在支付宝同步回调(payment_return)中添加详细日志记录 - 添加同步回调缺少签名参数的错误处理 - 同步回调中移除sign和sign_type再进行签名验证 - 同步回调异常捕获,返回500错误并记录详细异常信息 - 在支付宝异步通知(payment_notify)中添加详细日志记录 - 异步通知缺少签名参数时返回fail并记录错误日志 - 异步通知验证签名失败或交易状态异常时返回fail并记录错误日志 - 异步通知中增加已处理订单状态跳过处理并返回success的逻辑 - 异步通知异常捕获时回滚数据库事务并返回fail - 支付宝服务(AlipayService)的签名验证方法增加日志记录和异常捕获 - 签名验证时移除不参与验证的sign和sign_type字段,防止验证错误
166 lines
5.2 KiB
Python
166 lines
5.2 KiB
Python
#!/usr/bin/env python
|
|
# -*- coding: utf-8 -*-
|
|
"""
|
|
支付宝签名验证测试脚本
|
|
用于诊断支付宝回调验证失败的问题
|
|
"""
|
|
|
|
from alipay import AliPay
|
|
from config import Config
|
|
import logging
|
|
|
|
# 配置日志
|
|
logging.basicConfig(
|
|
level=logging.DEBUG,
|
|
format='[%(asctime)s] %(levelname)s - %(message)s'
|
|
)
|
|
logger = logging.getLogger(__name__)
|
|
|
|
def test_alipay_config():
|
|
"""测试支付宝配置是否正确"""
|
|
print("="*60)
|
|
print("支付宝配置信息检查")
|
|
print("="*60)
|
|
|
|
config = Config()
|
|
|
|
print(f"AppID: {config.ALIPAY_APP_ID}")
|
|
print(f"调试模式: {config.ALIPAY_DEBUG}")
|
|
print(f"回调地址: {config.ALIPAY_RETURN_URL}")
|
|
print(f"异步通知地址: {config.ALIPAY_NOTIFY_URL}")
|
|
print(f"应用私钥长度: {len(config.ALIPAY_APP_PRIVATE_KEY)}")
|
|
print(f"支付宝公钥长度: {len(config.ALIPAY_PUBLIC_KEY)}")
|
|
|
|
# 检查密钥格式
|
|
if "BEGIN RSA PRIVATE KEY" in config.ALIPAY_APP_PRIVATE_KEY:
|
|
print("✓ 应用私钥格式正确")
|
|
else:
|
|
print("✗ 应用私钥格式错误")
|
|
|
|
if "BEGIN PUBLIC KEY" in config.ALIPAY_PUBLIC_KEY:
|
|
print("✓ 支付宝公钥格式正确")
|
|
else:
|
|
print("✗ 支付宝公钥格式错误")
|
|
|
|
print("\n")
|
|
|
|
def test_alipay_client():
|
|
"""测试支付宝客户端初始化"""
|
|
print("="*60)
|
|
print("支付宝客户端初始化测试")
|
|
print("="*60)
|
|
|
|
config = Config()
|
|
|
|
try:
|
|
alipay = AliPay(
|
|
appid=config.ALIPAY_APP_ID,
|
|
app_notify_url=config.ALIPAY_NOTIFY_URL,
|
|
app_private_key_string=config.ALIPAY_APP_PRIVATE_KEY,
|
|
alipay_public_key_string=config.ALIPAY_PUBLIC_KEY,
|
|
sign_type="RSA2",
|
|
debug=config.ALIPAY_DEBUG
|
|
)
|
|
print("✓ 支付宝客户端初始化成功")
|
|
return alipay
|
|
except Exception as e:
|
|
print(f"✗ 支付宝客户端初始化失败: {str(e)}")
|
|
logger.error("客户端初始化失败", exc_info=True)
|
|
return None
|
|
|
|
def test_signature_verification():
|
|
"""测试签名验证功能"""
|
|
print("\n")
|
|
print("="*60)
|
|
print("签名验证功能测试")
|
|
print("="*60)
|
|
|
|
alipay = test_alipay_client()
|
|
if not alipay:
|
|
return
|
|
|
|
# 模拟支付宝回调数据(这是一个示例,需要替换为真实的回调数据)
|
|
test_data = {
|
|
"gmt_create": "2024-01-01 00:00:00",
|
|
"charset": "utf-8",
|
|
"seller_email": "test@example.com",
|
|
"subject": "测试订单",
|
|
"sign_type": "RSA2",
|
|
"buyer_id": "2088000000000000",
|
|
"invoice_amount": "10.00",
|
|
"notify_id": "test_notify_id",
|
|
"fund_bill_list": "[{\"amount\":\"10.00\",\"fundChannel\":\"ALIPAYACCOUNT\"}]",
|
|
"notify_type": "trade_status_sync",
|
|
"trade_status": "TRADE_SUCCESS",
|
|
"receipt_amount": "10.00",
|
|
"buyer_pay_amount": "10.00",
|
|
"app_id": Config().ALIPAY_APP_ID,
|
|
"notify_time": "2024-01-01 00:00:00",
|
|
"point_amount": "0.00",
|
|
"total_amount": "10.00",
|
|
"seller_id": "2088000000000000",
|
|
"trade_no": "2024010100000000000",
|
|
"auth_app_id": Config().ALIPAY_APP_ID,
|
|
"buyer_logon_id": "test***@example.com",
|
|
"out_trade_no": "test_order_123456"
|
|
}
|
|
|
|
# 注意: 这里无法进行真实的签名验证测试,因为需要真实的签名值
|
|
print("提示: 需要真实的支付宝回调数据才能进行完整测试")
|
|
print("请在日志中查看实际回调时的数据和签名")
|
|
print("\n")
|
|
|
|
def print_troubleshooting_guide():
|
|
"""打印故障排查指南"""
|
|
print("="*60)
|
|
print("支付宝验证失败常见问题排查")
|
|
print("="*60)
|
|
print("""
|
|
1. 密钥配置问题:
|
|
- 确认应用私钥和支付宝公钥是否匹配
|
|
- 检查密钥格式是否包含完整的BEGIN/END标记
|
|
- 确认沙箱环境/正式环境的配置一致性
|
|
|
|
2. 签名验证问题:
|
|
- 确认签名类型为RSA2
|
|
- 检查是否正确移除了sign和sign_type参数
|
|
- 验证参数顺序和编码格式
|
|
|
|
3. 环境配置问题:
|
|
- ALIPAY_DEBUG设置: True=沙箱环境, False=正式环境
|
|
- 回调地址必须是外网可访问的地址
|
|
- 检查防火墙/端口是否开放
|
|
|
|
4. 调试建议:
|
|
- 开启详细日志,查看完整的回调参数
|
|
- 使用支付宝开放平台的"验签工具"验证签名
|
|
- 检查服务器时间是否准确
|
|
- 确认订单金额格式正确(字符串类型,保留两位小数)
|
|
|
|
5. 沙箱环境测试:
|
|
- 确保使用沙箱环境的AppID和密钥
|
|
- 使用沙箱账号进行测试
|
|
- 沙箱环境域名: https://openapi-sandbox.dl.alipaydev.com/gateway.do
|
|
|
|
6. 查看日志:
|
|
- 检查 logs/system.log 文件
|
|
- 查看控制台输出的详细错误信息
|
|
- 分析支付宝返回的错误码和错误信息
|
|
""")
|
|
print("="*60)
|
|
|
|
if __name__ == "__main__":
|
|
print("\n支付宝签名验证诊断工具\n")
|
|
|
|
# 运行测试
|
|
test_alipay_config()
|
|
test_alipay_client()
|
|
test_signature_verification()
|
|
print_troubleshooting_guide()
|
|
|
|
print("\n测试完成!")
|
|
print("如果仍然有问题,请:")
|
|
print("1. 运行实际支付流程并查看日志")
|
|
print("2. 复制日志中的回调数据和签名")
|
|
print("3. 使用支付宝官方验签工具验证\n")
|