Skip to content

Commit d8e7a56

Browse files
Copilotovertrue
andauthored
Add getPhoneNumber method to MiniApp Utils (#2961)
* Initial plan * Add getPhoneNumber method to MiniApp Utils with tests and documentation Co-authored-by: overtrue <[email protected]> * Address code review feedback: improve error handling in getPhoneNumber Co-authored-by: overtrue <[email protected]> * Fix PHPStan error: use isset() instead of !empty() for errcode validation Co-authored-by: overtrue <[email protected]> --------- Co-authored-by: copilot-swe-agent[bot] <[email protected]> Co-authored-by: overtrue <[email protected]>
1 parent cbece8b commit d8e7a56

File tree

3 files changed

+110
-0
lines changed

3 files changed

+110
-0
lines changed

docs/src/6.x/mini-app/utils.md

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,3 +43,27 @@ $session = $utils->decryptSession($sessionKey, $iv, $encryptedData);
4343
// }
4444
//}
4545
```
46+
47+
### 获取手机号
48+
49+
获取用户绑定的手机号,需先调用 `wx.login` 接口,然后通过 `getPhoneNumber` 方法获取用户手机号。
50+
51+
参考文档:https://developers.weixin.qq.com/miniprogram/dev/OpenApiDoc/user-info/phone-number/getPhoneNumber.html
52+
53+
```php
54+
$response = $utils->getPhoneNumber($code);
55+
56+
//{
57+
// "errcode": 0,
58+
// "errmsg": "ok",
59+
// "phone_info": {
60+
// "phoneNumber": "13800138000",
61+
// "purePhoneNumber": "13800138000",
62+
// "countryCode": "86",
63+
// "watermark": {
64+
// "timestamp": 1637744274,
65+
// "appid": "xxxx"
66+
// }
67+
// }
68+
//}
69+
```

src/MiniApp/Utils.php

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,4 +35,26 @@ public function decryptSession(string $sessionKey, string $iv, string $ciphertex
3535
{
3636
return Decryptor::decrypt($sessionKey, $iv, $ciphertext);
3737
}
38+
39+
/**
40+
* @throws HttpException
41+
*/
42+
public function getPhoneNumber(string $code): array
43+
{
44+
$response = $this->app->createClient()->request('POST', '/wxa/business/getuserphonenumber', [
45+
'json' => [
46+
'code' => $code,
47+
],
48+
])->toArray(false);
49+
50+
if (isset($response['errcode']) && $response['errcode'] !== 0) {
51+
throw new HttpException('getPhoneNumber error: '.json_encode($response, JSON_UNESCAPED_UNICODE));
52+
}
53+
54+
if (empty($response['phone_info'])) {
55+
throw new HttpException('getPhoneNumber error: '.json_encode($response, JSON_UNESCAPED_UNICODE));
56+
}
57+
58+
return $response;
59+
}
3860
}

tests/MiniApp/UtilsTest.php

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,4 +86,68 @@ public function test_decrypt_session()
8686
],
8787
], $utils->decryptSession($sessionKey, $iv, $encryptedData));
8888
}
89+
90+
public function test_get_phone_number()
91+
{
92+
$response = [
93+
'errcode' => 0,
94+
'errmsg' => 'ok',
95+
'phone_info' => [
96+
'phoneNumber' => '13800138000',
97+
'purePhoneNumber' => '13800138000',
98+
'countryCode' => '86',
99+
'watermark' => [
100+
'timestamp' => 1637744274,
101+
'appid' => 'xxxx',
102+
],
103+
],
104+
];
105+
106+
$httpClient = new MockHttpClient([
107+
new MockResponse(json_encode(['access_token' => 'mock-access-token', 'expires_in' => 7200])),
108+
new MockResponse(json_encode($response)),
109+
]);
110+
111+
$app = new Application([
112+
'app_id' => 'mock-appid',
113+
'secret' => 'mock-secret',
114+
'token' => 'mock-token',
115+
'aes_key' => 'mock-aes_key',
116+
]);
117+
$app->setHttpClient($httpClient);
118+
119+
$utils = new Utils($app);
120+
121+
$result = $utils->getPhoneNumber('mock-phone-code');
122+
123+
$this->assertSame($response, $result);
124+
}
125+
126+
public function test_get_phone_number_with_error()
127+
{
128+
$this->expectException(\EasyWeChat\Kernel\Exceptions\HttpException::class);
129+
$this->expectExceptionMessage('getPhoneNumber error:');
130+
131+
$errorResponse = [
132+
'errcode' => 40029,
133+
'errmsg' => 'invalid code',
134+
];
135+
136+
$httpClient = new MockHttpClient([
137+
new MockResponse(json_encode(['access_token' => 'mock-access-token', 'expires_in' => 7200])),
138+
new MockResponse(json_encode($errorResponse)),
139+
]);
140+
141+
$app = new Application([
142+
'app_id' => 'mock-appid',
143+
'secret' => 'mock-secret',
144+
'token' => 'mock-token',
145+
'aes_key' => 'mock-aes_key',
146+
]);
147+
$app->setHttpClient($httpClient);
148+
149+
$utils = new Utils($app);
150+
151+
$utils->getPhoneNumber('invalid-code');
152+
}
89153
}

0 commit comments

Comments
 (0)