智能提醒助理系列-服务号静默登录

news2024/9/27 12:08:30

        本系列文章记录“智能提醒助理”wx公众号 建设历程,记录实践经验、巩固知识点、锻炼总结能力。

本文介绍,如何让用户进入公众号之后就锁定用户,使用既注册,进入既可使用功能,去掉繁琐的登录认证流程。

一、需求出发点

当用户进入公众号后 就可以识别到用户标识,进行静默注册,后续就可以对用户提供推送或唤醒功能,同时获取unionID 与小程序进行关联绑定。

二、实现路径分析

1、在公众号菜单或者 设置的欢迎消息中 放置URL链接,用户点击链接 授权获取code,回调服务端, 服务端通过code 获取accessToken、openid和unionid。

2、对接公众号的关注事件,通过关注事件可以直接拿到openid。

方案1:可以获取到用户的头像、昵称信息,只要在微信环境中就可以,不用关注公众号,意味着可以通过链接转发,H5等方式方分享到群、朋友圈等。

方案2:仅可以拿到openid,不能获取到头像,昵称,优势是 关注公众号 即可获取unionID 锁定用户。

三、最终方案

 方案1+方案2 结合使用。

方案1 用户链接分享引流,获取更新头像和昵称。

方案2 用于公众号 关注即注册。

四、实施路径

方案1:用户链接分享引流,获取更新头像和昵称。

1、设置菜单,暴露URL链接

在公众号中配置菜单链接,或者回复消息中设置链接


URL 格式:
https://open.weixin.qq.com/connect/oauth2/authorize?appid=公众号APPID&redirect_uri=服务端回调接口地址&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect

举例:
https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx56521ff82d0dxxx&redirect_uri=https://youdomain.com/api/auth/mpLogin&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect

2、设置回调处理,获取code换取openid

3、通过openid拉取用户昵称头像

注意:处理成功之后 需要重定向到一个页面,给用户一个反馈和引导。

服务端通过code 获取accessToken、openid和unionid
https://api.weixin.qq.com/sns/oauth2/access_token

再通过开放平台 使用openid拉取用户信息
https://api.weixin.qq.com/sns/userinfo?access_token=

@RequestMapping("mpLogin")
  public String mpLogin(String code, String state, HttpServletResponse response) throws IOException {
    log.info("获取微信响应的参数code:{},state:{}",code,state);
    // 1、获取 登陆凭证code
    if (StringUtils.isEmpty(code)) {
      return "code获取失败!";
    }

    // 2、通过code 获取accessToken、openid和unionid
    String resData = null;
    try {
      resData = wechatUtil.mpOauth2(code);
    } catch (IOException e) {
      log.error("mpOauth2",e);
      return "获取openid失败!";
    }

    HashMap<String, String> sessionData = JsonUtil.toObj(resData, HashMap.class);
    log.info("H5登陆sessionData:" + sessionData);

    String mpOpenid = sessionData.get("openid");
    String unionId = sessionData.get("unionid");

    // 解析响应结果
    if (null == sessionData || StringUtils.isEmpty(mpOpenid)) {
      return "解析openid失败!";
    }

    // 3、拉取用户信息
    JSONObject wxUser = wechatUtil.getMpUserInfo(sessionData.get("access_token"),mpOpenid);
    String avatar = wxUser.getString("headimgurl");
    String nickname = wxUser.getString("nickname");

    String loginIp = IpUtils.getIpAddr(request);
    // 静默注册
    UserInfo userInfo = userInfoService.silenceRegister(unionId,loginIp,"",mpOpenid,avatar,nickname);

    log.info("公众号方式登录-账号绑定,静默注册完成:{}",userInfo.getId());

    // 绑定成功提示
//    response.sendRedirect("https://mp.weixin.qq.com/s/IU1-K2sixLsjscWy1sM7yw");

    // 使用微信头像和昵称成功提示
    response.sendRedirect("https://mp.weixin.qq.com/s/zykJLau9cSC8uR3g7zJFlg");
    return "";
  }

