ai_v/check_alipay_config.py
24024 acaa5d4fd8 fix(payment): 增加支付回调签名验证日志及异常处理
- 在支付宝同步回调(payment_return)中添加详细日志记录
- 添加同步回调缺少签名参数的错误处理
- 同步回调中移除sign和sign_type再进行签名验证
- 同步回调异常捕获,返回500错误并记录详细异常信息
- 在支付宝异步通知(payment_notify)中添加详细日志记录
- 异步通知缺少签名参数时返回fail并记录错误日志
- 异步通知验证签名失败或交易状态异常时返回fail并记录错误日志
- 异步通知中增加已处理订单状态跳过处理并返回success的逻辑
- 异步通知异常捕获时回滚数据库事务并返回fail
- 支付宝服务(AlipayService)的签名验证方法增加日志记录和异常捕获
- 签名验证时移除不参与验证的sign和sign_type字段,防止验证错误
2026-01-14 19:48:00 +08:00

163 lines
5.5 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/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&timestamp=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. 根据错误信息进行相应修复
""")