fengketrade/test_ccb_demo_key.php
2025-10-22 11:34:32 +08:00

143 lines
8.2 KiB
PHP
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
/**
* 建行API测试脚本 - 使用demo密钥
* 用于验证代码逻辑是否正确
*
* 运行方式: php test_ccb_demo_key.php
*/
// 定义应用目录
define('APP_PATH', __DIR__ . '/application/');
// 加载框架引导文件CLI模式
require __DIR__ . '/thinkphp/base.php';
// 手动引入需要的类文件
require __DIR__ . '/addons/shopro/library/ccblife/CcbRSA.php';
require __DIR__ . '/addons/shopro/library/ccblife/CcbMD5.php';
use addons\shopro\library\ccblife\CcbRSA;
use addons\shopro\library\ccblife\CcbMD5;
// demo密钥来自doc/demo/服务方上送报文样例.txt
$demoPublicKey = 'MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDC+8V1Or6R6H3a7TjuvoDa5k0W/niEGg4N+0Nni+KfwHVX05pI7Qdq1J5+q31yORAoiSSNZNW4uWykmeSltC2mHGkQXClU4JmMXnWFyRCENw1iDIIIEsNax4jFBZUaDCn69PxWgp5wwk+d0V7QRYZ9jkgUaJK+BSYa0KMraxVfJwIDAQAB';
$demoPrivateKey = 'MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAML7xXU6vpHofdrtOO6+gNrmTRb+eIQaDg37Q2eL4p/AdVfTmkjtB2rUnn6rfXI5ECiJJI1k1bi5bKSZ5KW0LaYcaRBcKVTgmYxedYXJEIQ3DWIMgggSw1rHiMUFlRoMKfr0/FaCnnDCT53RXtBFhn2OSBRokr4FJhrQoytrFV8nAgMBAAECgYEAizhN0thw/altQ4YiIoWvZ50M6iAkWN5prp37kNGWrM40etNB1FQ5+ZN636L+3THVUbwqdzLKTy1GX3jqg05VUIf0sKYYepp+skwZmHVprz4EUKsZXRa+3MnMChJcyHdlyuUNs6HriMq6Qc1+fFEOtZFAf3lo2wYNFw5vIKHGQRECQQDxVKa+6m4y7LmWgiGLYghuL/SGXySFhwBh5+zMNl8V7aAbTX/tH6A0s8JXsSI4iChjWPXthKFTrd7h62vJBjeFAkEAztXpNehF18g3e6JEhtjbTmMsgyj13gdSZSRwjO0Y+IsDI1afnZXzwv96OlukGK8185z0bsbhTCOd6rkcRTnduwJBAOqGknlMh4VTylO66PB0d67lSaPgCDT/al67LcOTPzqnMAX4fc6qAl3VJ5Ni39fCckWB6ZVGZCVW/hfdWmUEdqUCQFFWNXuJd82/YnIwAZq1tKhCv8JkXSuO3YwApHIG2wcCQ52l9ubVjSJlrP8+Am3imOjQFB9r/jUe3H7thHyEoPkCQCay3waa0ll2DY+epkrrF/QO7aMa6NIUArRgWUmqw+1/45csBiWPMUrAD/CPDUr9Jvte92NjoAlz649csbgMM3w=';
// demo原始报文
$demoMessage = '{"CLD_HEADER":{"CLD_TX_CHNL":"YSTEST","CLD_TX_TIME":"20191112145911","CLD_TX_CODE":"A3341O031","CLD_TX_SEQ":"1010114131620697023913271"},"CLD_BODY":{"USER_ID":"user123","ORDER_ID":"order123","ORDER_DT":"20191112145811","TOTAL_AMT":"100.00","PAY_AMT":"90.00","DISCOUNT_AMT":"10.00","ORDER_STATUS":"1","REFUND_STATUS":"0","MCT_NM":"XXX商户"}}';
// demo加密结果建行提供的标准答案
$expectedCnt = 'Y2tFMDFJd2RGMGg5aFdXUGtjVVdaSmo4NHBKQzNNZE1wQTRRSXZVRlhBSWhqVEdXNE1LcE9MOXdxY0hhNUlIZndUU0RLK3NrZ1hpTytJUitpREEwSUp0bktRcWMxRG5hN1R0OEtjcUkxTUFDVE5FY2Z0b3lCeTVTaEo3cmNjSnBOUVFsSjRBR2htSzRheEhNb0p6N215eFViK1ZjeGd5WjVTTjJQcHUxQlBnZXJsQXE2Q1lrQ2VuSmZEYUxVSks5RGx2Yk9YWDlDczJiVVllYjlHSHQrUkFuYTljc2hucGhqVWNwNDgrcThNcGhQOElBL20xNVk5NG9lZEV4SXpmc0pDcDExZjFvQ0E5YkwwOWJOZjM4VHR3TkJkTmhqM3lKSVpWeWVpT0FucGhjS3JpOEs5RnlZbXlNVHF1UER3UjhmQ0p5dk5vYkNMS1BPRmQ3WFdXTVczZ29kSWpLaG5OUnhnaFA3N2txdDU3K2Rkd3hGbDgxUEdYbXJWN1ZKWDFOeXRVUFg2dWp3ZzdsUU1OSTlubU1kVE9nbHZJUHRoS205aEludFc2ZFBVTG1DUlNLNzZDc05qTUIyb1hTR2M2cHBNazMxNDJSa05KR0hvY1ZBNFUzcmc4SVk4ZFlYaTUzZmF3cHRES3pHY2JZVFI0SldRVzRNU2ZmSUxvNFpxTkY=';
$expectedMac = '947CAB4DFEBE59265DD28246E4465157';
echo "\n========== 建行API加密测试(使用demo密钥) ==========\n\n";
// 测试1: RSA加密
echo "【测试1】RSA加密测试\n";
try {
$encrypted = CcbRSA::encryptForCcb($demoMessage, $demoPublicKey);
$encrypted = str_replace(["\r", "\n", "\r\n"], '', $encrypted);
echo "✓ 加密成功\n";
echo " - 加密结果长度: " . strlen($encrypted) . " 字节\n";
echo " - 预期长度: " . strlen($expectedCnt) . " 字节\n";
// 对比前100个字符
$match = (substr($encrypted, 0, 100) === substr($expectedCnt, 0, 100));
echo " - 前100字符匹配: " . ($match ? "✓ 是" : "✗ 否") . "\n";
if (!$match) {
echo "\n 实际值: " . substr($encrypted, 0, 100) . "\n";
echo " 预期值: " . substr($expectedCnt, 0, 100) . "\n";
}
} catch (\Exception $e) {
echo "✗ 加密失败: " . $e->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";