方案2:公众号 关注即注册

1、对接公众号关注事件接口

2、监听事件获取openid 静默登录

/**
   * 接受微信回调过来的事件<br/>
   * <a href="https://developers.weixin.qq.com/doc/offiaccount/Message_Management/Receiving_standard_messages.html">官方文档</a><br/>
   * 微信服务器在五秒内收不到响应会断掉连接,并且重新发起请求,总共重试三次。
   * 假如服务器无法保证在五秒内处理并回复,可以直接回复空串,微信服务器不会对此作任何处理,并且不会发起重试。
   */
  @PostMapping("/configAuth")
  public String receiveEvent(@RequestBody String data) {
    try {
      log.info("1微信推送的事件xml数据:{}",data);

      //1、xmltobean 获取消息对象
      WechatReceiveMsg wechatReceive = (WechatReceiveMsg) XmlUtil.xmlStrToJavaBean(data, WechatReceiveMsg.class);

      //2、获取消息类型,根据Event 获取事件类型 unsubscribe subscribe
      String messageType = wechatReceive.getMsgType();
      String eventType = wechatReceive.getEvent();
      // 发送方帐号(用户open_id)
      String mpOpenid = wechatReceive.getFromUserName();
      // 服务号主体(app_id)gh_75bf3c1b76b2
      String mpAppId = wechatReceive.getToUserName();

      //判断消息类型是否是事件消息类型
      if (messageType.equals(WxMsgTypeEnum.EVENT.getCode())) {
        log.info("公众号====>{}事件消息",eventType);

        if (eventType.equals(WxEventEnum.SUBSCRIBE.getCode())) {
          log.info("公众号====>新用户关注");
          //3-1、关注服务号事件:
          // 根据openid 拉取用户信息 获取unionid
          // https://api.weixin.qq.com/cgi-bin/user/info
          String unionid = wechatUtil.getUnionID(mpOpenid);


          // 静默注册
          UserInfo userInfo = userInfoService.silenceRegister(unionid,"","",mpOpenid);
          log.info("关注服务号事件,静默注册完成:{}",userInfo.getId());

          // 关注服务号 返回首次关注 交互信息。
          String reply_msg = paramDictService.getKey(CacheConstant.MP_FIRST_REPLY_MSG);
          String firstReply = wechatUtil.replyMpTextEvent(mpAppId,mpOpenid, reply_msg);
          log.info("用户首次关注回复内容:{}",firstReply);


          return firstReply;
        } else if (eventType.equals(WxEventEnum.UNSUBSCRIBE.getCode())) {
          //3-2、取消关注服务号事件:根据openid 查找用户,清理掉openid字段
          userInfoService.resetUserMpOpenId(mpOpenid);
          log.info("公众号====>用户{}取消关注处理成功",mpOpenid);
        } else {
          // 3-3、其他事件
          log.info("用户:{}发送了{}类型的事件:{}",mpOpenid,wechatReceive.getMsgType(),wechatReceive.getContent());
        }
      } 
    } catch (Exception e) {
      log.error("微信推送的事件,处理异常",e);
    }
    return "";
  }

五、总结

静默登录的好处,在于无感平滑使用,提升用户交互体验。

在不同的场景使用精细化的处理方式,给拓客增加更多的可能性。

欢迎大家来体验这款新上线的 智能提醒工具,感兴趣的朋友可在公众号 留言交流。

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

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

相关文章

告别单调,Xmind思维导图之后还有这三款神器,让学习工作更愉快

这年头信息量爆炸&#xff0c;我们得想办法把事情想清楚、把活儿排排好、学点新玩意儿。思维导图这东西&#xff0c;因为它画出来一目了然&#xff0c;用起来也简单&#xff0c;所以特别受学生们和上班的人的欢迎。在这么多画思维导图的软件里&#xff0c;Xmind因为功能全、界面…

