微信小程序—登录获取openid和unionid

微信官方文档·小程序:

UnionID机制说明

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

UnionID获取途径

绑定了开发者帐号的小程序,可以通过以下途径获取 UnionID。

  1. 调用接口 wx.getUserInfo,从解密数据中获取 UnionID。注意本接口需要用户授权,请开发者妥善处理用户拒绝授权后的情况。

  2. 如果开发者帐号下存在同主体的公众号,并且该用户已经关注了该公众号。开发者可以直接通过 wx.login + code2Session 获取到该用户 UnionID,无须用户再次授权。

  3. 如果开发者帐号下存在同主体的公众号或移动应用,并且该用户已经授权登录过该公众号或移动应用。开发者也可以直接通过 wx.login + code2Session 获取到该用户 UnionID ,无须用户再次授权。

  4. 用户在小程序(暂不支持小游戏)中支付完成后,开发者可以直接通过getPaidUnionId接口获取该用户的 UnionID,无需用户授权。注意:本接口仅在用户支付完成后的5分钟内有效,请开发者妥善处理。

  5. 小程序端调用云函数时,如果开发者帐号下存在同主体的公众号,并且该用户已经关注了该公众号,可在云函数中通过 cloud.getWXContext 获取 UnionID。

  6. 小程序端调用云函数时,如果开发者帐号下存在同主体的公众号或移动应用,并且该用户已经授权登录过该公众号或移动应用,也可在云函数中通过 cloud.getWXContext 获取 UnionID。

微信开放平台绑定小程序流程

登录微信开放平台 — 管理中心 — 小程序 — 绑定小程序

微信小程序—登录获取openid和unionid

<!-- ------------------------------------------------------ 分割线 --------------------------------------------------------- -->

进入小程序,前端调用wx.login()获取到微信登陆人的临时js_code,用js_code请求后端。

后端去请求微信服务端https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code

传入APPID、SECRET、JSCODE去换取openid,session_key以及unionid等信息。

 

后端用js_code换取的时候,分为两种情况:

(1)如果用户关注过了公众号,或者登陆过小程序时,就返回了openid、session_key和unionid。后端可以直接将用户信息返回给前端。

        返回的 JSON 数据包

属性 类型 说明
openid string 用户唯一标识
session_key string 会话**
unionid string 用户在开放平台的唯一标识符,在满足 UnionID 下发条件的情况下会返回,详见 UnionID 机制说明

(2)如果用户未关注过公众号,或者未登陆过小程序时,只返回了openid和session_key。想获取uniodid就需要前端再去调wx.getUserInfo()这个接口。

微信会返回很多数据(详情见微信官方文档:https://developers.weixin.qq.com/miniprogram/dev/api/open-api/user-info/wx.getUserInfo.html)。

属性 类型 说明 最低版本
userInfo UserInfo 用户信息对象,不包含 openid 等敏感信息  
rawData string 不包括敏感信息的原始数据字符串,用于计算签名  
signature string 使用 sha1( rawData + sessionkey ) 得到字符串,用于校验用户信息,详见 用户数据的签名验证和加解密  
encryptedData string 包括敏感数据在内的完整用户信息的加密数据,详见 用户数据的签名验证和加解密  
iv string 加密算法的初始向量,详见 用户数据的签名验证和加解密  
cloudID string 敏感数据对应的云 ID,开通云开发的小程序才会返回,可通过云调用直接获取开放数据,详细见云调用直接获取开放数据 2.7.0

有一个encryptedData,这个数据中就包含你需要的unionid以及其他的很多用户信息,解密后数据为以下 json 结构:

微信小程序—登录获取openid和unionid

加密数据解密算法

接口如果涉及敏感数据(如wx.getUserInfo当中的 openId 和 unionId),接口的明文内容将不包含这些敏感数据。开发者如需要获取敏感数据,需要对接口返回的加密数据(encryptedData) 进行对称解密。 解密算法如下:

  1. 对称解密使用的算法为 AES-128-CBC,数据采用PKCS#7填充。
  2. 对称解密的目标密文为 Base64_Decode(encryptedData)。
  3. 对称解密秘钥 aeskey = Base64_Decode(session_key), aeskey 是16字节。
  4. 对称解密算法初始向量 为Base64_Decode(iv),其中iv由数据接口返回。

微信官方提供了多种编程语言的示例代码(点击下载)。每种语言类型的接口名字均一致。调用方式可以参照示例。