微信小程序 openID 和unionID

OpenID: 普通用户的标识,对当前开发者帐号唯一。一个openid对应一个公众号。 UnionID :用户统一标识。针对一个微信开放平台帐号下的应用,同一用户的unionid是唯一的。 微信的用户隐私策略:每个接入微信的应用(公众号、APP)就像一个独立的商场,用户使用这些应用就像逛商场,商场用会员卡识别用户,类似的,我们根据商场名字为每个用户生成了一张专属会员卡(openid),每张会员卡只能在对应的商场才能够使用,你不能拿着沃尔玛的会员卡去华润万家积分。这是一种安全的授权方式,如果没有这个会员卡,直接暴露微信号,就相当于拿着身份证去逛商场,丢失一个会员卡号远比丢失身份证号要安全。

那么问题来了,都是万达集团,万达大歌星与万达商场希望做到会员卡通用。微信在这里做了一个打通机制,对于同一个企业,在用户属性里面加了一个企业属性(UnionID),方便同一个企业在不同的产品中识别到同一个用户。 这个机制伴随着微信联合登录已经在微信开放平台(open.weixin.qq.com)推出了。获得了开放平台认证的企业,可以绑定10个手机应用、10个网站、10个公众号,他们对应的用户信息也可以互联互通。

###强烈提示:对于开发团队而言,在接入微信登录之初,往往会忽视用户的UnionID,只记录了openid。这会导致后期账号打通时候,需要用户重新授权,运营成本增高,遇到此类问题的团队不在少数。

获取unionID的4种方式: 1、调用接口 wx.getUserInfo,从解密数据中获取 UnionID。注意本接口需要用户授权,请开发者妥善处理用户拒绝授权后的情况。 2、如果开发者帐号下存在同主体的公众号,并且该用户已经关注了该公众号。开发者可以直接通过 wx.login + code2Session 获取到该用户 UnionID,无须用户再次授权。 3、如果开发者帐号下存在同主体的公众号或移动应用,并且该用户已经授权登录过该公众号或移动应用。开发者也可以直接通过 wx.login + code2Session 获取到该用户 UnionID ,无须用户再次授权。 4、小程序端调用云函数时,当满足 UnionID 获取条件时可在云函数中通过 cloud.getWXContext 获取 UnionID

转载于:https://juejin.im/post/5c8228625188257dd8163281

### 微信小程序中通过 OpenID 获取 UnionID 在微信生态内,OpenID 是用户在一个特定的小程序中的唯一标识符,而 UnionID 则是在同一微信公众平台下的多个应用(包括公众号、小程序等)之间的通用用户标识。对于已经绑定了微信开放平台账号的应用来说,可以通过用户的授权来获取 UnionID。 #### 接口说明 当开发者希望从小程序端获得用户的UnionID时,并不是直接基于OpenID去查询得到UnionID,而是应该利用`auth.code2Session`接口完成此操作[^3]。该过程涉及前端向后端发送临时登录凭证 code ,由服务器携带 appid secret 向微信服务器发起请求交换 session_key 及可能存在的 unionid 。需要注意的是只有当用户将小程序绑定到微信开放平台上之后才会返回 unionid 字段;如果未绑定,则不会提供 unionid 信息。 具体流程如下: 1. 用户同意授权给小程序; 2. 前端调用微信提供的 `wx.login()` 方法获取临时登录凭证(code); 3. 将code传送给自己的服务端; 4. 服务端使用appid,secret以及收到的code访问`https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code` URL 来换取 openId , session_key (还有可能是unionid); 5. 如果需要进一步处理加密数据(如头像昵称),则还需要解密 encryptedData 参数内的内容才能拿到完整的用户资料,这部分涉及到AES算法的具体实现,在某些框架中有现成工具可以直接调用,比如ThinkPHP 中的做法就是如此[^4]. ```php // PHP示例代码用于解密并获取unionid public function getUionid($sessionKey,$iv,$encryptedData){ /** * 通过$sessionKey,$iv,$encryptedData解密获取unionid */ vendor('wxunionid.wxBizDataCrypt'); $pc = new \WXBizDataCrypt($this->appId, $sessionKey); $unionId = $pc->decryptData($encryptedData, $iv, $data); return json_decode($unionId,true); } ``` 值得注意的是,上述过程中提到的服务端逻辑应当妥善保管好敏感信息(appid/secret/session_key), 并确保传输的安全性以防止泄露风险。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值