02【SQL sever 2005数据库安装教程】

一、安装须知 1.安装数据库版本&#xff1a;SQL sever 2005 2.适用系统&#xff08;目前发现&#xff09;&#xff1a;Windows server 2008 R2 3.安装程序目录&#xff1a;SQL2005\SQL Server x64\Servers\setup.exe 二、安装步骤 1&#xff0e;双击setup.exe&#xff0c;以…

c++编程(25)——unordered_map模拟实现

欢迎来到博主的专栏&#xff1a;c编程 博主ID&#xff1a;代码小豪 文章目录 unorder_map的底层insert迭代器成员访问函数operatoroperator-\- unordered_map是STL中的关联式容器之一&#xff0c;与常规的map有两点不同 &#xff08;1&#xff09;unordered是无序的意思&#x…

AI与我同创诗:尝试让ai(智谱清言)参与我的诗创活动

ai伴学越久&#xff0c;契合度愈高&#xff0c;“泛滥”之诗情&#xff0c;幸得学伴共雕琢。让ai伴学久了&#xff0c;不知觉的&#xff0c;写诗也让ai帮衬了。此文收录“我共ai”的自创文稿&#xff0c;亦可作“ai诗集”。&#x1f60b; (笔记模板由python脚本于2024年09月03日…

企业微信中嵌套的h5应用调用微信扫码功能

企业微信官方文档 1.登录企业微信后台,管理员可操作,打开应用配置应用可信域名(必须配置,否则无法调用jsapi,可信域名必须有ICP备案且在管理端验证域名归属) 配置部署后的前台域名地址 配置可信域名,部署后的服务器域名(需备案认证) 当域名权限不够时需下载文件效验,将文件放…

网站开发:HTML + CSS - CSS选择器

1. 前言 CSS&#xff08;Cascading Style Sheets&#xff0c;层叠样式表&#xff09;是一种用于控制 HTML 文档样式和布局的语言。它为 Web 页面提供了许多功能&#xff0c;使开发者能够创建美观且功能丰富的用户界面。 提供了丰富的功能来控制网页的外观和布局&#xff0c;增…

掌握SQLAlchemy:Python数据库的魔法师

文章目录 掌握SQLAlchemy&#xff1a;Python数据库的魔法师背景&#xff1a;为什么选择SQLAlchemy&#xff1f;SQLAlchemy是什么&#xff1f;如何安装SQLAlchemy&#xff1f;五个简单的库函数使用方法1. 创建引擎2. 定义模型3. 创建会话4. 添加数据5. 查询数据 场景应用1. 多表…

大模型构建合作性的Agent,多代理框架MetaGpt

大模型构建合作性的Agent,多代理框架MetaGpt 前言 MetaGPT 框架将标准的操作程序(SOP)与基于大模型的多智能体相结合,使用标准操作程序来编码提示,确保协调结构化和模块化输出。 MetaGPT 允许 Agent 在类似流水线的范式中扮演多中角色,通过结构化的 Agent 协作和强化领…

Android Studio 加载多个FLutter项目

按顺序操作即可 选择工程 选择Modules, 导入 module 选中创建module 选择要导入的目录&#xff0c;只选择主目录&#xff0c;下面的文件不要选 添加完成&#xff0c;点击ok后&#xff0c;会进行导入 最终导入成功

三星称霸全球市场,但它在中国市场再受打击,将进一步收缩业务

韩国媒体报道指三星已计划进一步收缩中国业务&#xff0c;将中国的销售和生产部门人员减少一部分&#xff0c;其中销售人员计划减少8%左右&#xff0c;显示出它在中国市场继续面临打击&#xff0c;对于这家在全球市场领先地位仍然稳固的企业来说&#xff0c;它在中国市场无疑又…

