IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> 微信小程序登陆 -> 正文阅读

[移动开发]微信小程序登陆

登陆流程

在这里插入图片描述

小程序登陆

由code获取OpenId

@GetMapping("/get-openid-sessionKey")
public AjaxResult getMiniOpenid(@RequestParam(value = "code") String code) {
    if (StringUtils.isBlank(code)) {
        return AjaxResult.error("","传入code为空");
    }
    try {
        GetOpenIdResponse getOpenIdResponse = new GetOpenIdResponse();
        String json = WxSessionKeyUtil.getOpenIdUrl("appid=" + appid + "&secret=" + appSecret + "&js_code="+  code + "&grant_type=authorization_code");
        if (StringUtils.isBlank(json)) {
            return AjaxResult.error("","获取OPENID失败,请检查code");
        }
        WxJscode2session wxJscode2session = JacksonUtils.toObject(objectMapper, json, WxJscode2session.class);
        if (!wxJscode2session.ok()) {
            return AjaxResult.error("","获取OPENID失败,请检查code");
        }
        getOpenIdResponse.setOpenid(wxJscode2session.getOpenid());
        getOpenIdResponse.setSessionKey(wxJscode2session.getSession_key());
        return AjaxResult.success(getOpenIdResponse);
    } catch (Exception e) {
        return AjaxResult.error("",e.getMessage());
    }
}

数据解密登陆 或者直接跳转用户绑定手机号

解析到手机号

@GetMapping("/get-phone")
public  AjaxResult  getPhoneNumber(@RequestParam(value = "openId") String openId,@RequestParam(value = "sessionKey") String sessionKey,
      @RequestParam(value = "encryptedData") String encryptedData, @RequestParam(value = "iv") String iv)throws Exception{
    String decrypt = WxEncodeUtil.decrypt(appid, encryptedData.replace(" ","+"), sessionKey, iv);
    if (StringUtils.isBlank(decrypt)) {
        return AjaxResult.error("解密数据为空,请检查小程序配置");
    }
    JSONObject jsonObject = JSONObject.parseObject(decrypt);
    if (jsonObject == null) {
        return AjaxResult.error("解密手机号失败,请检查小程序配置");
    }
    // 手机号码
    String phone = (String) jsonObject.get("phoneNumber");
    if (StringUtils.isBlank(phone)) {
        return AjaxResult.error("手机号解密为空");
    }
    //微信登录
    //获取手机号后 查询数据库 判断是否有该用户 没有新增用户
    return faithUserService.bindWechatAuth(openId,phone,"xcx");
}

解密工具类

package com.ruoyi.common.core.utils.wechat;

import com.alibaba.fastjson.JSONObject;
import org.apache.commons.codec.binary.Base64;

public class WxEncodeUtil {
    private static final String WATERMARK = "watermark";
    private static final String APPID = "appid";
    /**
     * 解密数据
     * @return
     * @throws Exception
     */
    public static String decrypt(String appId, String encryptedData, String sessionKey, String iv){
        String result = "";
        try {
            AES aes = new AES();
            byte[] resultByte = aes.decrypt(Base64.decodeBase64(encryptedData), Base64.decodeBase64(sessionKey), Base64.decodeBase64(iv));
            if(null != resultByte && resultByte.length > 0){
                result = new String(WxPKCS7Encoder.decode(resultByte));
                JSONObject jsonObject = JSONObject.parseObject(result);
                String decryptAppid = jsonObject.getJSONObject(WATERMARK).getString(APPID);
                if(!appId.equals(decryptAppid)){
                    result = "";
                }
            }
        } catch (Exception e) {
            result = "";
            e.printStackTrace();
        }
        return result;
    }


    public static void main(String[] args) throws Exception{
        String appId = "";
        String encryptedData = "";
        String sessionKey = "";
        String iv = "";
        System.out.println(decrypt(appId, encryptedData, sessionKey, iv));
    }
}

网站微信登录

三方微信登录权限认证 获取用户数据工具类

package com.ruoyi.user.wx.utils;


import cn.hutool.core.map.MapUtil;
import cn.hutool.http.HttpUtil;
import cn.hutool.json.JSONUtil;
import com.ruoyi.common.core.enums.RequestSourceType;
import com.ruoyi.user.wx.domain.GetTokenResponse;
import com.ruoyi.user.wx.domain.ReTokenResponse;
import com.ruoyi.user.wx.domain.WXUserInfoResponse;
import com.ruoyi.user.wx.domain.WechatProperties;
import lombok.NoArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.core.env.Environment;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.lang.reflect.Field;
import java.util.Map;

