当前位置: 首页 > news >正文

使用weixin-java-miniapp实现微信小程序登录接口

maven 依赖

        <!--微信开源封装sdk-->
        <dependency>
            <groupId>com.github.binarywang</groupId>
            <artifactId>weixin-java-miniapp</artifactId>
            <version>3.6.0</version>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.10</version>
            <scope>provided</scope>
        </dependency>

code

@Data
public class LoginRequest {
    //用户登录凭证
    String code;

    //原始数据字符串
    String signature;

    //校验用户信息字符串
    String rawData;

    //加密用户数据
    String encryptedData;

    //加密算法的初始向量
    String iv;
}
import cn.binarywang.wx.miniapp.api.WxMaService;
import cn.binarywang.wx.miniapp.api.impl.WxMaServiceImpl;
import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult;
import cn.binarywang.wx.miniapp.bean.WxMaUserInfo;
import cn.binarywang.wx.miniapp.config.impl.WxMaDefaultConfigImpl;
import me.chanjar.weixin.common.error.WxErrorException;

/**
 * @describe: 类描述信息
 * @author: morningcat.zhang
 * @date: 2019/12/10 3:48 PM
 */
public class WxAppLoginService {

    public void login(LoginRequest request) throws WxErrorException {
        final WxMaService wxService = getWxMaService();

        // 获取微信用户session
        WxMaJscode2SessionResult session = wxService.getUserService().getSessionInfo(request.getCode());
        if (null == session) {
            throw new RuntimeException("login handler error");
        }

        // 解密用户信息
        WxMaUserInfo wxUserInfo = wxService.getUserService().getUserInfo(session.getSessionKey(),
                request.getEncryptedData(), request.getIv());
        if (null == wxUserInfo) {
            throw new RuntimeException("wxUser not exist");
        }
        
        // 解密手机号码信息
        WxMaPhoneNumberInfo wxMaPhoneNumberInfo = wxService.getUserService().getPhoneNoInfo(session.getSessionKey(),
                request.getEncryptedData(), request.getIv());
        if (Objects.isNull(wxMaPhoneNumberInfo) || StringUtils.isBlank(wxMaPhoneNumberInfo.getPhoneNumber())) {
            // 解密手机号码信息错误
        }
        
        System.out.printf("============用户登录注册获取微信用户信息===========> openId=%s, username=%s", wxUserInfo.getOpenId(), wxUserInfo.getNickName());
        String unionId = wxUserInfo.getUnionId();
        String openId = wxUserInfo.getOpenId();

    }

    private WxMaService getWxMaService() {
        WxMaDefaultConfigImpl config = new WxMaDefaultConfigImpl();
        config.setAppid("appId");
        config.setSecret("appSecret");
        config.setMsgDataFormat("JSON");
        WxMaService wxMaService = new WxMaServiceImpl();
        wxMaService.setWxMaConfig(config);
        return wxMaService;
    }
}

实践

请求入参

{
    "code": "071kqVIk1scL4o0ynUJk1YqEIk1kqVIt",
    "encryptedData": "fPjQvxaAYCKJFP3OTHmwLGgAMm8/MZPlCD/qdRKms1T3rij89kHKfSyrxEh68Ay8occT1wUb4F3Cw7lSPacz5ZHpnRUc3w8EUdz/fezCHDdq+Oh4yc3DzChAa77+28+3eCO0ReeB0yiWkfAiP3iLqic5O1d86ZXJbcpDSZa71EnvGJkNFjhhGJJhoDBC7pd/NW+n21RwTHLAwLoYqo+7aqnJSI+po9+42jRvI7EiEpjtb/LlsKOn4NELU4twGOTB3td1rrQ3BOlSFjqMsmDKiZ/deDPnnus4vaD4agDjUH9LGyqmpeLFfeK8mlSVIGk9wEdz1Wk+G53m8RfvkfZmtwiIHuFbWLmaw4Up1Jtt2kz02+G+5/BcGnPK7D8GSiP5Df0W88HsMofbgTo1yhu3fgKhYVEETNFsoxOzOa8O4QBrSiN7pzezxLhALvzxeNkjTeG4wQHnZm+mEW7LsTwgwGVAus9LWleG8mlSfPqSA8u8IOJacz9DWjehVed13GQX",
    "iv": "hF6Oi870Mgxcdhmnt5EZrA==",
    "rawData": {
        "nickName": "morningcat2018",
        "gender": 1,
        "language": "zh_CN",
        "city": "Hangzhou",
        "province": "Zhejiang",
        "country": "China",
        "avatarUrl": "https://wx.qlogo.cn/mmopen/vi_32/Q0j4TwGTfTK3EZ1I2fjXnGPBQSiaYSKRebYoawYXaOwbom50KdXicpQ1IRsd7xKp3e7oucb9scMOibk2uTviavpmibg/132"
    }
}

注意 : code 使用一次后就会失效

相关文章:

  • Python 下的虚拟环境的使用
  • C#3.0入门系列(三)
  • 一入 Java 深似海 -- S02E02 学习笔记
  • C#3.0入门系列(四)
  • GCC 的简单使用
  • 关于Keil 的一些看法
  • Jackson 简单使用记录
  • java基础设计 开源框架
  • Spring源码学习笔记
  • 正则资料笔记
  • C#接口慨述
  • Inversion of Control 简要笔记
  • 定义接口及定义接口成员
  • 小马哥讲Spring核心编程思想 - 第二章 重新认识IoC
  • 访问接口
  • 9月CHINA-PUB-OPENDAY技术沙龙——IPHONE
  • 【EOS】Cleos基础
  • CSS相对定位
  • Go 语言编译器的 //go: 详解
  • java 多线程基础, 我觉得还是有必要看看的
  • JavaScript异步流程控制的前世今生
  • java取消线程实例
  • js对象的深浅拷贝
  • Sass 快速入门教程
  • SQLServer之索引简介
  • 安装python包到指定虚拟环境
  • 百度贴吧爬虫node+vue baidu_tieba_crawler
  • 从0搭建SpringBoot的HelloWorld -- Java版本
  • 分布式任务队列Celery
  • 紧急通知:《观止-微软》请在经管柜购买!
  • 通信类
  • 微服务入门【系列视频课程】
  • 小而合理的前端理论:rscss和rsjs
  • 写代码的正确姿势
  • 原生Ajax
  • 正则表达式小结
  • # 20155222 2016-2017-2 《Java程序设计》第5周学习总结
  • #pragma预处理命令
  • (C语言)字符分类函数
  • (LNMP) How To Install Linux, nginx, MySQL, PHP
  • (PWM呼吸灯)合泰开发板HT66F2390-----点灯大师
  • (附源码)spring boot校园拼车微信小程序 毕业设计 091617
  • (蓝桥杯每日一题)love
  • (三)centos7案例实战—vmware虚拟机硬盘挂载与卸载
  • (原創) 如何優化ThinkPad X61開機速度? (NB) (ThinkPad) (X61) (OS) (Windows)
  • (原創) 是否该学PetShop将Model和BLL分开? (.NET) (N-Tier) (PetShop) (OO)
  • (转)http协议
  • (转)原始图像数据和PDF中的图像数据
  • (转载)从 Java 代码到 Java 堆
  • ./indexer: error while loading shared libraries: libmysqlclient.so.18: cannot open shared object fil
  • .NET Core WebAPI中使用swagger版本控制,添加注释
  • .net core 实现redis分片_基于 Redis 的分布式任务调度框架 earth-frost
  • .NET 编写一个可以异步等待循环中任何一个部分的 Awaiter
  • .Net 垃圾回收机制原理(二)
  • .net 无限分类