获取用户电话只开放给小程序,微信网页端授权并没有这个选项。
getuserphonenumber 参数需要access_token,和code。此code并非wx.login的code,而是点击button按钮获取电话 得到微信返回的code。
1.获取AcToken
data() {
return { phoneCode: '', acToken: '' };
},
onLoad(options) {
this.getAcToken();
},
getAcToken() {
uni.request({
url: 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=小程序APPID&secret=小程序APPSECRET',
method: 'GET',
success: (res) => {
console.log('getAcToken', res.data.access_token);
this.acToken = res.data.access_token;
},
});
},
2.按钮获取code
<button open-type="getPhoneNumber" @getphonenumber="getPhoneNumber">
getNumberCode
</button>
//这里我用的是uniapp封装过的
getPhoneNumber(e) {
console.log(e);
this.phoneCode = e.detail.code;
},
3.调取后端接口获取用户手机号
getJavaPhone() {
uni.request({
url: 'http://localhost:8080/getUserPhone',
method: 'POST',
data: {
code: this.phoneCode,
acToken: this.acToken,
},
success: (res) => {
console.log('获取用户手机号', res);
},
});
},
4.java程序页面 springboot程序页面
@PostMapping("/getUserPhone")
public String getPhoneNumber(@RequestBody JSONObject reqParams) throws Exception {
System.out.println("____________________--getUserPhone");
String code = reqParams.get("code").toString();
System.out.println(code);
String acToken = reqParams.get("acToken").toString();
System.out.println(acToken);
String getNumUrl = "https://api.weixin.qq.com/wxa/business/getuserphonenumber?access_token=" + acToken;
//构造http请求客户端
CloseableHttpClient httpclient = HttpClients.createDefault();
HttpPost httpPost = new HttpPost(getNumUrl);
httpPost.addHeader("Content-Type", "application/json;charset=utf-8");
httpPost.setHeader("Accept", "application/json");
JSONObject json = new JSONObject();
json.put("code", code);
httpPost.setEntity(new StringEntity(json.toString()));
CloseableHttpResponse response = httpclient.execute(httpPost);
int statusCode = response.getStatusLine().getStatusCode();
HttpEntity responseEntity = response.getEntity();
String responseText = EntityUtils.toString(responseEntity);
//这里会在控制台打印出用户的手机号码
System.out.println(responseText);
return JSON.toJSONString(response);
}
需要注意的是,获取手机号的官方接口需要json传值,不接受form参数