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