@NoArgsConstructor
@Component
@Slf4j
public class WXLoginUtils {
    @Resource
    private Environment env;

    @Resource
    private WechatProperties wxProperties;

    //确认来源
    public void confirmSource(RequestSourceType requestSource) {
        if (requestSource == RequestSourceType.WEB) {
            Field[] declaredFields = wxProperties.getClass().getDeclaredFields();
            //便利所有属性 赋值
            for (Field field : declaredFields) {
                String property = env.getProperty("tencent.webWeChat"+"."+field.getName());
                field.setAccessible(true);
                try {
                    field.set(wxProperties, property);
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                }
            }
        } else {
            Field[] declaredFields = wxProperties.getClass().getDeclaredFields();
            for (Field field : declaredFields) {
                String property = env.getProperty("tencent.weChat"+"."+field.getName());
                field.setAccessible(true);
                try {
                    field.set(wxProperties, property);
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                }
            }
        }
    }


    //通过code获取access_token
    public GetTokenResponse getAccessToken(String code) {
        String url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=" + wxProperties.getAppId() + "&secret=" + wxProperties.getAppSecret() + "&code=" + code + "&grant_type=authorization_code";
        String result = HttpUtil.get(url);
        log.info("获取access_token返回结果:" + result);
        return JSONUtil.toBean(result, GetTokenResponse.class);

    }

    //校验access_token是否有效
    public Boolean checkAccessToken(String accessToken, String openId) {
        String url = "https://api.weixin.qq.com/sns/auth?access_token=" + accessToken + "&openid=" + openId;
        String result = HttpUtil.get(url);
        log.info("校验access_token返回结果:" + result);
        Map map = JSONUtil.toBean(result, Map.class);
        if (MapUtil.getInt(map, "errcode") == 0 && MapUtil.getStr(map, "errmsg").equals("ok")) {
            return true;
        }
        return false;
    }

    //刷新access_token有效期
    public ReTokenResponse refreshAccessToken(String refresh_token) {
        String url = "https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=" + wxProperties.getAppId() + "&grant_type=refresh_token&refresh_token=" + refresh_token;
        String result = HttpUtil.get(url);
        log.info("刷新access_token返回结果:" + result);
        return JSONUtil.toBean(result, ReTokenResponse.class);
    }

    //获取用户信息
    public WXUserInfoResponse getUserInfo(String accessToken, String openId) {
        String url = "https://api.weixin.qq.com/sns/userinfo?access_token=" + accessToken + "&openid=" + openId + "&lang=zh_CN";
        String result = HttpUtil.get(url);
        log.info("获取用户信息返回结果:" + result);
        return JSONUtil.toBean(result, WXUserInfoResponse.class);
    }
    //获取微信登陆信息
    public WXUserInfoResponse getWXUserInfo(String code,RequestSourceType type){
        confirmSource(type);
        //获取access_token
        GetTokenResponse tokenResponse= getAccessToken(code);
        //检验access_token是否有效
        if (!checkAccessToken(tokenResponse.getAccess_token(), tokenResponse.getOpenid())) {
            //刷新token
            ReTokenResponse reTokenResponse = refreshAccessToken(tokenResponse.getRefresh_token());
            tokenResponse.setRefresh_token(reTokenResponse.getRefresh_token());
            tokenResponse.setAccess_token(reTokenResponse.getAccess_token());
        }
        //获取微信用户信息
        return getUserInfo(tokenResponse.getAccess_token(), tokenResponse.getOpenid());
    }
}

pojo

token包装

import lombok.Data;

@Data
public class GetTokenResponse {

    private String access_token;
    private Integer expires_in;
    private String refresh_token;
    private String openid;
    private String unionid;
}

token刷新封装

@Data
public class ReTokenResponse {
    private String access_token;
    private Integer expires_in;
    private String refresh_token;
    private String openid;
    private String scope;
}

用户信息封装

@Data
public class WXUserInfoResponse {
    private String openid;
    private String nickname;
    private int sex;
    private String province;
    private String country;
    private String headimgurl;
    private String[] privilege;
    private String unionid;
}

请求来源字典

@Getter
@AllArgsConstructor
public enum RequestSourceType {

    XCX("xcx"),
    WEB("web"),
    APP("app"),
    ;
    private String value;
}
  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2022-04-27 11:27:30  更:2022-04-27 11:28:53 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 0:05:33-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码