若依cloud版集成微信扫码登录-绑定篇

前言

集成微信扫码登录的话,需要把项目的账号和微信账号进行绑定,然后才可以进行扫码登录

本篇内容是项目绑定微信

还需要申请一个微信开放平台账号

微信公众平台申请(测试平台)-CSDN博客

平台的项目回调接口可以先不写,等写完项目再填

数据库

sys_user表新增字段

后端

CacheConstants新增常量

/*** 微信openid redis key*/
public static final String WX_OPENID_KEY = "wx_openid:";

在system模块下新增WXController

@RequestMapping("/wei")
@RestController
public class WXController {private static final Logger logger = LoggerFactory.getLogger(WXController.class);@Autowiredprivate RedisTemplate<String,String> redisTemplate;@Autowiredprivate TokenService tokenService;@Autowiredprivate ISysUserService sysUserService;@Autowiredprivate ISysPermissionService iSysPermissionService;/*** 获取openid*/@GetMapping("/bind-openid")public AjaxResult getOpenid(@RequestParam("code") String code, @RequestParam("key") String key) throws IOException{AjaxResult ajax = AjaxResult.success();SysUser u = sysUserService.getOpenid(code);logger.info("获取到的用户信息对象:{]",u);String openid = u.getOpenid();String s = redisTemplate.opsForValue().get(CacheConstants.LOGIN_TOKEN_KEY + key);JSONObject jsonObject = JSONObject.parseObject(s);String string = jsonObject.getString("sysUser");SysUser sysUser = JSONObject.parseObject(string, SysUser.class);SysUser user = new SysUser();user.setUserId(sysUser.getUserId());user.setOpenid(openid);user.setWxNickName(u.getWxNickName());sysUserService.updateUserOpenid(user);ajax.put("openid", openid);ajax.put("wxnickname", u.getWxNickName());return ajax;}/*** 已登录用户uuid查询openid*/@GetMapping("/uuid")public AjaxResult getCode(@RequestParam("uuid") String uuid) throws IOException{AjaxResult ajax = AjaxResult.success();String s = redisTemplate.opsForValue().get(CacheConstants.LOGIN_TOKEN_KEY + uuid);JSONObject jsonObject = JSONObject.parseObject(s);String string = jsonObject.getString("sysUser");SysUser sysUser = JSONObject.parseObject(string, SysUser.class);SysUser user = sysUserService.selectUserById(sysUser.getUserId());System.out.println("user-openid: " + user.getOpenid());System.out.println("user-wxnickname: " + user.getWxNickName());if (user.getOpenid() != null) {ajax.put("openid", user.getOpenid());ajax.put("wxnickname", user.getWxNickName());}ajax.put("status", user.getOpenid() != null && !user.getOpenid().isEmpty() ? 1: 0);return ajax;}/*** 微信授权回调接口* @param request* @param response* @throws Exception*/@RequestMapping(value = "/wx.do")public void get(HttpServletRequest request, HttpServletResponse response) throws Exception {logger.error("WechatController   ----   WechatController");System.out.println("========WechatController========= ");logger.info("请求进来了...");Enumeration pNames = request.getParameterNames();while (pNames.hasMoreElements()) {String name = (String) pNames.nextElement();String value = request.getParameter(name);String log = "name =" + name + "     value =" + value;logger.error(log);}String signature = request.getParameter("signature");/// 微信加密签名String timestamp = request.getParameter("timestamp");/// 时间戳String nonce = request.getParameter("nonce"); /// 随机数String echostr = request.getParameter("echostr"); // 随机字符串PrintWriter out = response.getWriter();out.print(echostr);out.close();}}

service层实现getOpenid方法和updateUserOpenid方法

