代码示例
/**
* 获取微信凭证
*/
private String getWxToken() {
// 优先从缓存读取
String accessToken = redisTemplate.opsForValue().get(RedisKeyEnum.KEY_WEIXIN_ACCESS_TOKEN.value());
if (Objects.isNull(accessToken)) {
String url = "https://api.weixin.qq.com/cgi-bin/stable_token";
JsonObject json = new JsonObject();
json.addProperty("grant_type", "client_credential");
json.addProperty("appid", "wxbe2c771ca621f869"); // appid
json.addProperty("secret", "b6b460c4de6ad06fc77ef0c3dcacda71"); // secret 从微信小程序开发管理中生成
log.debug(String.valueOf(json));
RestTemplate restTemplate = new RestTemplate();
HttpHeaders headers = new HttpHeaders();
MediaType type = MediaType.parseMediaType("application/json; charset=UTF-8");
headers.setContentType(type);
headers.add("Accept", MediaType.APPLICATION_JSON.toString());
HttpEntity<String> formEntity = new HttpEntity<>(json.toString(), headers);
String sdResponse = restTemplate.postForEntity(url, formEntity, String.class).getBody();
log.debug(sdResponse);
if (Objects.isNull(sdResponse)) {
throw new RuntimeException("获取微信凭证失败");
}
accessToken = JsonParser.parseString(sdResponse).getAsJsonObject().get("access_token").getAsString();
log.debug(accessToken);
if (Objects.isNull(accessToken)) {
throw new RuntimeException("获取微信凭证无法解析Token");
}
// 缓存
redisTemplate.opsForValue().set(RedisKeyEnum.KEY_WEIXIN_ACCESS_TOKEN.value(), accessToken, 7000, TimeUnit.SECONDS);
}
return accessToken;
}
/**
* 根据动态令牌获取手机号
*/
private String getPhone(String accessToken, String code) {
String url = "https://api.weixin.qq.com/wxa/business/getuserphonenumber?access_token=" + accessToken;
JsonObject json = new JsonObject();
json.addProperty("code", code);
log.debug(String.valueOf(json));
RestTemplate restTemplate = new RestTemplate();
HttpHeaders headers = new HttpHeaders();
MediaType type = MediaType.parseMediaType("application/json; charset=UTF-8");
headers.setContentType(type);
headers.add("Accept", MediaType.APPLICATION_JSON.toString());
HttpEntity<String> formEntity = new HttpEntity<>(json.toString(), headers);
String sdResponse = restTemplate.postForEntity(url, formEntity, String.class).getBody();
log.debug(sdResponse);
if (Objects.isNull(sdResponse)) {
throw new RuntimeException("根据code获取手机号失败");
}
JsonObject phoneInfo = JsonParser.parseString(sdResponse).getAsJsonObject().get("phone_info").getAsJsonObject();
// 手机号
String phoneNumber = phoneInfo.get("purePhoneNumber").getAsString();
// 国外手机号会有区号
// String countryCode = phoneInfo.get("countryCode").getAsString();
log.debug(phoneNumber);
if (Objects.isNull(phoneNumber)) {
throw new RuntimeException("根据code获取手机号无法解析");
}
return phoneNumber;
}
小程序
<button open-type="getPhoneNumber" @getphonenumber="phonenumber">授权测试</button>
methods: {
phonenumber(e) {
uni.request({
url: this.http + '/authorization',
method: 'POST',
data: {
code: e.detail.code,
},
success(res) {
console.log('获取access_token信息:', res)
}
})
},
}