springboot 微信小程序获取用户手机号
直接开整!!! 现在有两种方式获取微信用户的手机号
第一种
这种方式比较旧了,也能获取到手机号,但不建议使用。 1.前端调用wx.login()(官方的方法,直接在代码中调用就可以)方法,把得到的code传给后端,后端在通过这个code和appid,secret获取sessionkey和openid。ps:这里需要把获取到的sessionkey和openid存入redis,sessionkey之后会用到,他是解密出手机号的钥匙。 2.前端在调用 getPhoneNumber ()方法(这个也是官方的方法),会得到如下数据 这时在把encryptedData和iv传给后端,后端在处理这两个参数和上一步得到的sessionkey,解密出用户的手机号。
第二种
这是目前最新的获取方式。 前端调用getPhoneNumber () ,这时只需要把得到数据中的code传给后端,后端通过appid和secret访问https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={0}&secret={1}获取刷新token,然后再携带这个刷新token和前端传给的code调用https://api.weixin.qq.com/wxa/business/getuserphonenumber?access_token={0}就可以获取用户的手机号了,不需解密操作。这两种方式都可以获取用户的手机号,但第一种有点麻烦,还需要解密。毕竟是有新的而且是更简洁的方式,还是用新的方式比较好,旧的之后不知道会不会被官方弃用。
完整代码
两种方式我都写了,这里只提供第二种方式的完整代码供大家参考
这里需要fastjson和hutool两个依赖,放入pom文件中下载即可
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.72</version>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.6.5</version>
</dependency>
appid和secret放在yml文件中
代码:
@Value("${weixin.appid}")
private String appid;
@Value("${weixin.secret}")
private String secret;
public Object getPhoneNumber(String code) {
String result = null;
try {
String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={0}&secret={1}";
String replaceUrl = url.replace("{0}", appid).replace("{1}", secret);
String res = HttpUtil.get(replaceUrl);
JSONObject json_token = JSON.parseObject(res);
String access_token = json_token.getString("access_token");
String urlTwo = "https://api.weixin.qq.com/wxa/business/getuserphonenumber?access_token={0}";
String replaceUrlTwo = urlTwo.replace("{0}",access_token);
HashMap<String, Object> requestParam = new HashMap<>();
requestParam.put("code", code);
String jsonStr = JSON.toJSONString(requestParam);
HttpResponse response = HttpRequest.post(replaceUrlTwo)
.header(Header.CONTENT_ENCODING, "UTF-8")
.header(Header.CONTENT_TYPE, "application/x-www-form-urlencoded")
.body(jsonStr)
.execute();
if (response.getStatus() == HttpStatus.HTTP_OK) {
result = response.body();
}
} catch (HttpException e) {
e.printStackTrace();
}
return JSONObject.parseObject(result).get("phone_info");
}
结果
个人码云有一些demo
|