- 在支付宝同步回调(payment_return)中添加详细日志记录 - 添加同步回调缺少签名参数的错误处理 - 同步回调中移除sign和sign_type再进行签名验证 - 同步回调异常捕获,返回500错误并记录详细异常信息 - 在支付宝异步通知(payment_notify)中添加详细日志记录 - 异步通知缺少签名参数时返回fail并记录错误日志 - 异步通知验证签名失败或交易状态异常时返回fail并记录错误日志 - 异步通知中增加已处理订单状态跳过处理并返回success的逻辑 - 异步通知异常捕获时回滚数据库事务并返回fail - 支付宝服务(AlipayService)的签名验证方法增加日志记录和异常捕获 - 签名验证时移除不参与验证的sign和sign_type字段,防止验证错误
163 lines
5.5 KiB
Python
163 lines
5.5 KiB
Python
#!/usr/bin/env python
|
||
# -*- coding: utf-8 -*-
|
||
"""
|
||
支付宝配置检查脚本
|
||
用于检查支付宝配置是否正确,不依赖虚拟环境
|
||
"""
|
||
|
||
import sys
|
||
import os
|
||
sys.path.append(os.path.dirname(os.path.abspath(__file__)))
|
||
|
||
def check_alipay_config():
|
||
"""检查支付宝配置"""
|
||
print("="*60)
|
||
print("支付宝配置检查")
|
||
print("="*60)
|
||
|
||
# 读取配置文件内容
|
||
config_path = os.path.join(os.path.dirname(__file__), 'config.py')
|
||
|
||
if not os.path.exists(config_path):
|
||
print("错误: config.py 文件不存在")
|
||
return False
|
||
|
||
with open(config_path, 'r', encoding='utf-8') as f:
|
||
config_content = f.read()
|
||
|
||
# 检查支付宝相关配置
|
||
required_configs = [
|
||
'ALIPAY_APP_ID',
|
||
'ALIPAY_APP_PRIVATE_KEY',
|
||
'ALIPAY_PUBLIC_KEY',
|
||
'ALIPAY_RETURN_URL',
|
||
'ALIPAY_NOTIFY_URL',
|
||
'ALIPAY_DEBUG'
|
||
]
|
||
|
||
print("检查必需的配置项:")
|
||
for config in required_configs:
|
||
if config in config_content:
|
||
print(f" ✓ {config}: 存在")
|
||
else:
|
||
print(f" ✗ {config}: 缺失")
|
||
|
||
# 提取并显示配置值(部分显示以保护安全)
|
||
import re
|
||
|
||
# 检查密钥格式
|
||
private_key_match = re.search(r'ALIPAY_APP_PRIVATE_KEY\s*=\s*"""(.*?)"""', config_content, re.DOTALL)
|
||
public_key_match = re.search(r'ALIPAY_PUBLIC_KEY\s*=\s*"""(.*?)"""', config_content, re.DOTALL)
|
||
|
||
if private_key_match:
|
||
private_key = private_key_match.group(1)
|
||
if "BEGIN RSA PRIVATE KEY" in private_key and "END RSA PRIVATE KEY" in private_key:
|
||
print(" ✓ 应用私钥格式正确")
|
||
else:
|
||
print(" ✗ 应用私钥格式错误")
|
||
else:
|
||
print(" ✗ 未找到应用私钥")
|
||
|
||
if public_key_match:
|
||
public_key = public_key_match.group(1)
|
||
if "BEGIN PUBLIC KEY" in public_key and "END PUBLIC KEY" in public_key:
|
||
print(" ✓ 支付宝公钥格式正确")
|
||
else:
|
||
print(" ✗ 支付宝公钥格式错误")
|
||
else:
|
||
print(" ✗ 未找到支付宝公钥")
|
||
|
||
# 检查调试模式
|
||
debug_match = re.search(r'ALIPAY_DEBUG\s*=\s*(True|False)', config_content)
|
||
if debug_match:
|
||
debug_mode = debug_match.group(1)
|
||
print(f" ✓ 调试模式: {debug_mode}")
|
||
if debug_mode == "False":
|
||
print(" 注意: 当前为正式环境模式,确保使用正式环境的密钥")
|
||
else:
|
||
print(" 提示: 当前为沙箱环境模式,适用于测试")
|
||
|
||
print("\n" + "="*60)
|
||
print("常见问题排查")
|
||
print("="*60)
|
||
print("""
|
||
1. 密钥配置问题:
|
||
- 确保应用私钥和支付宝公钥格式正确
|
||
- 检查BEGIN/END标签是否完整
|
||
- 确认沙箱/正式环境配置一致
|
||
|
||
2. 回调地址问题:
|
||
- 确保ALIPAY_RETURN_URL和ALIPAY_NOTIFY_URL可以公网访问
|
||
- 检查URL是否拼写正确
|
||
|
||
3. 签名算法:
|
||
- SDK默认使用RSA2算法
|
||
- 确保支付宝开放平台应用设置中也是RSA2
|
||
|
||
4. 对于同步回调400错误:
|
||
- 主要是签名验证失败
|
||
- 需要正确处理sign和sign_type参数
|
||
- 确保使用正确的公钥验证
|
||
|
||
5. 环境问题:
|
||
- 如果使用沙箱环境,确保使用沙箱的AppID和密钥
|
||
- 确保服务器时间准确
|
||
""")
|
||
|
||
return True
|
||
|
||
def analyze_callback_request():
|
||
"""分析提供的回调请求"""
|
||
print("\n" + "="*60)
|
||
print("回调请求分析")
|
||
print("="*60)
|
||
|
||
sample_request = "GET /payment/return?charset=utf-8&out_trade_no=20260114192935cfcf96&method=alipay.trade.page.pay.return&total_amount=5.00&sign=ksH8Nov1SA9U4fgovUXv%2BXxmZccCDaqVhPmm%2BAPlGL8QgMYWDN7NSqDQTDoVshe2agHT11rNuVEXuApE3lVOnBPPbUvUlyMdaWpx/0GlFBRS0tezfdUcCQsShOTj4YdKwa2K0bfoqQeStupG0LFVipsWiga9WIryFU5JWDK3lDOuaVLiw2gLFMemsz/Xg14UPQMWcmlyXVGYzeLYvNmVRbQQjnJL8m%2BFOq5tqMgopEtZmAC4wstIwm7n1kOrV%2Bs/HBxMeQqWOTtFEbDkzbU8o%2BhS5%2BavQm5BUvFTmjbsVs6Npo5qmmTkI8dRvqRO1HzqSv6ymL8%2BpiguKEBmaFaBeg%3D%3D&trade_no=2026011422001420011429097835&auth_app_id=2021006126656681&version=1.0&app_id=2021006126656681&sign_type=RSA2&seller_id=2088802857784696×tamp=2026-01-14+19:30:21"
|
||
|
||
print("从您提供的请求中,我们可以看到:")
|
||
print("- 订单号: 20260114192935cfcf96")
|
||
print("- 支付金额: 5.00")
|
||
print("- 支付宝交易号: 2026011422001420011429097835")
|
||
print("- 签名类型: RSA2")
|
||
print("- 时间戳: 2026-01-14 19:30:21")
|
||
print("\n这些参数应该被正确传递给验证函数")
|
||
|
||
print("\n" + "="*60)
|
||
print("解决方案")
|
||
print("="*60)
|
||
print("""
|
||
1. 确保签名验证时:
|
||
- 从参数中移除 'sign' 和 'sign_type' 字段
|
||
- 使用剩余参数进行签名验证
|
||
- 使用正确的支付宝公钥
|
||
|
||
2. 检查配置:
|
||
- 确认使用的AppID与请求中的app_id一致
|
||
- 确认密钥对正确配对
|
||
|
||
3. 日志查看:
|
||
- 运行应用后,进行一次支付测试
|
||
- 查看 logs/system.log 中的详细错误信息
|
||
- 检查具体的验证失败原因
|
||
|
||
4. 沙箱测试:
|
||
- 如果使用沙箱环境,请确保配置正确
|
||
- 使用沙箱提供的测试账号进行支付
|
||
""")
|
||
|
||
if __name__ == "__main__":
|
||
print("支付宝配置检查工具\n")
|
||
|
||
check_alipay_config()
|
||
analyze_callback_request()
|
||
|
||
print("\n" + "="*60)
|
||
print("下一步操作建议")
|
||
print("="*60)
|
||
print("""
|
||
1. 运行应用: python app.py
|
||
2. 进行支付测试
|
||
3. 检查日志文件 logs/system.log
|
||
4. 查看具体的错误信息
|
||
5. 根据错误信息进行相应修复
|
||
""") |