工具类
package com.fjskec.recruit.sms.utils;
import com.alibaba.fastjson2.JSONObject;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.HttpClients;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URI;
/**
* @program: maobc-small_routine
* @description: app用户登陆
* @author: z.hw
**/
public class WeiXinUtiles {
/**
* 微信登陆通过code获取accessToken
*
* @param appId
* @param userAppSecret
* @param code
* @return
* @throws Exception
*/
public static StringBuilder getAccessTokenBycode(String appId, String userAppSecret, String code) throws Exception {
//查看官方文档 https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419317853&token=&lang=
String url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=" + appId + "&secret=" +
userAppSecret + "&code=" + code + "&grant_type=authorization_code";
URI uri = URI.create(url);
HttpClient client = HttpClients.createDefault();
HttpGet get = new HttpGet(uri);
HttpResponse response = client.execute(get);
StringBuilder sb = new StringBuilder();
if (response.getStatusLine().getStatusCode() == 200) {
HttpEntity entity = response.getEntity();
BufferedReader reader = new BufferedReader(new InputStreamReader(entity.getContent(), "UTF-8"));
for (String temp = reader.readLine(); temp != null; temp = reader.readLine()) {
sb.append(temp);
}
}
return sb;
}
/**
* access_token是否有效的验证
*
* @param accessToken
* @param openID
* @return
*/
public static boolean isAccessTokenIsInvalid(String accessToken, String openID) throws Exception {
String url = "https://api.weixin.qq.com/sns/auth?access_token=" + accessToken + "&openid=" + openID;
URI uri = URI.create(url);
HttpClient client = HttpClients.createDefault();
HttpGet get = new HttpGet(uri);
HttpResponse response = client.execute(get);
if (response.getStatusLine().getStatusCode() == 200) {
HttpEntity entity = response.getEntity();
BufferedReader reader = new BufferedReader(new InputStreamReader(entity.getContent(), "UTF-8"));
StringBuilder sb = new StringBuilder();
for (String temp = reader.readLine(); temp != null; temp = reader.readLine()) {
sb.append(temp);
}
JSONObject object = JSONObject.parseObject(sb.toString().trim());
int errcode = object.getInteger("errcode");
if (errcode == 0) {
//未失效
return true;
}
}
return false;
}
/**
* access_token 接口调用凭证
* expires_in access_token接口调用凭证超时时间,单位(秒)
* refresh_token 用户刷新access_token
* openid 授权用户唯一标识
* scope 用户授权的作用域,使用逗号(,)分隔
*
* @param APP_ID
*/
public JSONObject refreshAccessToken(String APP_ID, String refreshToken) throws Exception {
/**
* access_token是调用授权关系接口的调用凭证,由于access_token有效期(目前为2个小时)较短,当access_token超时后,可以使用refresh_token进行刷新,access_token刷新结果有两种:
*
* 1.若access_token已超时,那么进行refresh_token会获取一个新的access_token,新的超时时间;
*
* 2.若access_token未超时,那么进行refresh_token不会改变access_token,但超时时间会刷新,相当于续期access_token。
*
* refresh_token拥有较长的有效期(30天)且无法续期,当refresh_token失效的后,需要用户重新授权后才可以继续获取用户头像昵称。
*/
String uri = "https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=" + APP_ID + "&grant_type=refresh_token&refresh_token=" + refreshToken;
HttpClient client = HttpClients.createDefault();
HttpGet get = new HttpGet(URI.create(uri));
HttpResponse response = client.execute(get);
JSONObject object = new JSONObject();
if (response.getStatusLine().getStatusCode() == 200) {
BufferedReader reader = new BufferedReader(new InputStreamReader(response.getEntity().getContent(), "UTF-8"));
StringBuilder builder = new StringBuilder();
for (String temp = reader.readLine(); temp != null; temp = reader.readLine()) {
builder.append(temp);
}
object = JSONObject.parseObject(builder.toString().trim());
}
return object;
}
/**
* 得到用户基本信息
*
* @param accessToken
* @param openId
* @param tClass
* @return
* @throws Exception
*/
public static <T> T getAppWeiXinUserInfo(String accessToken, String openId, Class<T> tClass) throws Exception {
String uri = "https://api.weixin.qq.com/sns/userinfo?access_token=" + accessToken + "&openid=" + openId;
HttpClient client = HttpClients.createDefault();
HttpGet get = new HttpGet(URI.create(uri));
HttpResponse response = client.execute(get);
if (response.getStatusLine().getStatusCode() == 200) {
BufferedReader reader = new BufferedReader(new InputStreamReader(response.getEntity().getContent(), "UTF-8"));
StringBuilder builder = new StringBuilder();
for (String temp = reader.readLine(); temp != null; temp = reader.readLine()) {
System.out.println(temp);
builder.append(temp);
}
return JSONObject.parseObject(builder.toString(), tClass);
}
return null;
}
}
后端java代码实现
1.Controller接口
@RequestMapping("getUserInfoByAppCode")
public Response getUserInfoByAppCode(@RequestBody BaseRequest<UserAppAuthority> request){
return weiXinApi.getUserInfoByAppCode(request);
}
2.业务代码层
@Override
public Response getUserInfoByAppCode(BaseRequest<UserAppAuthority> request) {
UserAppAuthority userAppAuthority = request.getData();
if (userAppAuthority!= null) {
try {
StringBuilder stringBuilder = weiXinService.findAccessTokenBycode(userAppAuthority.getCode());
if (stringBuilder != null) {
if (stringBuilder.toString().trim().contains("errcode")) {
return Response.error("获取code失败");
}
JSONObject object = JSONObject.parseObject(stringBuilder.toString().trim());
//接口调用凭证
String accessToken = object.getString("access_token");
//授权用户唯一标识
String openID = object.getString("openid");
//校验accessToken是否有用
boolean accessTokenIsInvalid = WeiXinUtiles.isAccessTokenIsInvalid(accessToken, openID);
if (!accessTokenIsInvalid) {
throw new BaseSubException("校验accessToken是否有用已失效");
}
//获取微信用户基本信息
WeiXinParam appWeiXinUserInfo = WeiXinUtiles.getAppWeiXinUserInfo(accessToken, openID, WeiXinParam.class);
// TODO 业务逻辑
return Response.success();
}
} catch (Exception e) {
throw new RuntimeException(e);
}
}
return null;
}
```java
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class UserAppAuthority {
/**
* 新旧app 用来备份 自定义数据
*/
@NotNull(message = "类型不能为空")
private String type;
/**
* 重点需要 app调起微信获取到的code
*/
@NotNull(message = "code不能为空")
private String code;
}
@Data
public class WeiXinParam {
String openid = "";
String unionId = "";
String sex = "";
String nickname = "";
String city = "";
String province = "";
String country = "";
String avatarUrl = "";
String headimgurl="";
}
获取到用户信息,主要有以下信息
![在这里插入图片描述](https://img-blog.csdnimg.cn/9e11181d3460468ba838c27f57225087.png)
app授权微信登录
于 2023-11-10 11:44:47 首次发布