mirror of
https://gitee.com/liuxioabin/fengketrade.git
synced 2026-04-17 21:03:17 +08:00
143 lines
8.2 KiB
PHP
143 lines
8.2 KiB
PHP
|
|
<?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";
|