String replaceUrl = url.replace("{0}", APPID).replace("{1}", SECRET); String res = HttpUtil.get(replaceUrl); org.json.JSONObject jsonObject = new JSONObject(res); // 提取access_token String access_token = jsonObject.getString("access_token");// 获取手机号 String url1 = "https://api.weixin.qq.com/wxa/business/getuserphonenumber?access_token={0}"; String replaceUrl1 = url1.replace("{0}", access_token); JSONObject params = new JSONObject(); params.put("code", code); String res1 = HttpUtil.post(replaceUrl1, params.toString()); JSONObject response = new JSONObject(res1); // 提取 phone_info JSONObject phoneInfo = response.getJSONObject("phone_info"); String phoneNumber = phoneInfo.getString("phoneNumber"); return phoneNumber;
时间: 2025-06-27 14:10:15 浏览: 16
### 微信小程序通过接口获取手机号的实现方法
要通过微信 API 使用 `access_token` 和 `code` 获取用户的手机号,可以按照以下方式完成。以下是完整的实现逻辑以及代码示例。
#### 1. 调用微信登录接口获取 code
在前端部分,开发者可以通过调用 wx.login() 接口来获得临时登录凭证 `code`。此 `code` 将被发送到服务器端用于换取 session_key 及 openid[^1]。
```javascript
wx.login({
success(res) {
if (res.code) {
// 发送 res.code 到后台服务端
console.log('Login Code:', res.code);
} else {
console.error('Login failed! ' + res.errMsg);
}
}
});
```
#### 2. 后台使用 code 换取 access_token 和 openid
在后端接收到前端传递过来的 `code` 后,需向微信官方提供的 URL 请求以换取 `session_key`、`openid` 和其他必要参数。请求地址如下:
```
https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code
```
其中:
- APPID:应用唯一标识;
- SECRET:应用密钥;
- JSCODE:从前端传来的 login 凭证;
返回数据结构可能类似于以下内容:
```json
{
"session_key": "KlWUHcL...",
"openid": "o0zEi5..."
}
```
这部分操作完成后即可得到必要的 `openid` 和 `session_key`[^2]。
#### 3. 解密加密数据获取手机号
当用户同意提供其手机号码时,会触发回调事件并将加密的数据包发回给开发者。此时需要解密这些数据才能读取出实际的手机号信息。具体步骤包括接收来自客户端的 encryptedData 和 iv 参数并利用之前取得的 sessionKey 进行 AES-CBC 加密算法处理[^3]。
下面是一个基于 Java 的简单例子展示如何解析出最终明文形式下的电话号码字符串:
```java
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
public class WeChatPhoneDecryptor {
public static String decryptPhoneNumber(String appId, String sessionKey, String encryptedData, String iv) throws Exception {
byte[] decodedSessionKey = Base64.getDecoder().decode(sessionKey);
byte[] decodedEncryptedData = Base64.getDecoder().decode(encryptedData);
byte[] decodedIV = Base64.getDecoder().decode(iv);
SecretKeySpec keySpec = new SecretKeySpec(decodedSessionKey,"AES");
IvParameterSpec ivParamSpec = new IvParameterSpec(decodedIV);
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding");
cipher.init(Cipher.DECRYPT_MODE,keySpec,ivParamSpec);
byte [] resultBytes = cipher.doFinal(decodedEncryptedData);
return new String(resultBytes, StandardCharsets.UTF_8);
}
}
```
注意,在上述过程中还需要验证 data 中携带的时间戳 timestamp 是否合法等问题以保障安全性。
---
###
阅读全文
相关推荐

















