文章转自:https://blog.csdn.net/weixin_39926193/article/details/110360299

背景

最近在实际业务中,为了配合产品同事优化小程序的登录流程,同时还想通过微信授权登录 + 手机号授权自动为用户创建一个符合基础用户服务体系的业务账户。从而降低用户使用产品的链路成本。

在沟通过程中,发现很有必要梳理一下关于小程序登录相关的所谓如何实现静默授权如何实现主动授权如何获取手机号什么是小程序的 UnionID 的等等衍生问题概念、获取方式、使用场景。

所以在查阅微信小程序官方文档、以及网络上同行们的文章之后,总结出了本人对微信小程序登录相关的各类ID,以及授权、登录的简单流程做了以下整理。

目录

  • UnionID
  • AppID
  • OpenID
  • 原始ID
  • 登录和授权

UnionID

什么是 UnionID

  • 如果开发者拥有多个移动应用、网站应用和公众帐号(包括小程序),可通过 UnionID 来区分用户的唯一性,因为只要是同一个微信开放平台帐号下的移动应用、网站应用和公众帐号(包括小程序),用户的 UnionID 是唯一的。换句话说,同一用户,对同一个微信开放平台下的不同应用,UnionID 是相同的。

如何获取 UnionID

  • 需要绑定开发者账号的小程序,否则无法获取到 UnionID
  • 调用接口 wx.getUserInfo,从解密数据中获取 UnionID。注意本接口需要用户授权,请开发者妥善处理用户拒绝授权后的情况。(通过 wx.getUserInfo,需要业务接口做对应的解密处理,纯小程序前端无法处理)
  • 如果开发者帐号下存在同主体的公众号,并且该用户已经关注了该公众号。开发者可以直接通过 wx.login + code2Session 获取到该用户 UnionID,无须用户再次授权。(code2Session 为服务端调用接口)
  • 用户在小程序(暂不支持小游戏)中支付完成后,开发者可以直接通过 getPaidUnionId 接口获取该用户的 UnionID,无需用户授权。注意:本接口仅在用户支付完成后5分钟内有效,请开发者妥善处理。
  • 小程序端调用云函数时,如果开发者帐号下存在同主体的公众号,并且该用户已经关注了该公众号,可在云函数中通过 cloud.getWXContext 获取 UnionID
  • 小程序端调用云函数时,如果开发者帐号下存在同主体的公众号或移动应用,并且该用户已经授权登录过该公众号或移动应用,也可在云函数中通过 cloud.getWXContext 获取 UnionID

应用建议

  • 通过 UnionID 与开发平台的唯一性关系,可以针对同一个 UnionID 在统一的用户体系关联出唯一用户的相关需求。
  • 利用 UnionID 可以准确地帮助品牌筛选出,公众号矩阵中同时关注多个公众号的忠诚粉丝。让品牌更好地了解公众号矩阵中账号之间的联系,进行多个公众号之间的联动和传播。

AppID

什么是 AppID

  • AppID 是小程序的身份证号码,是微信公众平台上的小程序 ID,有了它,微信客户端才能确定你的小程序“身份”,并使用微信提供的高级接口。

