长沙经开区建设局网站,漳州专业网站建设公司,贵阳建网站公司,wordpress视频弹窗微信提供了两种方法都可以实现扫描登录。 一种是基于微信公众平台的扫码登录#xff0c;另一种是基于微信开放平台的扫码登录。 两者的区别: 微信开放平台需要企业认证才能注册#xff08;认证费用300元#xff0c;只需要认证1次#xff0c;后续不再需要进行缴费年审#… 微信提供了两种方法都可以实现扫描登录。 一种是基于微信公众平台的扫码登录另一种是基于微信开放平台的扫码登录。 两者的区别: 微信开放平台需要企业认证才能注册认证费用300元只需要认证1次后续不再需要进行缴费年审。 微信公众平台需要认证微信服务号认证费用300元/年才能进行扫码登录的开发。 本文主要介绍的是微信公众平台中的扫码登录。 微信公众号在线开发文档微信公众平台开发概述 | 微信开放文档 目录
一、应用场景
二、实现原理 三、需要用到的接口
1获取Access token
2生成带参数的二维码
3接收事件推送
四、核心部分代码
1获取access_token
2获取临时二维码
3微信推送事件方法
4request请求转换为Map方法
5检查微信登录状态
五、你可能会遇到的问题
1填写服务配置可能会遇到的问题
2本地正常服务器上无法调用
六、结语 一、应用场景 我在我的网站中实现了这个功能只需要使用微信扫描并关注公众号即可实现自动登录。 在线体验地址https://www.ewbang.com/community/login 首次扫码登录需要先进行关注公众号后续只需要使用微信扫码即可完成自动登录。 注你需要准备一个已经认证过的公众号或者测试号 二、实现原理 大致流程 1、用户访问微信快速登录页面生成带参数的二维码。 2、监听微信推送事件订阅或者扫码 3、用户扫码会有两种情况 ① 用户初次关注公众号订阅事件subscribe根据时间返回的OpenID进行查询如果系统中存在此用户直接调用系统登录方法否则创建默认账号并绑定OpenID再调用系统登录方法。 ② 用户之前关注过工作号扫码事件SCAN根据时间返回的OpenID进行查询如果系统中存在此用户直接调用系统登录方法否则创建默认账号并绑定OpenID再调用系统登录方法。 4、根据参数查询用户登录状态轮询登录成功之后重定向到指定页面。 运行流程图参考三、需要用到的接口
1获取Access token
https://developers.weixin.qq.com/doc/offiaccount/Basic_Information/Get_access_token.html
2生成带参数的二维码
https://developers.weixin.qq.com/doc/offiaccount/Account_Management/Generating_a_Parametric_QR_Code.html
3接收事件推送
https://developers.weixin.qq.com/doc/offiaccount/Message_Management/Receiving_event_pushes.html 这里只处理订阅事件和扫码事件即可。 四、核心部分代码 用到的部分依赖jar包 !-- hutool工具包 --dependencygroupIdcn.hutool/groupIdartifactIdhutool-all/artifactIdversion5.8.12/version/dependency!--生成二维码依赖包--dependencygroupIdcom.google.zxing/groupIdartifactIdcore/artifactIdversion3.3.3/version/dependency!--xml解析--dependencygroupIddom4j/groupIdartifactIddom4j/artifactIdversion1.6.1/version/dependency1获取access_token /*** 获取access_token** return*/public String createAccessToken() {String url https://api.weixin.qq.com/cgi-bin/token;MapString, Object data new HashMap();data.put(grant_type, client_credential);data.put(appid, wxConfig.getAppid());data.put(secret, wxConfig.getSecret());log.info(createAccessToken data:{}, data);String json HttpUtil.createGet(url).form(data).execute().body();String access_token (String) JSONUtil.getByPath(JSONUtil.parse(json), access_token);return access_token;}
2获取临时二维码 这里需要注意的是 action_nameQR_SCENE场景值ID临时二维码时为32位非0整型永久二维码时最大值为100000目前参数只支持1--100000 action_name:QR_STR_SCENE场景值ID字符串形式的ID字符串类型长度限制为1到64 /*** 创建临时二维码** return*/public String createTempQrCode(String access_token, String scene_str) {String url https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token access_token;MapString, Object data new HashMap();data.put(expire_seconds, 604800);data.put(action_name, QR_STR_SCENE);MapString, Object action_info new HashMap();MapString, Object scene new HashMap();scene.put(scene_str, scene_str);action_info.put(scene, scene);data.put(action_info, action_info);String json HttpUtil.createPost(url).header(Content-Type, application/json).body(JSONUtil.toJsonStr(data)).execute().body();System.out.println(json json);String qrcode (String) JSONUtil.getByPath(JSONUtil.parse(json), url);return qrcode;}
3微信推送事件方法 get请求接口主要用于签名验证。在配置开发者服务器配置(已启用)时会用到 post请求接口主要用于事件接收逻辑处理 /** param signature 微信加密签名signature结合了开发者填写的 token 参数和请求中的 timestamp 参数、nonce参数。* param timestamp 时间戳* param nonce 这是个随机数* param echostr 随机字符串验证成功后原样返回*/GetMapping(/wx/event)public void get(RequestParam(required false) String signature,RequestParam(required false) String timestamp,RequestParam(required false) String nonce,RequestParam(required false) String echostr,HttpServletResponse response) throws IOException {response.setCharacterEncoding(UTF-8);response.getWriter().write(echostr);response.getWriter().flush();response.getWriter().close();}//处理微信推送事件PostMapping(/wx/event)public void post(final HttpServletRequest request, HttpServletResponse response) {try {// 微信加密签名final String signature request.getParameter(signature);// 时间戳final String timestamp request.getParameter(timestamp);// 随机数final String nonce request.getParameter(nonce);// 随机字符串final String echostr request.getParameter(echostr);//将xml文件转成易处理的map(下方贴出)final MapString, String map parseXml(request);//开发者微信号final String toUserName map.get(ToUserName);//OpenIdfinal String fromUserName map.get(FromUserName);//消息创建时间 整型final String createTime map.get(CreateTime);//消息类型eventfinal String msgType map.get(MsgType);//事件类型final String event map.get(Event);String scene_str ;if (event.equals(msgType)) {if (event.equals(subscribe)) {final String ticket map.get(Ticket);if (ticket ! null) {scene_str map.get(EventKey).replace(qrscene_, );}}//注事件类型为SCAN即已关注else if (event.equals(SCAN)) {final String ticket map.get(Ticket);if (ticket ! null) {scene_str map.get(EventKey);}}}// 如果scene_str 不为空代表用户已经扫描并且关注了公众号if (StringUtils.isNotEmpty(scene_str)) {// 将微信公众号用户ID缓存到redis中标记用户已经扫码完成执行登录逻辑。redisCache.setCacheObject(scene_str, fromUserName, LoginStatus.SEESIOIN_TIME, TimeUnit.SECONDS);}response.getWriter().write();} catch (Exception e) {e.printStackTrace();}}
4request请求转换为Map方法 //将xml文件转成易处理的mappublic static MapString, String parseXml(final HttpServletRequest request) throws Exception {final MapString, String map new HashMapString, String();InputStream inputStream request.getInputStream();final SAXReader reader new SAXReader();final Document document reader.read(inputStream);final Element root document.getRootElement();final ListElement elementList (ListElement) root.elements();for (final Element e : elementList) {map.put(e.getName(), e.getText());}inputStream.close();inputStream null;return map;}
5检查微信登录状态 /*** 检查微信登录状态** return*/PostMapping(/wxLogin)ResponseBodypublic AjaxResult checkWxLoginStatus(HttpSession session) {String scene_str (String) session.getAttribute(scene_str);if (StringUtils.isEmpty(scene_str)) {return AjaxResult.custom(二维码已过期, 1001);}String loginStatus redisCache.getCacheObject(scene_str);if (LoginStatus.NOT_LOGIN.equals(loginStatus)) {return AjaxResult.custom(未登录, 1002);}//执行登录方法try {autoWxLogin(loginStatus);} catch (Exception e) {return AjaxResult.error(e.getMessage());}return AjaxResult.success(登录成功);}
五、你可能会遇到的问题
1填写服务配置可能会遇到的问题 如果配置的url不能访问会报token验证失败。在本地开发测试可以借助于网穿透工具Sunny-Ngrok内网转发内网穿透 - 国内内网映射服务器 2本地正常服务器上无法调用 有可能你在本地开发过程中是没有问题但是你将代码发布到服务器上的时候发现接口调用失败。有可能是你没有将公网服务器IP添加到白名单导致的。 多个白名单配置方法每行配置一个IP地址即可。 六、结语 本章教程到这里就结束了以上内容仅来自于博主的自我总结也许其中有总结不到为的地方希望能您够多多理解感谢你的阅读希望对你有一点点的帮助。