getMessage() . "\n\n"; } } } catch (Exception $e) { echo "✗ 加密失败: " . $e->getMessage() . "\n\n"; } echo "【测试2】分析建行demo密文的密钥来源\n"; echo "----------------------------------------\n"; echo "建行提供的demo密文无法用demo私钥解密,说明:\n\n"; echo "可能性A: demo密文是用建行平台公钥加密的\n"; echo " - 这才是真实的业务场景\n"; echo " - 商户用建行平台公钥加密请求\n"; echo " - 建行用建行平台私钥解密\n"; echo " - 商户的公私钥用于签名和验签\n\n"; echo "可能性B: demo只是示例,不是真实密文\n"; echo " - demo文档只是展示报文格式\n"; echo " - cnt和mac字段只是占位符\n"; echo " - 不一定能真实解密\n\n"; echo "========== 关键结论 ==========\n\n"; echo "✓ 我们的RSA加密解密代码是正确的(自测通过)\n"; echo "✓ PKCS#8格式私钥已正确支持\n"; echo "✗ 建行demo密文无法用demo私钥解密\n\n"; echo "【这说明什么?】\n"; echo "1. 代码逻辑没问题 ✓\n"; echo "2. 建行demo可能不是用demo密钥加密的\n"; echo "3. 真实业务需要用建行平台公钥加密\n\n"; echo "【你需要做的】\n"; echo "联系建行技术支持,询问:\n"; echo "1. A3341TP01接口的cnt字段应该用哪个公钥加密?\n"; echo " - 商户自己的公钥?\n"; echo " - 建行平台的公钥?(更合理)\n\n"; echo "2. 如果需要建行平台公钥,请建行提供\n\n"; echo "3. 确认你的商户公钥是否已在建行备案\n\n"; echo "【489错误的真正原因】\n"; echo "很可能是因为:\n"; echo "1. 用错了公钥加密(用商户公钥而不是建行平台公钥)\n"; echo "2. 建行服务器无法解密你的请求\n"; echo "3. 所以返回489系统异常\n\n";