返回顶部
首页 > 资讯 > 移动开发 >【Springboot】整合wxjava实现 微信小程序:授权登录
  • 579
分享到

【Springboot】整合wxjava实现 微信小程序:授权登录

微信小程序springboot小程序 2023-09-09 09:09:18 579人浏览 独家记忆
摘要

文章目录 一、wxjava是什么二、使用步骤1.引入依赖2.配置yml3.小程序的配置4.后端的业务逻辑代码controllerserviceimpldto 5.前端的业务逻辑代码新建


文章目录


提示:以下是本篇文章正文内容,下面案例可供参考

一、wxjava是什么

WxJava - 微信开发 Java SDK,支持微信支付、开放平台、公众号、企业号/企业微信、小程序等的后端开发。
官方的gitee仓库地址
官方的github仓库地址
官方的关于微信小程序的demo

二、使用步骤

1.引入依赖

导入wxjava的Maven依赖

<dependency>  <groupId>com.GitHub.binarywanggroupId>  <artifactId>weixin-java-miniappartifactId>  <version>4.3.0version>dependency>

2.配置yml

wx:  miniapp:    configs:      - appid: #微信小程序的appid        secret: #微信小程序的Secret        token: #微信小程序消息服务器配置的token        aesKey: #微信小程序消息服务器配置的EncodingAESKey        msgDataFORMat: JSON

3.小程序的配置

WxMaProperties 用于读取yml配置的信息

import lombok.Data;import org.springframework.boot.context.properties.ConfigurationProperties;import java.util.List;@Data@ConfigurationProperties(prefix = "wx.miniapp")public class WxMaProperties {    private List<Config> configs;    @Data    public static class Config {                private String appid;                private String secret;                private String token;                private String aesKey;                private String msgDataFormat;    }}

WxMaconfiguration

