ai_v/test_alipay_verify.py

166 lines
5.2 KiB
Python
Raw Normal View History

#!/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")