一图讲清楚公众号扫码关注绑定手机号自动登录_讯息
日常开发中,相信不管做 C 端还是 B 端业务的同学都会遇到微信相关的业务,比如微信登录、微信支付、公众号扫码关注等场景。
最近博主在做公众号扫码关注自动登录这一块的业务,因此总结绘制了一张公众号扫码关注绑定手机号自动登录流程图分享给大家。
1. 准备工作推荐博主开源的 H5 商城项目waynboot-mall,这是一套全部开源的微商城项目,包含三个项目:运营后台、H5 商城前台和服务端接口。实现了商城所需的首页展示、商品分类、商品详情、商品 sku、分词搜索、购物车、结算下单、支付宝/微信支付、收单评论以及完善的后台管理等一系列功能。 技术上基于最新得 Springboot3.0、jdk17,整合了 MySql、Redis、RabbitMQ、ElasticSearch 等常用中间件。分模块设计、简洁易维护,欢迎大家点个 star、关注博主。
【资料图】
github 地址:https://github.com/wayn111/waynboot-mall
想要达到用户扫描二维码打开微信公众号主页并且关注后自动登录,目前只能通过接入公众号的服务器配置来完成,下面介绍下前置准备。
注册微信公众平台服务号(注意:不要注册成订阅号!因为生成带参数的二维码这个接口只有服务号能调用)
开通微信认证(注意:微信认证每年需要交 300 块钱),如下图展示即可认为前两步配置已完成。
进入公众号后管【设置与开发】-【基本设置】,点击开发者密码(AppSecret)启用,拿到 appId、secret,
部署服务端代码(需公网,因为第五步的服务器地址需要公网才能验证通过)
准备公网服务器一台。下载 weixin-java-mp-demo 项目代码,地址:https://github.com/binarywang/weixin-java-mp-demo。按照 readme 文档说明,修改 yml 文件的appId、secret为第二步中的 appId、secret,token、aesKey等第五步设置完替换,如下是 weixin-java-mp-demo 项目的使用步骤。将 weixin-java-mp-demo 部署到公网服务器上就 ok 了。进入公众号后管【设置与开发】-【基本设置】,点击服务器配置启用后,填写相关的服务器地址、令牌、消息加解密密钥、消息加解密方式,点击提交等待服务器地址验证通过后即完成了所有前置准备工作。
2. 扫码关注自动流程ps: 公众号接入服务器配置后,以前设置的自动回复和自定义菜单就失效了,后续自定义菜单只能通过调用公众号的api接口来进行设置,自动回复则需要在 weixin-java-mp-demo 项目的事件接收代码中进行回复。
现在我们基于公众号内提供的 api 来完成扫码关注自动登录的操作,流程如下,
2.1 客户端流程用户打开网页、TV 端时请求服务端接口获取公众号二维码以及用户标识。根据用户标识轮询用户扫码状态接口,获取用户是否注册信息。用户扫码后如果是已注册就根据轮询接口返回的 token 进行登录。用户扫码后如果是未注册就弹出绑定手机号弹窗,当用户绑定成功根据绑定接口返回的 token 进行登录。2.2 服务端流程服务端需要提供三个接口以及监听扫码事件来获取用户 openId 并以此判断该扫码用户是否注册。
生成带参数的二维码以及用户标识接口,生成带参数的二维码主要根据公众号提供的接口文档中生成带参数的二维码这个接口,以此当用户扫码后点击关注,服务端便可以接收到用户的关注事件。如果是已关注用户扫码,服务端就会接收到扫码事件,下面是生成参数二维码后的扫码事件相关说明。
用户扫码状态轮询接口,轮询接口需要返回三个基本状态。状态一继续轮询,状态二未注册提示绑定手机,状态三已注册就返回 token 进行登录,是否注册的判断需要在接收到关注、扫码事件时根据 openId 去数据库中查询用户的注册状态。
用户扫码关注后,服务端接收到相关事件,根据 openId 判断用户是否已注册,已注册就将轮询接口设置为已注册,并生成用户token。未注册就将轮询接口设置为未注册,提示绑定手机。
绑定手机号接口,到了绑定手机号接口就相对独立一些,不在依赖公众号相关接口以及事件通知,绑定成功返回用户登录 token 即可。
2.3 用户扫码流程用户扫码流程只有用户扫码的动作。
扫码后未关注时,只有用户点击关注按钮,服务端就会收到关注事件。扫码后已关注,服务端就会收到扫码事件。3. 代码示例3.1 生成带参数二维码@PostMapping("userQrcodeCreate")private Result userQrcodeCreate(@RequestBody @Validated WeixinMPRequestVO req) { log.info("========================userQrcodeCreate begin, req:{}========================", req); WeixinQrcodeResponseVO weixinQrcodeResponseVO = new WeixinQrcodeResponseVO(); try { if (!this.wxMpService.switchover(properties.getCurAppid())) { throw new IllegalArgumentException(String.format("未找到对应appid=[%s]的配置,请核实!", properties.getCurAppid())); } String sceneType = req.getSceneType(); String uuid = IdUtil.fastSimpleUUID(); // 临时ticket WxMpQrCodeTicket ticket = wxMpService.getQrcodeService().qrCodeCreateTmpTicket(sceneType + WEIXIN_MP_SCENCE_SPLIT + uuid, WEIXIN_MP_USER_STATUS.getExpireTime()); String showQrCodeUrl = wxMpService.getQrcodeService().qrCodePictureUrl(ticket.getTicket()); Response response = HttpToolUtil.getRequest(showQrCodeUrl); if (!response.isSuccessful()) { return ResultUtil.error(ErrorCode.WEIXIN_CREATE_QRCODE_ERROR); } try (InputStream inputStream = response.body().byteStream()) { String base64 = ImageUtil.imgToBase64(inputStream, "image/jpg"); weixinQrcodeResponseVO.setImgBase64str(base64); weixinQrcodeResponseVO.setUuid(uuid); // 设置开始轮询 redisUtil.set(WEIXIN_MP_USER_STATUS.getKey(uuid), UserSanLoopStatusEnum.LOOP.getType(), WEIXIN_MP_USER_STATUS.getExpireTime()); } } catch (Exception e) { log.error("创建场景二维码失败", e); return ResultUtil.error(ErrorCode.WEIXIN_CREATE_QRCODE_ERROR); } Result success = ResultUtil.success(weixinQrcodeResponseVO); log.info("userQrcodeCreate end, resp:{}", success); return success;} 3.2 扫码后轮询// 轮询状态枚举public enum UserSanLoopStatusEnum { /** * 已过期 */ EXPIRED(1), /** * 继续轮询 */ LOOP(2), /** * 已注册 */ REG(3), /** * 未注册 */ NOT_REG(4), ;}// 开始轮询public WeixinUserStatusResponseVO userStatus(WeixinMPRequestVO req) { String uuid = req.getUuid(); String source = req.getSource(); String openId = (String) redisUtil.get(WEIXIN_MP_USER_OPENID.getKey(uuid)); WeixinUserStatusResponseVO weixinUserStatusResponseVO = new WeixinUserStatusResponseVO(); Object value = redisUtil.get(WEIXIN_MP_USER_STATUS.getKey(uuid)); if (value == null) { return weixinUserStatusResponseVO.setStatus(UserSanLoopStatusEnum.EXPIRED.getType()); } Integer status = (Integer) value; // 如果用户扫码是已注册,就直接根据openId获取用户token if (status.equals(UserSanLoopStatusEnum.REG.getType())) { String token = getToken(openId); weixinUserStatusResponseVO.setToken(token); } return weixinUserStatusResponseVO.setStatus(status);}3.3 关注事件处理@Componentpublic class SubscribeHandler extends AbstractHandler { @Autowired private ScanScenesHandler scanScenesHandler; @Override public WxMpXmlOutMessage handle(WxMpXmlMessage wxMessage, Map context, WxMpService weixinService, WxSessionManager sessionManager) throws WxErrorException { String openId = wxMessage.getFromUser(); this.logger.info("根据openid判断用户是否已注册" ); WxMpXmlOutMessage responseResult = null; try { responseResult = scanScenesHandler.handleSpecial(wxMessage, userWxInfo); } catch (Exception e) { this.logger.error(e.getMessage(), e); } ... return null; }} 3.3 扫码事件处理@Componentpublic class ScanHandler extends AbstractHandler { @Autowired private ScanScenesHandler scanScenesHandler; @Autowired private WeixinMpMsgReplyService weixinMpMsgReplyService; @Override public WxMpXmlOutMessage handle(WxMpXmlMessage wxMessage, Map map, WxMpService weixinService, WxSessionManager wxSessionManager) throws WxErrorException { String openId = wxMessage.getFromUser(); this.logger.info("根据openid判断用户是否已注册" ); WxMpXmlOutMessage responseResult = null; try { responseResult = scanScenesHandler.handleSpecial(wxMessage, userWxInfo); } catch (Exception e) { this.logger.error(e.getMessage(), e); } ... return null; }} 总结自此,本文所讲述的公众号扫码关注绑定手机号自动登录流程就讲解完毕了。
关注公众号【waynblog】每周分享技术干货、开源项目、实战经验、高效开发工具等,您的关注将是我的更新动力!
标签:
推荐
- 一图讲清楚公众号扫码关注绑定手机号自动登录_讯息
- 即时焦点:工学交替啥意思_ldquo 工学交替 rdquo 是什么意思
- 电脑误删除的文件怎么恢复快捷键(电脑误删除的文件怎么恢复)
- 空调吹热风不制冷怎么解决(空调的热风是从上往下 还是从下往上走)
- 今日视点:威尔史密斯评分最高的四部电影_史密斯的10部电影推荐
- 今年以来2.8万头海南供港澳活猪优“鲜”通关
- 全球快资讯丨北京大兴天宫院:“招商引资助力团”和“营商环境监督员”正式“上岗”啦!
- 中国总装的空客飞机首次交付欧洲客户|环球速看
- 当前速看:开展餐饮业燃气使用安全培训很有必要!
- 环球即时:骁龙750g和骁龙870哪个好
- 大爆冷!头号种子单局1比11遭逆转,华裔怪球手零封卫冕冠军
- 如何在城校共生共融中彰显办学特色 许昌学院这样做 头条焦点
- 【环球播资讯】实现网络零售额391.6亿元,“2023重庆6·18电商节”成绩亮眼
- 送情郎歌词岳云鹏试听_送情郎歌词岳云鹏|世界热讯
- 世界看点:陷入爱里面韩语怎么说 陷入爱里面韩语
- 翡翠原石专业知识教程 学会这样看翡翠原石你就不在是小白_世界热推荐
- 安控科技:目前公司产品还未在宜宾每户天然气管道入户换新中应用
- 全球头条:中海油服:上半年实现净利润11.03亿元 同比增长37.6%
- jpg转换成png格式透明 png格式透明背景图_新视野
- 陕西将开展学校食堂承包企业食品安全专项排查整治
- 从上海到深圳,一线城市全线掉头,赶出去的工厂又要请回来? 微头条
- 世界头条:有渠道能修改高考分数?警方提醒!
- 模拟炒股在哪里找_老钱庄模拟炒股入口在哪|前沿热点
- 汶川县突发山洪泥石流灾害,7人失联,正在全力搜救中-环球观察
- mac high sierra(关于mac high sierra的基本详情介绍)
- 2023-06-27 09:54甘肃高速公路最新路况实时播报-全球实时
- 高坪“绣”出醉美生态画卷_每日简讯
- 2023年高考分数线汇总 来看看你那里是多少
- 好一多领鲜 | 天眼早新闻 6月27日
- 全球观天下!我国浅层常压页岩气开采取得突破
- 祥明智能:融资净偿还334.74万元,融资余额5330.52万元(06-26)
- 新天绿能(600956)6月26日主力资金净买入650.07万元 当前热讯
- 艺妓(关于艺妓的基本详情介绍)
- 小孩子戒奶的正确方法_戒奶的正确方法
- 二本公办大学有哪些_杭州临安有哪些风景区
- 有源音箱电路板上怎么取5v电压(有源音箱电路板)_焦点日报
- 世界信息:什么是贯彻执行_ldquo 贯彻执行 rdquo 的含义
- 今日热文:广东30565人,超600分!
- 中药配方颗粒龙头红日药业创始人筹划减持,核心业务仍未走出新旧标准切换“阵痛”
- “二阳”体验 全球热资讯
- 什么?听说你家有小火车!-世界速看
- 定量描述分析(关于定量描述分析介绍)|当前观察
- 深南电A:电力主营业务未发生实质性变化 今日关注
- 最新工资价位表来了!哪些职业、岗位工资更高?
- 河北张家口桥西:督导河道环境整治获人大代表肯定|今日热闻
- 法国兴业银行:美元/南非兰特短期可能升向19.02和19.23
- 每日热讯!十七冶南京分公司召开中冶集团《工程项目管理手册质量分册》宣贯培训会议
- 环球快播:照片墙怎么布置好看又漂亮(照片墙怎么布置好看)
- Yes, I'm a Witch | 是的,我就是个女巫 天天关注
- 国际热评:日本应正视福岛核污水问题 停止混淆视听 世界资讯
- “网红”的迁徙:主播涌向东南亚|天天热文
- 宝云寺
- 精准定位“四角色”下好法治建设“一盘棋”北京海关行政复议化解率超九成
- 天天热议:转扩!事关燃气,这些事必知
- 《向往的生活 》王勉、王俊凯到访蘑菇屋|环球热头条
- A股午评:创业板指探底回升跌0.16%,AI概念股继续调整 讯息
- 憋气多久算正常人_憋气多久算正常|天天看热讯
- 全球即时看!泰和科技:第二大股东拟减持不超1.06%公司股份
- 端午假期重庆两江游共计接待游客3.9万人次_要闻
- 美媒:美国情报部门于6月中旬得知普里戈任正谋划在俄罗斯采取武装行动
- 杭州海博翻译社(杭州海博翻译社)
- 斯柯达SUV怎么样及宝沃bx5多少钱_今日讯
- 罗隐采得百花成蜜后(采得百花成蜜后的下一句)
- 世界讯息:4-0横扫日本张本智和,轰11-9、11-7、11-6,孙闻3-0横扫冲击冠军
- 实力出众,三款15-20万级合资中型车推荐,都是稳妥的选择 每日视点
- 构建“景区+村庄”联合机制 一方山水绘就增收致富新画卷_世界讯息
- 郑板桥难得糊涂书法十八字 郑板桥难得糊涂书法
- 买冰箱注意什么主要看哪方面_买冰箱需要注意什么 全球看点
- 韩国市民团体敦促日本政府在陆地保管核污染水
- 普里戈任接受调停将前往白俄罗斯 其刑事立案将被撤销
- 收藏 | 通俗易懂!关于储能那些事儿 环球速递
- 机构不看好?多只债基净值创新高后遭大额赎回
- 中式台球锦标赛(关于中式台球锦标赛的基本详情介绍) 天天看点
- 当前热点-Theshy送出关键节奏,BLG远古龙怒斩WBG!Poke阵容下次真别玩了
- 天天热讯:言叶之庭结局好吗_言叶之庭结局
- 听取蛙声一片全诗朗诵(听取蛙声一片全诗)|独家
- 丰田开发车辆设计AI工具:可自动生成汽车外形 快看点
- 环球今日报丨广末凉子的婚姻,是在体验地狱式打怪吗?
- 宋清溪窑黑瓷钵
- 小米手机摄像头模糊是什么原因_手机摄像头模糊是什么原因
- 明日之后沙石堡探索点最新_明日之后沙石堡探索点
- 世界即时:4399用户名忘了怎么办_4399用户名
- 当前热门:上海越剧院官网 打响上海文化品牌
- 天天微动态丨毕业离别赠言
- 世界杯!预测中国男篮12人大名单 乔尔杰维奇或带上2米20小将 天天快讯
- 宁夏开展烧烤店燃气爆炸事故善后处置
- 我是大运火炬手丨谢悦:“垒”落不凡的姐姐_环球关注
- 3本精品小说,一本史诗奇幻,一本都市重生,一本刑侦探案|焦点日报
- 绵阳这个文科班考出4个645分以上的高分-每日看点
- 天天微资讯!由来不羡瓦松高的秋天(由来不羡瓦松高)
- 对话尼山 看数字与文明的梦幻联动 每日时讯
- 三证合一是哪年(三证合一从什么时候开始实施的) 世界今日报
- 女儿国主题曲_女儿国遇难
- 生物具有的七个基本特征_生物的基本特征有哪些
- dota2贴吧_dotafarm 每日看点
- 公司管理模式有哪些_公司管理模式
- 黄伟明的个人资料(黄伟明)|天天最资讯
- 世界关注:未签劳动合同做了一年多,辞职老板不放人怎么办
- 老神在在的(老神在在) 环球新资讯
- ESR(01821)拟根据20亿美元多币种债券发行计划发行以日圆计值的票据
X 关闭
行业规章
X 关闭

【资料图】