import cn.binarywang.wx.miniapp.api.WxMaService;import cn.binarywang.wx.miniapp.api.impl.WxMaServiceImpl;import cn.binarywang.wx.miniapp.bean.WxMaKefuMessage;import cn.binarywang.wx.miniapp.bean.WxMaSubscribeMessage;import cn.binarywang.wx.miniapp.config.impl.WxMaDefaultConfigImpl;import cn.binarywang.wx.miniapp.message.WxMaMessageHandler;import cn.binarywang.wx.miniapp.message.WxMaMessageRouter;import com.Google.common.collect.Lists;import lombok.extern.slf4j.Slf4j;import me.chanjar.weixin.common.bean.result.WxMediaUploadResult;import me.chanjar.weixin.common.error.WxErrorException;import me.chanjar.weixin.common.error.WxRuntimeException;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.boot.context.properties.EnableConfigurationProperties;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import java.io.File;import java.util.List;import java.util.stream.Collectors;@Slf4j@Configuration@EnableConfigurationProperties(WxMaProperties.class)public class WxMaConfiguration {    private final WxMaProperties properties;    @Autowired    public WxMaConfiguration(WxMaProperties properties) {        this.properties = properties;    }    @Bean    public WxMaService wxMaService() {        List<WxMaProperties.Config> configs = this.properties.getConfigs();        if (configs == null) {            throw new WxRuntimeException("大哥,拜托先看下项目首页的说明(readme文件),添加下相关配置,注意别配错了!");        }        WxMaService maService = new WxMaServiceImpl();        maService.setMultiConfigs(            configs.stream()                .map(a -> {                    WxMaDefaultConfigImpl config = new WxMaDefaultConfigImpl();//                WxMaDefaultConfigImpl config = new WxMaRedisConfigImpl(new JedisPool());                    // 使用上面的配置时,需要同时引入jedis-lock的依赖,否则会报类无法找到的异常                    config.setAppid(a.getAppid());                    config.setSecret(a.getSecret());                    config.setToken(a.getToken());                    config.setAesKey(a.getAesKey());                    config.setMsgDataFormat(a.getMsgDataFormat());                    return config;                }).collect(Collectors.toMap(WxMaDefaultConfigImpl::getAppid, a -> a, (o, n) -> o)));        return maService;    }    @Bean    public WxMaMessageRouter wxMaMessageRouter(WxMaService wxMaService) {        final WxMaMessageRouter router = new WxMaMessageRouter(wxMaService);        router            .rule().handler(logHandler).next()            .rule().async(false).content("订阅消息").handler(subscribeMsgHandler).end()            .rule().async(false).content("文本").handler(textHandler).end()            .rule().async(false).content("图片").handler(picHandler).end()            .rule().async(false).content("二维码").handler(qrcodeHandler).end();        return router;    }    private final WxMaMessageHandler subscribeMsgHandler = (wxMessage, context, service, sessionManager) -> {        service.getMsgService().sendSubscribeMsg(WxMaSubscribeMessage.builder()            .templateId("此处更换为自己的模板id")            .data(Lists.newArrayList(                new WxMaSubscribeMessage.MsgData("keyWord1", "339208499")))            .toUser(wxMessage.getFromUser())            .build());        return null;    };    private final WxMaMessageHandler logHandler = (wxMessage, context, service, sessionManager) -> {        log.info("收到消息:" + wxMessage.toString());        service.getMsgService().sendKefuMsg(WxMaKefuMessage.newTextBuilder().content("收到信息为:" + wxMessage.tojson())            .toUser(wxMessage.getFromUser()).build());        return null;    };    private final WxMaMessageHandler textHandler = (wxMessage, context, service, sessionManager) -> {        service.getMsgService().sendKefuMsg(WxMaKefuMessage.newTextBuilder().content("回复文本消息")            .toUser(wxMessage.getFromUser()).build());        return null;    };    private final WxMaMessageHandler picHandler = (wxMessage, context, service, sessionManager) -> {        try {            WxMediaUploadResult uploadResult = service.getMediaService()                .uploadMedia("image", "png",                    ClassLoader.getSystemResourceAsStream("tmp.png"));            service.getMsgService().sendKefuMsg(                WxMaKefuMessage                    .newImageBuilder()                    .mediaid(uploadResult.getMediaId())                    .toUser(wxMessage.getFromUser())                    .build());        } catch (WxErrorException e) {            e.printStackTrace();        }        return null;    };    private final WxMaMessageHandler qrcodeHandler = (wxMessage, context, service, sessionManager) -> {        try {            final File file = service.getQrcodeService().createQrcode("123", 430);            WxMediaUploadResult uploadResult = service.getMediaService().uploadMedia("image", file);            service.getMsgService().sendKefuMsg(                WxMaKefuMessage                    .newImageBuilder()                    .mediaId(uploadResult.getMediaId())                    .toUser(wxMessage.getFromUser())                    .build());        } catch (WxErrorException e) {            e.printStackTrace();        }        return null;    };}

这个是官方demo里面的,就是读取application.yml配置的信息进行初始化
其实里面很多内容你自己可以提取出来单独封装。后面会一一实现

4.后端的业务逻辑代码

controller

import cn.binarywang.wx.miniapp.api.WxMaService;import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult;import cn.binarywang.wx.miniapp.bean.WxMaUserInfo;import com.example.wxjava.common.result.R;import com.example.wxjava.domain.dto.WxUserInfo;import com.example.wxjava.service.UserInfoService;import lombok.RequiredArgsConstructor;import lombok.extern.slf4j.Slf4j;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.WEB.bind.annotation.*;@Slf4j@RestController@RequestMapping("/wx/user")@RequiredArgsConstructor(onConstructor_ = @Autowired)public class WxUserInfoController {    private final WxMaService wxMaService;    private final UserInfoService userInfoService;        @GetMapping("/login")    public R<WxMaJscode2SessionResult> login(@RequestParam("code") String code) {        return userInfoService.login(code);    }        @PostMapping("/getUserInfo")    public R<WxMaUserInfo> getUserInfo(@RequestBody WxUserInfo userInfo) {        return userInfoService.getUserInfo(userInfo);    }}

R 是我自己封装的统一返回类。大家可以自行设置返回类型

service

import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult;import cn.binarywang.wx.miniapp.bean.WxMaUserInfo;import com.example.wxjava.common.result.R;import com.example.wxjava.domain.dto.WxUserInfo;public interface UserInfoService {        R<WxMaJscode2SessionResult> login(String code);        R<WxMaUserInfo> getUserInfo(WxUserInfo userInfo);}

impl

import cn.binarywang.wx.miniapp.api.WxMaService;import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult;import cn.binarywang.wx.miniapp.bean.WxMaUserInfo;import cn.binarywang.wx.miniapp.util.WxMaConfigHolder;import com.example.wxjava.common.result.R;import com.example.wxjava.domain.dto.WxUserInfo;import com.example.wxjava.service.UserInfoService;import lombok.RequiredArgsConstructor;import lombok.extern.slf4j.Slf4j;import me.chanjar.weixin.common.error.WxErrorException;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;@Slf4j@Service@RequiredArgsConstructor(onConstructor_ = @Autowired)public class UserInfoServiceImpl implements UserInfoService {    private final WxMaService wxMaService;        @Override    public R<WxMaJscode2SessionResult> login(String code) {        try {            WxMaJscode2SessionResult session = wxMaService.getUserService().getSessionInfo(code);            log.info(session.getSessionKey());            log.info(session.getOpenid());            //TODO 可以增加自己的逻辑,关联业务相关数据            return R.ok(session);        } catch (WxErrorException e) {            log.error(e.getMessage(), e);            return R.error(e.toString());        } finally {            WxMaConfigHolder.remove();//清理ThreadLocal        }    }    @Override    public R<WxMaUserInfo> getUserInfo(WxUserInfo userInfo) {        // 用户信息校验        if (!wxMaService.getUserService().checkUserInfo(userInfo.getSessionKey(), userInfo.getRawData(), userInfo.getSignature())) {            WxMaConfigHolder.remove();//清理ThreadLocal            return R.error("user check failed");        }        // 解密用户信息        WxMaUserInfo wxMaUserInfo = wxMaService.getUserService().getUserInfo(userInfo.getSessionKey(), userInfo.getEncryptedData(), userInfo.getIv());        WxMaConfigHolder.remove();//清理ThreadLocal        return R.ok(wxMaUserInfo);    }}

dto

这个其实是我测试的时候,一个对象,测试wxjava解密用户的信息。因为后端接收json对象需要对象或者map接收。

@Data@Accessors(chain = true)public class WxUserInfo implements Serializable {    private String appid;    private String sessionKey;        private String signature;        private String rawData;        private String encryptedData;        private String iv;}

目录结构
在这里插入图片描述

5.前端的业务逻辑代码

因为我前端也不是很好。所以就一个简单的demo
前端使用的是uniapp。大家可以去官网学习查看uniapp

新建项目

使用HBuilder X 新建一个uniapp的项目
在这里插入图片描述
然后在index.Vue编写逻辑代码
大家可以将我这个拷贝过去。完美匹配我上面的后端代码

<template><view class="content"><button @click="login()">微信登录button>view>template><script>export default {data() {return {title: 'Hello',sessionKey: ''}},onLoad() {},methods: {async login(){let that = this //保存当前作用域await uni.login({ //直接用这个调用微信接口onlyAuthorize:true,success:function(response){ // 用微信登录的话就要去微信开发工具console.log(response) //这里打印就说明接口调用成功了,然后看message login :ok//微信登录就完了,后面就是获取用户信息uni.request({url: 'Http://localhost:8888/wx/user/login',data: {code: response.code},success(res) {console.log("sessionkey",res)that.sessionKey = res.data.data.sessionKey}})}})await uni.getUserProfile({desc:'测试用例',success:function(res){console.log("res",res)uni.request({url: 'http://localhost:8888/wx/user/getUserInfo',method: 'POST',dataType: 'json',data: {rawData: res.rawData,signature: res.signature,encryptedData: res.encryptedData,iv: res.iv,sessionKey: that.sessionKey},success(resc) {console.log("登录成功",resc)}})}})}}}script><style>style>

微信开发者工具

直接选择运行到微信开发者工具
在这里插入图片描述
然后在微信开发者工具
在这里插入图片描述
点击测试:
在这里插入图片描述
可以看到。调用起来了。
然后看控制台:
在这里插入图片描述
我们的第二个接口也完美调用。返回了用户的信息。虽然uniapp的接口可以直接获取用户的信息。
但是如果后端想要获取到这些信息。

  • 一种是前端发过来。
  • 一种是先登录。然后返回前端一个sessionkey。然后前端将rawData,signature,encryptedData,还有iv发过了。我们自己使用wxjava进行解析。

ok,到这儿就结束了。

来源地址:https://blog.csdn.net/m0_49683806/article/details/126032270

--结束END--

本文标题: 【Springboot】整合wxjava实现 微信小程序:授权登录

本文链接: https://lsjlt.com/news/401220.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 【Springboot】整合wxjava实现 微信小程序:授权登录
    文章目录 一、wxjava是什么二、使用步骤1.引入依赖2.配置yml3.小程序的配置4.后端的业务逻辑代码controllerserviceimpldto 5.前端的业务逻辑代码新建...
    99+
    2023-09-09
    微信小程序 spring boot 小程序
  • 微信小程序授权登录
    微信小程序—授权登录 一、小程序登录 登录流程时序 说明: 1.小程序端调用 wx.login() 获取临时登录凭证code ,并回传到开发者服务器。 2.服务器调用 code2Session 接口,换取 用户唯一标识 OpenID 和 ...
    99+
    2023-09-01
    微信小程序 小程序 微信 授权登录
  • 微信小程序如何实现授权登录
    这篇文章给大家分享的是有关微信小程序如何实现授权登录的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、前言由于微信官方修改了 getUserInfo 接口,所以现在无法实现一进入...
    99+
    2024-04-02
  • 简单实现微信小程序授权登录
    可以直接复制粘贴,只需要改一些东西就可以了 首先在wxml中用微信自带的button开放属性 授权登录 然后在对应的js中创建一个login方法,因为上面bindtap指向的是login,所以就要创建一个新的方法 login(evt){/...
    99+
    2023-10-04
    php 微信小程序
  • 【微信授权登录】uniapp开发小程序,实现获取微信授权登录功能
    一、解题思路: 微信授权登录(获取用户信息) 1.先获取用户信息——用户授权允许后,通过调用uni.login 可以获取到code。 2.拿着获取到的code去调用——登录接口,可以获取到token。 3.把token存入缓存。就可以在页面...
    99+
    2023-08-16
    小程序 微信 javascript
  • 结合若依框架实现微信小程序授权登录
    文章目录 1 前言1.1 环境准备1.2 登录流程 2.小程序代码2.1 新增按钮微信授权登录2.2 创建wx.Login和wxHandleLogin方法 3.后端代码3.1 yml配置文件中新增微信小程序id和秘钥3.2 ...
    99+
    2023-08-16
    微信小程序 小程序 前端
  • 如何实现微信小程序之授权登录
    这篇文章主要介绍如何实现微信小程序之授权登录,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!1.实现思路自己写一个微信授权登录页面让用户实现点击的功能,也就是实现了通过 button 组件去触发 getUserInof...
    99+
    2023-06-14
  • 微信小程序如何授权登录
    小编给大家分享一下微信小程序如何授权登录,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!注:没有在微信开放平台做开发者资质认证的就...
    99+
    2024-04-02
  • 怎么授权登录微信小程序
    本篇文章为大家展示了怎么授权登录微信小程序,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。授权登录的基本流程上图是微信小程序官网提供的授权登录基本流程图,这里我只从前端开发的角度来讲解一下该流程。通过...
    99+
    2023-06-08
  • 如何实现uni-app微信小程序授权登录
    小编给大家分享一下如何实现uni-app微信小程序授权登录,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一、appID相关申请和配置1. appid获取方式登录微...
    99+
    2023-06-22
  • 微信小程序授权登录功能如何实现
    这篇文章主要介绍“微信小程序授权登录功能如何实现”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“微信小程序授权登录功能如何实现”文章能帮助大家解决问题。微信授权登录我们的项目开发有时候用到用户的一些信...
    99+
    2023-07-05
  • uni-app 微信小程序授权登录的实现步骤
    目录一、appID相关申请和配置1. appid获取方式2. appID配置二、获取用户基础数据2.1. 获取用户信息2.2. 获取用户信息2三、调用登录api3.1. 登录api3...
    99+
    2024-04-02
  • 微信小程序实现授权登录之获取用户信息
    本文实例为大家分享了微信小程序实现获取用户信息的具体代码,供大家参考,具体内容如下 小程序登录 小程序可以通过微信官方提供的登录能力方便地获取微信提供的用户身份标识,快速建立小程序内...
    99+
    2024-04-02
  • springboot+jwt+微信小程序授权登录获取token的方法实例
    目录前言配置XcxAuthenticationProviderXcxAuthenticationToken小程序授权登录前言 我们有时候在开发中,遇到这样的问题,就是我们需要小程序授...
    99+
    2024-04-02
  • 微信小程序中如何实现用户登录和授权
    在微信小程序中实现用户登录和授权的流程大致如下: 获取用户授权:在小程序中,需要使用wx.login()和wx.getUserI...
    99+
    2024-04-03
    微信小程序
  • uniapp开发小程序,实现获取【微信授权登录】功能
    APP微信授权登录需要到微信开放平台申请,在HBuilderX配置APP SDK中微信登录的appId,另外需要跟小程序、公众号授权账号互通的话也需要在微信开放平台申请 1、在微信公众平台申请应用,获取相应的appid和appsecret ...
    99+
    2023-09-28
    uni-app 小程序 微信
  • 基于Thinkphp5+EasyWeChat+fastadmin微信小程序授权登录&获取手机号&微信公众号网页---联合授权登录
    战前准备 使用 composer 安装 EasyWeChat $ composer require overtrue/wechat:~4.0 -vvv 或者在composer.json文件renqui...
    99+
    2023-09-12
    php
  • 微信小程序实现授权登录之怎么获取用户信息
    这篇文章主要讲解了“微信小程序实现授权登录之怎么获取用户信息”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“微信小程序实现授权登录之怎么获取用户信息”吧!小程序登录小程序可以通过微信官方提供的...
    99+
    2023-06-30
  • springboot整合IJPay实现微信支付-V3---微信小程序
    前言 微信支付适用于许多场合,如小程序、网页支付、但微信支付相对于其他支付方式略显麻烦,我们使用IJpay框架进行整合 一、IJpay是什么? JPay 让支付触手可及,封装了微信支付、支...
    99+
    2023-09-23
    微信小程序 微信 小程序 spring Powered by 金山文档
  • 微信小程序的授权登录-Java 后端 (Spring boot)
    微信开发文档链接:https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/login.html 1. 前提 一个可以测试的微信小程序此微信小程序的APP...
    99+
    2023-10-18
    微信小程序 java spring boot
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作