//首先需求是: 需要调转到微信小程序进行授权,前端通过登录接口获取code,将code传给后端,后端通过code和accessToken调用微信官方得API获取用户手机号
注意: 授权链接最好采用tUrlLink,, 因为UrlScheme得调转没有提示,不管是UrlLink还是UrlScheme 目前为止,只支持IOS调转到个人微信,都不支持安卓直接从外部跳转到个人位置,都只能从个人微信中打开小程序。
调研文档地址:
获取小程序二维码: https://developers.weixin.qq.com/doc/oplatform/Third-party_Platforms/2.0/api/qrcode/getwxacodeunlimit.html
通过接口获取短期有效Scheme https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/url-scheme.html
微信小程序获取手机号得地址: https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/getPhoneNumber.html、
package com.hzins.wp.order.manager.common.utils;
import java.io.IOException;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
public class HttpUtil {
private static final CloseableHttpClient httpclient = HttpClients.createDefault();
private static String charset = "utf-8";
/**
* 发送HttpGet请求
* @param url
* @return
*/
public static String sendGet(String url) {
HttpGet httpget = new HttpGet(url);
CloseableHttpResponse response = null;
try {
response = httpclient.execute(httpget);
} catch (IOException e1) {
e1.printStackTrace();
}
String result = null;
try {
HttpEntity entity = response.getEntity();
if (entity != null) {
result = EntityUtils.toString(entity);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
response.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return result;
}
public static String sendPost(String url, String json) throws ClientProtocolException, IOException {
HttpPost httpPost = new HttpPost(url);
CloseableHttpClient client = HttpClients.createDefault();
//解决中文乱码问题
StringEntity entity = new StringEntity(json, charset);
entity.setContentEncoding(charset);
entity.setContentType("application/json");
httpPost.setEntity(entity);
CloseableHttpResponse response = client.execute(httpPost);
if (response.getStatusLine().getStatusCode() == 200) {
HttpEntity httpEntity = response.getEntity();
return EntityUtils.toString(httpEntity, charset);
}
return null;
}
}
/**
* 从微信官方获取accessToken请求地址
*/
public static final String QY_WEIXIN_GET_ACCESS_TOKEN = "https://api.weixin.qq.com/cgi-bin/token";
/**
* 从微信官方,通过code换取用户手机号的请求地址
*/
public static final String QY_WEIXIN_POST_PHONE = "https://api.weixin.qq.com/wxa/business/getuserphonenumber";
/**
* 从微信官方,获取小程序 URL scheme 码
*/
public static final String QY_WEIXIN_POST_URLSCHEME = "https://api.weixin.qq.com/wxa/generatescheme";
/**
* 从微信官方,获取小程序 URL Link链接
*/
public static final String QY_WEIXIN_POST_URLLINK = "https://api.weixin.qq.com/wxa/generate_urllink";
/**
* 从微信官方获取accessToken
*
* @return
*/
public String getAccessToken(String appid, String secret) {
String url = HttpApiConstant.QY_WEIXIN_GET_ACCESS_TOKEN + "?grant_type=client_credential&appid="
+ appid + "&secret=" + secret;
String result = null;
try {
result = HttpUtil.sendGet(url);
} catch (Exception e) {
log.error("获取accessToken异常:{}",e);
return null;
}
JSONObject object = JSON.parseObject(result);
//这就是access_token
String Access_Token = object.getString("access_token");
return Access_Token;
}
/**
* 从微信官方获取UrlLink
*
* @return
*/
public String getUrlLink(String accessToken, UrllinkParam urllinkParam){
String url = HttpApiConstant.QY_WEIXIN_POST_URLLINK + "?access_token="
+ accessToken;
String jsonString = JSONObject.toJSONString(urllinkParam);
String result = null;
try {
result = HttpUtil.sendPost(url,jsonString);
} catch (IOException e) {
log.error("从微信官方获取小程序 URL Link异常:{}",e);
}
JSONObject object = JSON.parseObject(result);
//判断下返回来的结果是否正确
if(object.getString("errmsg").equals("ok")){
//获取url_link的对象
String scheme = String.valueOf(object.get("url_link"));
return scheme;
}
log.info("获取小程序 URL Link 码失败的原因为:{}",object.getString("errcode")+":"+object.getString("errmsg"));
return null;
}
/**
* 从微信官方获取用户手机号
* @return
*/
public PhoneInfo getPhone(String access_token,PhoneInfoParam phoneInfoParam) {
String url = HttpApiConstant.QY_WEIXIN_POST_PHONE + "?access_token="
+ access_token;
String jsonString = JSONObject.toJSONString(phoneInfoParam);
String result = null;
try {
result = HttpUtil.sendPost(url,jsonString);
} catch (IOException e) {
log.error("从微信官方获取用户手机号异常:{}",e);
}
JSONObject object = JSON.parseObject(result);
//判断下返回来的结果是否正确
if(object.getString("errmsg").equals("ok")){
//获取手机号的对象
String jsonObject = String.valueOf(object.get("phone_info"));
PhoneInfo phoneInfo = JSON.parseObject(String.valueOf(jsonObject),PhoneInfo.class);
return phoneInfo;
}
log.info("获取小程序用户手机号失败的原因为:{}",object.getString("errcode")+":"+object.getString("errmsg"));
return null;
}
/**
*微信token,2小时过期,每小时重新获得一次,
*/
@Autowired
RedisTemplate redisTemplate;
private final static String ACCESS_TOKEN_KEY = "accessToken";
//7080000毫秒 = 0.1966667小时
@Scheduled(fixedDelay = 7080000)
@Override
public void addAccessToken() {
String accessToken = qyWechatService.getAccessToken();
log.info("定时任务启用===========" + accessToken);
//微信token2小时过期,每小时重新获得一次,
redisTemplate.opsForValue().set(ACCESS_TOKEN_KEY, accessToken, 7200, TimeUnit.SECONDS);
}
请求微信官方 获取accessToken接口需要的get和Post方式
最新推荐文章于 2024-08-07 11:00:00 发布
该博客主要介绍了如何在微信小程序中实现用户授权并获取手机号的流程。前端通过登录接口获取code,传递给后端,后端再通过微信官方API获取accessToken和用户手机号。同时,文中提到了授权链接的注意事项,建议使用tUrlLink以避免在Android上出现问题。此外,还提供了获取小程序二维码、URLScheme码和URLLink的相关接口。
摘要由CSDN通过智能技术生成