getMessage() . "\n"; } // 测试2: MD5签名 echo "\n【测试2】MD5签名测试\n"; try { $mac = CcbMD5::signApiMessage($demoMessage, $demoPrivateKey); echo "✓ 签名成功\n"; echo " - 实际MAC: " . $mac . "\n"; echo " - 预期MAC: " . $expectedMac . "\n"; echo " - 结果匹配: " . ($mac === $expectedMac ? "✓ 完全一致" : "✗ 不匹配") . "\n"; } catch (\Exception $e) { echo "✗ 签名失败: " . $e->getMessage() . "\n"; } // 测试3: RSA解密验证 echo "\n【测试3】RSA解密验证(验证加解密流程)\n"; try { // 用demo公钥加密 $encrypted = CcbRSA::encryptForCcb($demoMessage, $demoPublicKey); $encrypted = str_replace(["\r", "\n", "\r\n"], '', $encrypted); // 用demo私钥解密 $decrypted = CcbRSA::decrypt($encrypted, $demoPrivateKey); echo "✓ 解密成功\n"; echo " - 原始报文长度: " . strlen($demoMessage) . " 字节\n"; echo " - 解密报文长度: " . strlen($decrypted) . " 字节\n"; echo " - 内容一致性: " . ($decrypted === $demoMessage ? "✓ 完全一致" : "✗ 不匹配") . "\n"; if ($decrypted !== $demoMessage) { echo "\n 差异分析:\n"; echo " 原始: " . substr($demoMessage, 0, 100) . "...\n"; echo " 解密: " . substr($decrypted, 0, 100) . "...\n"; } } catch (\Exception $e) { echo "✗ 解密失败: " . $e->getMessage() . "\n"; } // 测试4: 测试用户自己的密钥 echo "\n\n========== 测试用户密钥 ==========\n\n"; $userPublicKey = 'MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC6yZj5rUHz+plEbTMSxF6iRy5XTd82LpKGkcRtJcNiHXAvOh/QvW6xc+GJSfvfM9pnRCyWkFrvFViOGnLUrjyoB0wa/TEqWootEEKXSDacFyQ/QIJSK0+zMYTC2Md6gGA4YylJQuYZ1lWDoOLBt9pP93Qnm0R2PEQ5a11HxwdvlQIDAQAB'; $userPrivateKey = 'MIICeAIBADANBgkqhkiG9w0BAQEFAASCAmIwggJeAgEAAoGBALrJmPmtQfP6mURtMxLEXqJHLldN3zYukoaRxG0lw2IdcC86H9C9brFz4YlJ+98z2mdELJaQWu8VWI4actSuPKgHTBr9MSpaii0QQpdINpwXJD9AglIrT7MxhMLYx3qAYDhjKUlC5hnWVYOg4sG32k/3dCebRHY8RDlrXUfHB2+VAgMBAAECgYArgn5R2pv8WymMmOtGudtZbb9LsuYF1v9mvVnGGv/SQQ060w1KMHYye83TjxpOueNsHqNMR0AHZS+Fmn+ZLyUNj9S77oQvUx5HQvY2/TDnsKbETzEMDybIWB+XdLsUkOrB3peVLTbk25i6oSNPOT2Fvd8TWbDqzBL9Ci27uJH72QJBAP/DfDLYoYx9OIRCykkxrDdQVFEkzhXj0wIkLa0Wnf8kP/JfBqvr0AGUPF8nEfh7fLVXYQlh5ab2FL5KvUifSL8CQQC69crW0fryyDHePp6OIVRUbw0T93h52vbGXnoQ6wdvKxZeL3MsfdNUvsJYeSxmtyY+LLgz1p3qOoEn6UpLvCirAkEA4N7qUvY+y3vJdhgXLNV8mkGJcLKQc5SUkJxogHeTQKGJi7ra7ctuXgUMM4jxduxz0CjcS1iEhxBzWn/x/mj1lwJBALgtv39VKLTXx1i7s5Ms/liXdfi/iC3zKbxOAk58WryHY+exMvMXmYMY0Xg7FySxNLl3cJeQy8ydifL5fbmSSTUCQQCj/YUbcTP8BQ6N0AgFdBwmXJyiNkB9zaDI5cEtpSCgq72m8lfn883GJ1MT7nKVXeX69/q5yDQUYiYPBXH4lCEC'; $testMessage = '{"CLD_HEADER":{"CLD_TX_CHNL":"YS44000009001853","CLD_TX_TIME":"20251022120000","CLD_TX_CODE":"A3341TP01","CLD_TX_SEQ":"20251022120000123456"},"CLD_BODY":{"USER_ID":"test001","ORDER_ID":"TEST202510221200","ORDER_DT":"20251022120000","TOTAL_AMT":"0.01","ORDER_STATUS":"0","REFUND_STATUS":"0","MCT_NM":"丰科贸易(荷西嘉园店)"}}'; echo "【测试4】用户密钥加解密测试\n"; try { // 加密 $encrypted = CcbRSA::encryptForCcb($testMessage, $userPublicKey); $encrypted = str_replace(["\r", "\n", "\r\n"], '', $encrypted); echo "✓ 用户密钥加密成功\n"; echo " - 密文长度: " . strlen($encrypted) . " 字节\n"; // 解密验证 $decrypted = CcbRSA::decrypt($encrypted, $userPrivateKey); echo "✓ 用户密钥解密成功\n"; echo " - 加解密一致性: " . ($decrypted === $testMessage ? "✓ 完全一致" : "✗ 不匹配") . "\n"; // 签名 $mac = CcbMD5::signApiMessage($testMessage, $userPrivateKey); echo "✓ 用户密钥签名成功\n"; echo " - MAC签名: " . $mac . "\n"; echo "\n【结论】用户密钥本身是有效的,可以正常加解密和签名\n"; } catch (\Exception $e) { echo "✗ 测试失败: " . $e->getMessage() . "\n"; } echo "\n========== 测试完成 ==========\n\n"; echo "【下一步建议】\n"; echo "1. 如果demo密钥测试通过,说明代码逻辑正确\n"; echo "2. 如果用户密钥测试通过,说明密钥本身有效\n"; echo "3. 489错误可能是以下原因:\n"; echo " - 服务方编号(YS44000009001853)与密钥不匹配\n"; echo " - 商户号(105003953998037)配置错误\n"; echo " - 密钥未在建行平台备案\n"; echo " - 需要使用测试环境而不是生产环境\n"; echo "\n"; echo "建议联系建行技术支持确认:\n"; echo "1. 服务方编号是否正确\n"; echo "2. 密钥是否已备案\n"; echo "3. 应该使用哪个环境(生产/测试)\n"; echo "\n";