OpenCV结构分析与形状描述符(8)点集凸包计算函数convexHull()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 查找一个点集的凸包。 函数 cv::convexHull 使用斯克拉斯基算法&#xff08;Sklansky’s algorithm&#xff09;来查找一个二维点集的凸包&#…

Wyn 商业智能V8.0 新版本来袭,解锁“智造”的无限可能

Wyn商业智能V8.0 版本全新发布&#xff0c;聚焦制造业数字化升级痛点&#xff0c;深度赋能制造业数字化转型升级之路&#xff0c;从无缝集成物联网海量数据&#xff0c;到构建可视化实时分析、监控与预警大屏&#xff0c;全面打通生产制造全生命周期的数据脉络&#xff0c;为您…

免费OCR 文字识别工具

免费&#xff1a;本项目所有代码开源&#xff0c;完全免费。 方便&#xff1a;解压即用&#xff0c;离线运行&#xff0c;无需网络。 高效&#xff1a;自带高效率的离线OCR引擎&#xff0c;内置多种语言识别库。 灵活&#xff1a;支持命令行、HTTP接口等外部调用方式。 功能…

hiprint打印/jsPDF使用/html2canvas

最初我知道hiprint.print是可以打印双模板的&#xff0c;于是查看hiprint.print的源码发现底层实现是this.getHtml(t).hiwprint,于是断点查看getHtm的实现&#xff0c;得知它是遍历我们对print传参的list&#xff0c;利用list中模板对象的getHtml()方法得到模板的dom对象&#…

论文120:Giga-SSL: Self-supervised learning for gigapixel images (2023, CVPR, 开源)

文章目录 1 要点2 方法2.1 算法设计2.2 设计选择 1 要点 题目&#xff1a;用于千兆像素图像的自监督学习 (Giga-SSL: Self-Supervised Learning for Gigapixel Images) 代码&#xff1a;https://github.com/trislaz/gigassl 研究目的&#xff1a; 现有的WSI分类方法依赖于有…

告别格式不兼容烦恼!ape转换mp3,分享3个简单方法

各位读者们&#xff0c;你们是否有过这种体验&#xff1a;满怀期待地在网上下载一首好听的歌曲&#xff0c;结果怎么点击手机都播放不了&#xff0c;定睛一看&#xff0c;弹窗显示“无法播放该音频文件”。这是为什么呢&#xff1f;原来那首歌的音频格式是ape&#xff0c;不被手…

2024年全国大学生数学建模C题解题思路

C 题 农作物的种植策略 gzh 大学竞赛君 根据乡村的实际情况&#xff0c;充分利用有限的耕地资源&#xff0c; 因地制宜&#xff0c;发展有机种 植产业&#xff0c;对乡村经济 的可持续发展具有重要的现实意义 。选择适宜的农作物&#xff0c; 优化种植策略&#xff0c;有利于方…

认识正则表达式

为什么要学习正则表达式 因为爬虫需要&#xff01;&#xff01;&#xff01; 一般来说爬虫需要四个主要步骤&#xff1a; 明确目标 (要知道你准备在哪个范围或者网站去搜索)爬 (将所有的网站的内容全部爬下来)取 (去掉对我们没用处的数据)处理数据&#xff08;按照我们想要的方…

Codeforces Round 967 (Div. 2)(A,B,C,D)

A Make All Equal 题意 给定一个序列,每次如果a[i]<a[i1]则可以删除这两个的任意一个,问找出使a中所有元素相等所需的最小删除次数 思路 最小的删除次数就是保留相同数字最多的那个数的删除次数,无论如何都可以保留这个数,因为假如是3334那么可以根据3和4把4删了,假如是3…

学习记录:js算法(二十六):回文链表

文章目录 回文链表我的思路网上思路 总结 回文链表 给你一个单链表的头节点 head &#xff0c;请你判断该链表是否为回文链表。如果是&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 图一 图二 示例 1&#xff1a;&#xff08;图一&#xff09; 输入&…