    @Overridepublic SysUser getOpenid(String code) {RestTemplate restTemplate = new RestTemplate();JSONObject jsonData = null;// 构建获取access_token的URLString url = "https://api.weixin.qq.com/sns/oauth2/access_token?"+ "appid=" + appId+ "&secret=" + secret+ "&code=" + code+ "&grant_type=authorization_code";System.out.println("url: " + url);ResponseEntity<String> responseEntity = restTemplate.getForEntity(url, String.class);System.out.println("responseEntity: " + responseEntity);if (responseEntity.getStatusCodeValue() == 200 && responseEntity.getBody() != null) {jsonData = JSONObject.parseObject(responseEntity.getBody());}String userInfoUrl = "https://api.weixin.qq.com/sns/userinfo?lang=zh_CN"+ "&access_token=" + jsonData.getString("access_token")+ "&openid=" + jsonData.getString("openid");ResponseEntity<String> responseUserEntity = restTemplate.getForEntity(userInfoUrl, String.class);if (responseUserEntity.getStatusCodeValue() == 200 && responseUserEntity.getBody() != null) {JSONObject jsonUserData = JSONObject.parseObject(new String(responseUserEntity.getBody().getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8));System.out.println("jsonUserData: " + jsonUserData);SysUser user = new SysUser();user.setOpenid(jsonUserData.getString("openid"));user.setWxNickName(jsonUserData.getString("nickname"));return user;}return null;}@Overridepublic int updateUserOpenid(SysUser sysUser) {int i = userMapper.updateUser(sysUser);return i;}

在配置文件中配置微信公众号信息

# 公众号配置
wechat:# 应用IDappid:# 应用密钥secret:

 serviceImpl实现层新增属性

@Value("${wechat.appid}")
private String appId;@Value("${wechat.secret}")
private String secret;

 mapper.xml更新

<resultMap type="com.ruoyi.system.domain.SysUser" id="SysUserResult">...	<result property="wxNickName"       column="wx_nick_name"       /><result property="openid"       column="openid"       />...</resultMap><update id="updateUser" parameterType="SysUser">...<if test="openid != null and openid != ''">openid = #{openid},</if><if test="wxNickName != null and wxNickName != ''">wx_nick_name = #{wxNickName},</if>...
</update>

SysUser更新

/** 用户微信昵称 */
@Excel(name = "用户微信昵称")
private String wxNickName;/** openid */
@Excel(name = "openid")
private String openid;public String getOpenid()
{return openid;
}public void setOpenid(String openid)
{this.openid = openid;
}public String getWxNickName()
{return wxNickName;
}public void setWxNickName(String wxNickName)
{this.wxNickName = wxNickName;
}

网关记得放行路径,我直接放行/wei/**

前端

修改ruoyi-ui/src/views/system/user/profile/userInfo.vue

   <el-form-item label="微信"><span class="mr10">{{form.wxnickname || '未绑定'}}</span><el-button v-if="form.openid == '' || form.openid == null" :loading="bindloading" size="medium" type="primary" class="btn" @click.stop="wxBind()">绑 定</el-button><el-button v-else :loading="bindloading" size="medium" type="primary" class="btn" @click.stop="unBind()">解绑</el-button></el-form-item><el-dialog title="绑定微信" custom-class="bind-dialog" class="new-common-dialog" :visible.sync="bindWxVisible" :close-on-click-modal="false" :close-on-press-escape="false" @close="wxLoginClose" width="320px"><div class="qr-code"><vue-qr :text="qrUrl" :size="280"></vue-qr></div></el-dialog></el-form>

这里需要下载一个二维码的插件

npm install vue-qr --save

引入组件

components: {vueQr,
},

导入依赖以及方法 

import { updateUserProfile } from "@/api/system/user";
import { getUUid } from '@/api/system/wei'
import { getToken } from '@/utils/auth'
import vueQr from 'vue-qr'

data新增属性

    timer: null,bindWxVisible: false,bindloading: false,qrUrl: '',

修改user方法

    user: {handler(user) {console.log('user', this.user)if (user) {this.form = {nickName: user.nickName,wxnickname: user.wxNickName,phonenumber: user.phonenumber,email: user.email,sex: user.sex,openid: user.openid};}},immediate: true}

 新增微信绑定方法

    wxBind() {let token = getToken()console.log(token)const key = JSON.parse(atob(token.split('.')[1]))['user_key'];const redirect_uri = `${公网ip或域名}/system/wei/bind-openid?key=${key}` //回调地址const codeUrl = `https://open.weixin.qq.com/connect/oauth2/authorize?appid=${微信公众号appid}&redirect_uri=${encodeURIComponent(redirect_uri)}&response_type=code&scope=snsapi_userinfo&state=123456#wechat_redirect`this.qrUrl = codeUrlconsole.log(this.qrUrl)this.bindWxVisible = truelet that = thisthis.timer = setInterval(function() {getUUid({uuid: key}).then((res) => {console.log(res)if (res.status === 1) {that.bindWxVisible = falsethat.form.openid = res.openidthat.form.wxnickname = res.wxnicknamethat.$message({type: 'success',message: '操作成功',})clearTimeout(this.timer)}}).catch((err) => {clearTimeout(that.timer)})}, 1000)},wxLoginClose() {this.timer && clearTimeout(this.timer)},

 注意:回调地址一定要写对,公众号的回调地址要和这个保持一致,域名和开放接口也要和这个保持一致

效果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/58476.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

鸿蒙应用App测试-通用测试

注意&#xff1a;大家记得学完通用测试记得再学鸿蒙专项测试 鸿蒙应用App测试-专项测试&#xff08;DevEco Testing&#xff09;-CSDN博客 注意&#xff1a;博主有个鸿蒙专栏&#xff0c;里面从上到下有关于鸿蒙next的教学文档&#xff0c;大家感兴趣可以学习下 如果大家觉得…

Linux 配置JDK

文章目录 一、下载Oracle-JDK1.1、如何正确的下载JDK二、配置JDK环境变量2.1 环境变量配置2.1.1、修改vim /etc/profile 添加jdk的路径一、下载Oracle-JDK 1.1、如何正确的下载JDK 首先我要安装的是oracle-jdk,这个时候什么地方都不要去,就去oracle的官网,然后找到,jdk的下…

springBoot 自动配置与starter

目录 一、自动配置 Springboot实现自动配置的核心机制 Conditional的作用是什么&#xff1f; 如何自定义自动配置&#xff1f; 步骤 例子分析 自动配置的优先级 如何禁用特定的自动配置&#xff1f; 二、starter 如何理解Spring Boot中的starter&#xff1f; 如何自…

Json 类型与多值索引 — OceanBase 4.3.2 AP 功能体验

本文来自 2024年OceanBase技术征文大赛——“让技术被看见 | OceanBase 布道师计划”的用户征文。也欢迎更多的技术爱好者参与征文&#xff0c;赢取万元大奖。和我们一起&#xff0c;用文字让代码跳动起来&#xff01; 参与2024年OceanBase技术征文大赛>> MySQL在5.7.8…

Spark on YARN:Spark集群模式之Yarn模式的原理、搭建与实践

Spark 的介绍与搭建&#xff1a;从理论到实践-CSDN博客 Spark 的Standalone集群环境安装与测试-CSDN博客 PySpark 本地开发环境搭建与实践-CSDN博客 Spark 程序开发与提交&#xff1a;本地与集群模式全解析-CSDN博客 目录 一、Spark on YARN 的优势 &#xff08;一&#…

java后端工程师转行AI大模型岗,工作、自我提升两不误!

随着技术的不断进步&#xff0c;人工智能&#xff08;AI&#xff09;已经成为当今科技领域最热门的话题之一。许多开发者开始考虑从传统的软件开发领域&#xff0c;如Java&#xff0c;转向人工智能领域&#xff0c;今天小编和大家一起来探讨Java开发者是否可以转型到人工智能&a…

Rust-宏编程

巴山楚水凄凉地&#xff0c;二十三年弃置身。 怀旧空吟闻笛赋&#xff0c;到乡翻似烂柯人。 沉舟侧畔千帆过&#xff0c;病树前头万木春。 今日听君歌一曲&#xff0c;暂凭杯酒长精神。 ——《酬乐天扬州初逢席上见赠》唐刘禹锡 【哲理】翻覆的船只旁仍有千千万万的帆船经过&a…

leetcode912.排序数组的题解

题目描述&#xff1a; 题目要求在不使用任何内置函数的情况下解决问题&#xff0c;时间复杂度为 O(nlog(n))。 笔者使用了快速排序&#xff0c;但是直接使用最原始的快速排序&#xff0c;有些特殊的测试用例会超时。 1&#xff09;如果数组本身基本有序&#xff0c;则使用原始…

TikTok品牌出海:从“流量为王”到“价值为王”

随着市场竞争的加剧&#xff0c;品牌逐渐意识到&#xff0c;仅仅依靠流量已不足以在海外市场立足&#xff0c;必须实现从“流量为王”到“价值为王”的转变。本文Nox聚星将和大家探讨品牌如何与TikTok达人合作&#xff0c;在海外市场中建立长期稳定的品牌形象。 一、品牌出海的…

纯血鸿蒙系统 HarmonyOS NEXT自动化测试实践

1、测试框架选择 hdc&#xff1a;类似 android 系统的 adb 命令&#xff0c;提供设备信息查询&#xff0c;包管理&#xff0c;调试相关的命令ohos.UiTest&#xff1a;鸿蒙 sdk 的一部分&#xff0c;类似 android sdk 里的uiautomator&#xff0c;基于 Accessibility 服务&…

Kafka 可观测性最佳实践

Kafka 概述 Kafka 是由 LinkedIn 开发一个分布式的基于发布订阅模式的消息队列&#xff0c;是一个实时数据处理系统&#xff0c;可以横向扩展。与 RabbitMQ、RockerMQ 等中间件一样拥有几大特点&#xff1a; 异步处理服务解耦流量削峰 监控 Kafka 是非常重要的&#xff0c;因…

《XGBoost算法的原理推导》12-13树的叶子节点权重w和映射关系q 公式解析

本文是将文章《XGBoost算法的原理推导》中的公式单独拿出来做一个详细的解析&#xff0c;便于初学者更好的理解。 我们重新定义一颗树&#xff0c;包括两个部分&#xff1a; 叶子结点的权重向量 w w w&#xff1b;实例 -> 叶子结点的映射关系 q q q&#xff08;本质是树的…

电商API:开启电商新时代的关键钥匙

一、电商API&#xff1a;定义与发展 电商API&#xff0c;即应用程序编程接口&#xff0c;是连接不同软件系统的桥梁&#xff0c;在电商领域中发挥着至关重要的作用。电商API的发展历程可以追溯到20世纪90年代&#xff0c;当时电子商务刚刚兴起&#xff0c;企业开始意识到通过A…

C++__XCode工程中Debug版本库向Release版本库的切换

Debug和Release版本分别设置编译后&#xff0c;就分别得到了对应的lib库&#xff0c;如下图&#xff1a; 再生成Release后如下图&#xff1a;

消费疲软下,家居品牌如何利用营销实现新的突围与增长?

在消费疲软的大环境下&#xff0c;家居品牌面临着前所未有的挑战与机遇。尤其以耐消品为主的家居行业&#xff0c;也受到一定程度影响——有效需求不足导致产能过剩&#xff0c;营销乏力&#xff0c;市场竞争开始变得激烈&#xff0c;不少家居品牌正在面临业绩压力。家居品牌如…

连985都没有面试机会 二本就更没戏了:瞎说,这就是三年高考的意义

最近有二本同学在直播里说&#xff1a;“看到很多面经说&#xff0c;连985同学都没有面试机会&#xff0c;而且是零offer。那我们二本就更没戏了。” 其实这种言论是在瞎扯。 我们一直在强调校招是分层的。 现在学生太多了&#xff0c;而且招聘对学历是有要求的。比如大厂的…

微信小程序运营日记(第四天)

2024年11月6日-星期三-2024年45周 {微信小程序的时间板块进行一个增加&#xff0c;增加&#xff1a;2024年第45周|共53周&#xff0c;星期三&#xff0c;今年时间剩余&#xff0c;本周时间剩余} 开源竞争&#xff1a; 开源竞争&#xff08;当你无法掌握一个技术就开源这个技术…

高分辨率高电流监控器电路设计

1 简介 该单电源电流检测解决方案可以在分流电阻器上测量50mA 至10A 范围内的电流信号。电流检测放大器可以在0V 至75V 的宽共模电压范围内测量分流电阻器。全差分放大器(FDA) 执行单端至差分转换&#xff0c;并以1MSPS 的最大数据速率驱动范围为5V 的SAR ADC 差分输入。可以调…

ALB搭建

ALB: 多级分发、消除单点故障提升应用系统的可用性&#xff08;健康检查&#xff09;。 海量微服务间的高效API通信。 自带DDoS防护&#xff0c;集成Web应用防火墙 配置&#xff1a; 1.创建ECS实例 2.搭建应用 此处安装的LNMP 3.创建应用型负载均衡ALB实例 需要创建服务关联角…

【客观理性深入讨论国产中间件及数据库-科创基础软件】

随着国产化的进程&#xff0c;越来越多的国企央企开始要求软件产品匹配过程化的要求&#xff0c; 最近有一家银行保险的科技公司对行为验证码产品就要求匹配国产中间件&#xff0c; 于是开始了解国产中间件都有哪些厂家 一&#xff1a;国产中间件主要产品及厂商 1 东方通&…