微信公众号二维码扫码登录SpringBoot Java实现
一、业务场景
用户扫描公众号的二维码,实现登录当前平台。
若未关注公众号,则关注后触发登录;若已关注,则直接登录。
登录时通过union_id判断用户是否在系统注册,若未注册则跳转到注册页面或提示未注册。
二、微信公众号准备
注意,此功能使用的接口,需要公众号类型为服务号才支持!
开发阶段,可使用微信提供的公众号测试号来联调,扫码登录即可。
三、涉及到微信公众号的接口
- 获取 Access token,这个是必备的接口,跟此功能无关
- 生成带参数的二维码,这个是微信生成公众号二维码图片链接的接口
- 接收事件推送,这个是每次用户扫码后微信通知我们服务的接口,会携带用户的union_id,open_id,订阅动作(首次订阅、已订阅、取消订阅),二维码的唯一参数(可生成二维码时自定义)
四、springboot项目中实现
1、添加微信依赖。
-
<dependency>
-
<groupId>com.github.binarywang</groupId>
-
<artifactId>weixin-java-mp</artifactId>
-
<version>3.4.0</version>
-
</dependency>
2、添加配置
-
wx:
-
open:
-
config:
-
appid: wxaf53b783b34xxxxx
-
secret: c637179625663cfe2462c73f42b0xxxx
-
token: b4a2ba6365f741e89ca7e42200cxxxxx
appid和secret获取位置:
token位置(下面配置回调地址时配置):
添加配置类
-
import lombok.Data;
-
import me.chanjar.weixin.mp.api.WxMpInMemoryConfigStorage;
-
import me.chanjar.weixin.mp.api.WxMpService;
-
import me.chanjar.weixin.mp.api.impl.WxMpServiceImpl;
-
import org.springframework.beans.factory.annotation.Value;
-
import org.springframework.context.annotation.Bean;
-
import org.springframework.context.annotation.Configuration;
-
-
-
-
public class WxOpenConfig {
-
-
-
private String appid;
-
-
-
private String secret;
-
-
-
private String token;
-
-
-
public WxMpService wxMpService() {
-
WxMpService service = new WxMpServiceImpl();
-
-
WxMpInMemoryConfigStorage configStorage = new WxMpInMemoryConfigStorage();
-
configStorage.setAppId(appid);
-
configStorage.setSecret(secret);
-
configStorage.setToken(token);
-
-
service.setWxMpConfigStorage(configStorage);
-
return service;
-
}
-
}
3、添加回调地址。
提供一个GET请求的接口。
-
-
private WxMpService wxMpService;
-
-
/**
-
* 校验微信token
-
*/
-
-
-
public String checkSignature(String signature, String timestamp, String nonce, String echostr) {
-
// 通过检验signature对请求进行校验,若校验成功则原样返回echostr,表示接入成功,否则接入失败
-
log.info("校验微信token,start");
-
if (wxMpService.checkSignature(timestamp, nonce, signature)) {
-
return echostr;
-
}
-
return "";
-
}
添加配置(添加完保存会回调):
4、开发获取微信二维码的接口。
-
/**
-
* 获取微信公众号二维码链接
-
**/
-
-
-
public HttpResult<WxMpQrVO> getMpQrCode() {
-
//sceneId 场景值 是我自定义的随机唯一字符串,登录使用,也可写死
-
String sceneId = RandomUtils.getRandomNumBeginOne(10);
-
WxMpQrCodeTicket wxMpQrCodeTicket;
-
try {
-
wxMpQrCodeTicket = wxMpService.getQrcodeService().qrCodeCreateTmpTicket(sceneId, 300);
-
//300为二维码有效期,单位秒
-
} catch (WxErrorException e) {
-
log.error("获取微信公众号二维码链接失败", e);
-
throw new BusinessException("获取微信公众号二维码链接失败");
-
}
-
-
WxMpQrVO wxMpQrVO = new WxMpQrVO();
-
BeanUtil.copyProperties(wxMpQrCodeTicket, wxMpQrVO);
-
wxMpQrVO.setSceneId(sceneId);
-
-
return HttpResult.success(wxMpQrVO);
-
}
VO的代码:
-
import io.swagger.annotations.ApiModelProperty;
-
import lombok.Data;
-
-
/**
-
* 获取公众号二维码地址
-
*
-
* @author zwb
-
* @version 1.0
-
* @date 2023-04-06 11:10
-
*/
-
-
public class WxMpQrVO {
-
-
-
protected String ticket;
-
-
-
protected int expireSeconds;
-
-
-
protected String url;
-
-
-
protected String sceneId;
-
-
}
5、扫码回调代码开发。
提供一个与第3步相同域名的POST接口。
-
/**
-
* 接收推送的数据
-
*/
-
-
-
public String subscribeProcessor(HttpServletRequest request) {
-
log.info("接收关注微信动作推送处理");
-
try {
-
// 获得Document
-
SAXReader reader = new SAXReader();
-
Document doc = reader.read(request.getInputStream());
-
// 解析xml,得到根节点
-
Element root = doc.getRootElement();
-
//发送方帐号(一个OpenID)
-
String fromUserName = root.elementText("FromUserName");
-
//消息创建时间 (整型)
-
String createTime = root.elementText("CreateTime");
-
//消息类型,event
-
String msgType = root.elementText("MsgType");
-
//事件类型,subscribe(订阅)、unsubscribe(取消订阅),SCAN
-
String event = root.elementText("Event");
-
// 事件KEY值,qrscene_为前缀,后面为二维码的参数值
-
String eventKey = root.elementText("EventKey").replace("qrscene_", "");
-
-
log.info("微信公众号接收信息:{},{},{},{},{},", fromUserName, createTime, msgType, event, eventKey);
-
-
WxMpUser wxMpUser = wxMpService.getUserService().userInfo(fromUserName);
-
if (Objects.isNull(wxMpUser)) {
-
throw new Exception(StrUtil.format("获取用户信息为空,fromUserName={}", fromUserName));
-
}
-
-
String openId = wxMpUser.getOpenId();
-
if ("subscribe".equals(event) || "SCAN".equals(event)) {
-
String unionId = wxMpUser.getUnionId();
-
-
//TODO 关注公众号触发事件,编写对应的处理逻辑,比如判断是登录还是注册,前端轮询通过sencenId或者二维码ticket去查
-
log.info("关注公众号触发事件,event[{}],FromUserName[{}],unionId[{}]", event, fromUserName, unionId);
-
-
} else if ("unsubscribe".equals(event)) {
-
// 取消关注公众号触发事件,编写对应的处理逻辑
-
log.info("取消关注公众号触发事件,event[{}],FromUserName[{}]", event, fromUserName);
-
-
}
-
} catch (Exception e) {
-
log.error("接收关注微信动作推送处理失败", e);
-
}
-
-
return "ok";
-
}
到此,核心的代码就结束了,欢迎感兴趣的小伙伴留言~
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhgakicj
系列文章
更多
同类精品
更多
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
怎样阻止微信小程序自动打开
PHP中文网 06-13 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01