// +---------------------------------------------------------------------- namespace Tests\Other\PrivacyPhone; use PHPUnit\Framework\TestCase; /** * 米糠云隐私小号接口测试 */ class MikangyunApiTest extends TestCase { private string $appkey = '0f2494a0e258c85575d1e2aa68e07687'; private string $appsecret = ''; // TODO: 请填写完整的AppSecret private string $serverRoot = 'http://api.mixcom.cn'; /** * 生成签名 * @param array $params * @return string */ private function generateSign(array $params): string { $params = array_filter($params, function ($v, $k) { return $v !== '' && $k !== 'sign'; }, ARRAY_FILTER_USE_BOTH); ksort($params); $string = ''; foreach ($params as $v) { $string .= $v; } return strtolower(sha1($string . sha1($this->appsecret))); } /** * 发送POST请求 * @param string $url * @param array $params * @return array */ private 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, http_build_query($params)); curl_setopt($ch, CURLOPT_TIMEOUT, 30); curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/x-www-form-urlencoded']); $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) ?? [] ]; } /** * 测试获取AXB可用小号 */ public function testGetAxbNumber() { echo "\n========== 测试获取AXB可用小号 ==========\n"; if (empty($this->appsecret)) { $this->markTestSkipped('请先填写完整的AppSecret'); } $time = time(); $params = [ 'appkey' => $this->appkey, 'time' => $time, ]; $params['sign'] = $this->generateSign($params); $url = $this->serverRoot . '/virtual/getAxbNumber'; echo "请求URL: $url\n"; echo "请求参数: " . json_encode($params, JSON_UNESCAPED_UNICODE) . "\n"; $result = $this->post($url, $params); echo "HTTP状态码: {$result['http_code']}\n"; echo "响应内容: {$result['response']}\n"; if ($result['error']) { echo "curl错误: {$result['error']}\n"; } $this->assertEquals(200, $result['http_code'], 'HTTP状态码应为200'); $data = $result['decoded']; $this->assertArrayHasKey('success', $data, '响应应包含success字段'); $this->assertArrayHasKey('code', $data, '响应应包含code字段'); $this->assertArrayHasKey('data', $data, '响应应包含data字段'); if ($data['success'] && !empty($data['data'])) { echo "\n获取成功!可用小号列表:\n"; foreach ($data['data'] as $item) { echo " - 号码: {$item['number']}, 区号: {$item['region_code']}, 绑定数: {$item['bindcount']}\n"; } } return $data; } /** * 测试AXB绑定 * @depends testGetAxbNumber */ public function testAxbBind($axbData) { echo "\n========== 测试AXB绑定 ==========\n"; if (empty($this->appsecret)) { $this->markTestSkipped('请先填写完整的AppSecret'); } if (empty($axbData['data']) || empty($axbData['data'][0]['number'])) { $this->markTestSkipped('无可用小号,无法测试绑定'); } // TODO: 请填写测试用的A号码(用户手机号)和B号码(商家/快递手机号) $aParty = ''; // TODO: 填写A号码 $bParty = ''; // TODO: 填写B号码 if (empty($aParty) || empty($bParty)) { $this->markTestSkipped('请先填写A号码和B号码进行测试'); } $number = $axbData['data'][0]['number']; $time = time(); $params = [ 'appkey' => $this->appkey, 'time' => $time, 'number' => $number, 'aparty' => $aParty, 'bparty' => $bParty, ]; $params['sign'] = $this->generateSign($params); $url = $this->serverRoot . '/virtual/axbBind'; echo "请求URL: $url\n"; echo "请求参数: " . json_encode($params, JSON_UNESCAPED_UNICODE) . "\n"; $result = $this->post($url, $params); echo "HTTP状态码: {$result['http_code']}\n"; echo "响应内容: {$result['response']}\n"; $this->assertEquals(200, $result['http_code'], 'HTTP状态码应为200'); $data = $result['decoded']; $this->assertTrue($data['success'] ?? false, '绑定应成功'); $this->assertEquals(200, $data['code'] ?? 0, '响应码应为200'); echo "\n绑定成功!\n"; echo "隐私小号: $number\n"; echo "A号码: $aParty\n"; echo "B号码: $bParty\n"; return [ 'number' => $number, 'aparty' => $aParty, 'bparty' => $bParty, ]; } /** * 测试AXB解绑 * @depends testAxbBind */ public function testUnAxbBind($bindData) { echo "\n========== 测试AXB解绑 ==========\n"; if (empty($this->appsecret)) { $this->markTestSkipped('请先填写完整的AppSecret'); } $time = time(); $params = [ 'appkey' => $this->appkey, 'time' => $time, 'number' => $bindData['number'], 'aparty' => $bindData['aparty'], 'bparty' => $bindData['bparty'], ]; $params['sign'] = $this->generateSign($params); $url = $this->serverRoot . '/virtual/unAxbBind'; echo "请求URL: $url\n"; echo "请求参数: " . json_encode($params, JSON_UNESCAPED_UNICODE) . "\n"; $result = $this->post($url, $params); echo "HTTP状态码: {$result['http_code']}\n"; echo "响应内容: {$result['response']}\n"; $this->assertEquals(200, $result['http_code'], 'HTTP状态码应为200'); $data = $result['decoded']; $this->assertTrue($data['success'] ?? false, '解绑应成功'); echo "\n解绑成功!\n"; } }