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. 根据错误信息进行相应修复
|
|||
|
|
""")
|