app授权微信登录

工具类
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)


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值