// +---------------------------------------------------------------------- /** * 米糠云隐私小号接口测试脚本 * * 使用方法: * 1. 填写下方配置信息 * 2. 命令行执行: php tests/Other/PrivacyPhone/test_api.php */ // 配置信息 $appkey = '0f2494a0e258c85575d1e2aa68e07687'; $appsecret = 'SZWgOa'; // 完整AppSecret $aParty = '13693687880'; // A号码 - 用户手机号 $serverRoot = 'https://api.mixcom.cn'; // 注意:SDK中使用的是https /** * 生成签名 - 参照SDK实现 */ function generateSign(array $params, string $secret): string { // key转换为小写 $params = array_change_key_case($params, CASE_LOWER); // 排除不需要加密的参数 (key为c、a或sign) foreach ($params as $key => $val) { if ($key == 'c' || $key == 'a' || $key == 'sign') { unset($params[$key]); } if ($val === '') { unset($params[$key]); } } // 对key进行排序, 按名称升序 ksort($params); // 将数据连接,进行加密 $data = ''; foreach ($params as $key => $val) { $data .= $val; } $data .= $secret; $sign = strtolower(sha1($data . sha1($secret))); echo "\n[签名调试]\n"; echo "key小写转换后: " . json_encode(array_keys($params)) . "\n"; echo "排除后参数: " . json_encode($params) . "\n"; echo "参与签名数据拼接: $data\n"; echo "sha1(secret): " . sha1($secret) . "\n"; echo "最终签名: $sign\n"; return $sign; } /** * 发送POST请求 */ function post(string $url, array $params): array { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_POSTFIELDS, $params); curl_setopt($ch, CURLOPT_TIMEOUT, 30); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); $response = curl_exec($ch); $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); $error = curl_error($ch); curl_close($ch); return [ 'http_code' => $httpCode, 'response' => $response, 'error' => $error, 'decoded' => json_decode($response, true) ?? [] ]; } /** * 打印结果 */ function printResult(string $title, array $result): void { echo "\n========== $title ==========\n"; echo "HTTP状态码: {$result['http_code']}\n"; echo "响应内容: {$result['response']}\n"; if ($result['error']) { echo "curl错误: {$result['error']}\n"; } echo "\n"; } // ========== 开始测试 ========== echo "米糠云隐私小号接口测试\n"; echo "========================\n"; echo "时间: " . date('Y-m-d H:i:s') . "\n"; echo "AppKey: $appkey\n"; echo "AppSecret: " . substr($appsecret, 0, 6) . "***\n"; echo "A号码: $aParty\n"; echo "API地址: $serverRoot\n"; // 检查配置 if (empty($appsecret) || empty($aParty)) { echo "\n❌ 错误: 请填写完整的AppSecret和A号码\n"; exit(1); } // 测试1: 获取AXB可用小号 echo "\n[测试1] 获取AXB可用小号\n"; $params = [ 'appkey' => $appkey, 'time' => time(), ]; $params['sign'] = generateSign($params, $appsecret); $url = $serverRoot . '/virtual/getaxbnumber'; echo "请求URL: $url\n"; echo "请求参数: " . json_encode($params, JSON_UNESCAPED_UNICODE) . "\n"; $result = post($url, $params); printResult('获取AXB可用小号响应', $result); if ($result['http_code'] !== 200) { echo "❌ HTTP请求失败\n"; exit(1); } $data = $result['decoded']; if (empty($data['success'])) { echo "❌ 接口返回失败\n"; echo "错误码: " . ($data['code'] ?? 'N/A') . "\n"; echo "错误信息: " . ($data['msg'] ?? 'N/A') . "\n"; exit(1); } if (empty($data['data'])) { echo "❌ 没有可用的隐私小号\n"; exit(1); } echo "✅ 获取成功!可用小号列表:\n"; foreach ($data['data'] as $index => $item) { echo " [" . ($index + 1) . "] 号码: {$item['number']}, 区号: {$item['region_code']}, 绑定数: {$item['bindcount']}\n"; } $availableNumber = $data['data'][0]['number']; $bParty = $availableNumber; // 使用获取到的第一个可用号作为B号码进行测试 // 测试2: AXB绑定 echo "\n[测试2] AXB绑定\n"; echo "隐私小号(X): $availableNumber\n"; echo "A号码(用户): $aParty\n"; echo "B号码(商家): $bParty\n"; $params = [ 'appkey' => $appkey, 'time' => time(), 'number' => $availableNumber, 'aparty' => $aParty, 'bparty' => $bParty, ]; $params['sign'] = generateSign($params, $appsecret); $url = $serverRoot . '/virtual/axbBind'; echo "请求URL: $url\n"; echo "请求参数: " . json_encode($params, JSON_UNESCAPED_UNICODE) . "\n"; $result = post($url, $params); printResult('AXB绑定响应', $result); $data = $result['decoded']; if (!empty($data['success']) && $data['code'] == 200) { echo "✅ 绑定成功!\n"; // 测试3: AXB解绑 echo "\n[测试3] AXB解绑\n"; $params = [ 'appkey' => $appkey, 'time' => time(), 'number' => $availableNumber, 'aparty' => $aParty, 'bparty' => $bParty, ]; $params['sign'] = generateSign($params, $appsecret); $url = $serverRoot . '/virtual/unAxbBind'; echo "请求URL: $url\n"; echo "请求参数: " . json_encode($params, JSON_UNESCAPED_UNICODE) . "\n"; $result = post($url, $params); printResult('AXB解绑响应', $result); $data = $result['decoded']; if (!empty($data['success']) && $data['code'] == 200) { echo "✅ 解绑成功!\n"; } else { echo "❌ 解绑失败\n"; echo "错误信息: " . ($data['msg'] ?? 'N/A') . "\n"; } } else { echo "❌ 绑定失败\n"; echo "错误码: " . ($data['code'] ?? 'N/A') . "\n"; echo "错误信息: " . ($data['msg'] ?? 'N/A') . "\n"; } echo "\n========== 测试完成 ==========\n";