如何获取 AppID

  • 常规方法:小程序后台查看

    • 电脑端,微信公众平台(https://mp.weixin.qq.com/) 登录小程序账号
    • 进入小程序后台 —「开发」—「开发设置」 查看
    • 或者进入小程序后台 —「设置」 — 「基本设置」 — 「帐号信息」 

  • 简单方法:查看小程序资料
    • 手机端,在微信小程序里搜该小程序名字
    • 如图示例操作即可

  • 神秘方法:知道小程序名字
    • 电脑端,在微信公众号文章编辑后台,选择插入小程序
    • 支持插入任意小程序,适合批量查看小程序的appid,快捷操作 (输入小程序名字后,再次点击小程序名字)
    • 如图示例操作即可

  • 不管你是小程序开发者,普通用户,还是公众号运营者,以上 3 种方法,都可以使用。

AppSecret

  • 什么是 AppSecret : 小程序唯一凭证密钥,多配合于 AppID 一起使用
  • 获取方式:参考如何获取 AppID 的常规方法,在小程序后台查看

应用建议

  • 在实现小程序登录流程时,需要通过 AppID + AppSecret 作为入参通过业务方的 Server 服务获取对应的用户信息
  • 需要保证 AppSecret 的安全性,避免泄漏
  • 在通过业务方的 Server 服务与微信开放平台进行 API 交互时,大多数情况都需要使用 AppID + AppSecret 作为入参进行通信,如推送等业务场景。

OpenID

什么是 OpenID

  • OpenID 是这个用户在这个小程序里的唯一标识。每个用户肯定都有。同一个用户在不同的小程序中的 OpenID 是不一样的。

如何获取 OpenID

  • 调用 wx.login(),获取临时 code
  • 将获取到的 code 发送给后台换取 openid

应用建议

  • 用 OpenID 作为简单的用户唯一标识,也可以用它与业务用户体系做关联
  • 一些需要调用 OpenID 作为入参微信接口需要使用

原始 ID

什么是原始 ID

  • 申请微信小程序时,微信小程序平台分配的唯一编号

如何获取原始 ID

  • 参考如何获取 AppID 的常规方法、简单方法

应用建议

  • 小程序找回、注销等
  • 微信开发平台与小程序交互时需要(如 App 打开小程序)

登录和授权

登录和授权的说明

  • 在微信小程序中,登录和授权是完全两个独立的事情。登录只是通过 wx.login 获取用户在此时使用小程序产生的 code ,需要通过 Server 将 code 通过 auth.code2Session 获取用户唯一标识。
  • 授权是通过 wx.getUserInfo 来获取用户的微信信息,同时可以通过返回的 vi 等加密数据传给 Server 端,用于解密后存储或校验业务用户的微信信息。
  • 登录和授权完全没有关系

登录

  • 微信小程序登录:小程序可以通过微信官方提供的登录能力方便地获取微信提供的用户身份标识,快速建立小程序内的用户体系。

  • 登录流程时序

  • 说明

    • 调用 wx.login() 获取 临时登录凭证code ,并回传到开发者服务器。
    • 调用 auth.code2Session 接口,换取 用户唯一标识 OpenID 和 会话密钥 session_key。
    • 之后开发者服务器可以根据用户标识来生成自定义登录态,用于后续业务逻辑中前后端交互时识别用户身份。
  • 注意

    • 会话密钥 session_key 是对用户数据进行 加密签名 的密钥。为了应用自身的数据安全,开发者服务器不应该把会话密钥下发到小程序,也不应该对外提供这个密钥。
    • 临时登录凭证 code 只能使用一次

用户信息授权

  • 微信小程序用户信息授权

    • 调用 wx.getUserInfo
    • 需要对 button 设置 open-type="getUserInfo" 的属性
    • 将用于加密的数据传递给服务端,如 rawData signature encryptedData iv 等
  • 服务端解密用户授权数据
    • 将小程序业务端通过 wx.getUserInfo 获取到 加密数据进行解密
    • 结合已有的业务用户,创建新的用户或对已有用户补全微信账户相关的信息

手机号授权

  • 获取方式

    • 获取微信用户绑定的手机号,需先调用 wx.login 接口。
    • 因为需要用户主动触发才能发起获取手机号接口,所以该功能不由 API 来调用,需用 button 组件的点击来触发。
    • 需要将 button 组件 open-type 的值设置为 getPhoneNumber,当用户点击并同意之后,可以通过 bindgetphonenumber 事件回调获取到微信服务器返回的加密数据, 然后在第三方服务端结合 session_key 以及 app_id 进行解密获取手机号。
  • 注意事项
    • 目前该接口针对非个人开发者,且完成了认证的小程序开放(不包含海外主体)。需谨慎使用,若用户举报较多或被发现在不必要场景下使用,微信有权永久回收该小程序的该接口权限。
    • 在回调中调用 wx.login 登录,可能会刷新登录态。此时服务器使用 code 换取的 sessionKey 不是加密时使用的 sessionKey,导致解密失败。建议开发者提前进行 login;或者在回调中先使用 checkSession 进行登录态检查,避免 login 刷新登录态。

应用建议

  • 注意登录与授权没有必然联系
  • 登录后的 OpenID 是需要通过服务器调用微信接口获取
  • 业务可以根据授权用户信息 + 授权手机号的结合,来创建新的业务用户

杂谈

  • 静默授权:我们常说的静默授权其实就是通过调用小程序提供的 wx.login 换取 code 后,获取用户 OpenID 以及其他业务关联的信息,因此我们常说的静默授权其实就是不主动调用用户信息授权。
  • 至此,针对微信小程序登录相关的前端知识点内容,基本梳理完成,也达到了在业务开发中,作为前端开发对小程序登录的基础知识的梳理和总结。
  • 本文主要梳理了微信小程序相关的 ID 含义,以及对应的本人在工作中总结出的使用场景。
  • 同时根据实际的应用场景,也确定了登录与授权没有必然的联系。
  • 以业务为参考,也梳理出在实际应用中可以通过微信用户信息授权+手机号授权来创建一个符合业务用户体系的注册流程。
  • 本文随着小程序的发展必然会有一定的时效性,具体实时内容,建议参考微信公众平台小程序官方文档。

资料参考

  • UnionID 机制说明 https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/union-id.html
  • 如何获取小程序的 AppID?https://zhuanlan.zhihu.com/p/61511399
  • 微信 UnionID 的应用案例 https://zhuanlan.zhihu.com/p/34097989
  • 获取 OpenID https://developers.weixin.qq.com/doc/aispeech/miniprogram/options.html#%E8%8E%B7%E5%8F%96%E7%94%A8%E6%88%B7%20openid
  • 小程序登录 https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/login.html
  • 小程序获取手机号 https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/getPhoneNumber.html
  • 服务端获取开放数据 https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/signature.html#method-decode

appid 原始id_微信开发之小程序登录相关的各类ID相关推荐

  1. 微信开发之小程序的页面布局

    flex布局用途:快速实现你所需要的布局(水平居中.垂直居中.左右对齐等)  居中布局实现: 1.对布局容器设置display:flex;  2.利用属性(justify-content(水平方向)和 ...

  2. 微信开发之小程序实现倒计时

    setTimeout(func, time)可以使得每隔time毫秒就执行一次func函数,常用来做计时器/时钟. 下面是在微信小程序中的使用思路,只截取了关键部分代码. var timer; // ...

  3. (JAVA)支付宝小程序登录相关(authToken获取用户唯一userId、encryptedData解密手机号)

    前言: 最近公司做一个支付宝小程序项目,用支付宝userId做唯一用户id,后台encryptedData解密出用户支付宝绑定的手机号信息,其中 参数:authToken和encryptedData均 ...

  4. 如何自己开发一个小程序?

    ​ 如何自己开发一个小程序?如果是新手至少要1-3个月,所以不可能在这里一句几句就能把如何自己开发一个小程序说清楚.关于如何自己开发一个小程序的相关事项,如果开发的话,先下载微信开发工具,然后建立一个 ...

  5. RuoYi-Vue微信小程序登录授权

    目前的框架中token是使用jwt生成,存储到redis控制token时效,而认证是使用UsernamePasswordAuthenticationToken实现的 微信小程序登录授权 需求分析 解决 ...

  6. 微信小程序开发(一)系统对接微信UGC类小程序内容安全接口JAVA版

    系统对接内容安全接口JAVA版 文章目录 系统对接内容安全接口JAVA版 前言 一.微信中UGC类小程序是什么? 二.微信内容安全接口是什么? 三.微信内容安全接口能干什么? 四.微信内容安全接口怎么 ...

  7. access突然需要登录_早知道早好,微信小程序登录开发需要注意的事项

    最近公司要做一个企业微信的小程序,方便企业内的成员来登录,以便一些公司内的业务,只限于公司内的成员来操作,因为有微信小程序的开发经验,所以先当作微信小程序来开发了! 首先来讲一下这个企业微信小程序与微 ...

  8. python开发微信小程序-微信小程序开发:python+sanic 实现小程序登录注册

    开发微信小程序时,接入小程序的授权登录可以快速实现用户注册登录的步骤,是快速建立用户体系的重要一步.这篇文章将介绍 python + sanic + 微信小程序实现用户快速注册登录全栈方案. 微信小程 ...

  9. Java后台微信点餐小程序开发最新版笔记,Springboot+Mysql+Freemarker+Bootstrap+微信小程序实现扫码点餐小程序,包含语音提示,微信消息推送,网页管理后台

    由于之前的Java后台微信点餐小程序有些知识点过时了,所以今天重新出一版,把里面过时的知识点更新下 前五章是部署笔记,后面是知识点的详细讲解,大家可以先看部署笔记,部署起来后,再跟着详细知识学习. 第 ...

  10. 基于云开发的微信答题活动小程序v1.0搭建部署帮助文档

    11月是全国"119"消防宣传月,不少企事业单位都会举办消防安全知识竞答活动,因此我基于云开发搭建了消防安全知识答题活动小程序. 接着,还写完了初阶的手把手教你搭建答题活动小程序系 ...

最新文章

  1. 国家计算机病毒中心发现“网游大盗”新变种
  2. android客户端访问服务端tomcat
  3. rabbitmq几种工作模式_RabbitMQ的六种工作模式总结
  4. Codeforces Round #521 (Div.3)题解
  5. 斗地主AI算法——第九章の被动出牌(3)
  6. jQuery使用示例详解
  7. redhat6.2 下gcc安装
  8. rest api是什么_如何选择合适的API测试工具
  9. wps画流程图交叉弧形_wps画的流程图打印不清晰|wps怎么绘制出立体流程图?wps绘制出立体流程图的方法...
  10. 理解 GBK、Unicode、utf-8
  11. 删除字符串中的元音字母
  12. MySQL阶段二_模块6
  13. vue3使用swiper+animate.css动效
  14. 计算机动漫与游戏制作职业群,四川省工业贸易学校计算机动漫与游戏制作专业...
  15. mysql eav_Magento的EAV模型窥探
  16. 互联网项目,京东店群、淘宝店群和天猫无货源店群,创业者该如何选择?
  17. 南京理工大学校长计算机学院教授,南京理工大学杨静宇教授、扬州大学郭志波博士应邀来我校作学术报告...
  18. 【汇正财经】股票成交原则有哪些?竞价交易呢?
  19. 小孩学python有意义吗-让中小学生学习编程有什么意义
  20. Python实现http基本认证(BASIC AUTHENTICATION)

热门文章

  1. laravel maatwebsite/excel3.1 导入导出详解
  2. Pytorch torch.add() torch.add_() 用法
  3. 基于Java的Minecraft游戏后端自定义插件 08VexView界面绘制与按钮和扩展VexView事件使用
  4. 元气骑士如何获得机器人成就皮肤_《元气骑士》听过浮游炮大礼包吗?有利于快速获取机器人的皮肤!...
  5. python Plot 画图用法
  6. electron +vue自定义点击最大化、最小化和关闭窗口事件功能
  7. 云模型及发生器matlab代码
  8. flink on k8s模式通过web UI界面查看任务运行情况
  9. [c++]数组的逆输出
  10. RDS报警问题解决过程