最近做一个项目,微信小程序、Android、IOS同步进行开发,小程序从微信内部直接登录,Android、IOS也需要用微信登陆,为了确定同一用户的身份,需要使用到微信的unionId。
将小程序、APP都绑定到同一微信公众平台后,Android、IOS能直接获取到unionId,但在小程序上获取unionId需要用到后端解密。
网上有一些获取unionId的方法试过一些,有点复杂,所以我总结出一个比较简单的。
网上下载微信官方提供的PHP的demo,会有3个文件:
其实在demo里已经有用法了,代码很简单明了:写入appid、sessionKey、encryptedData、iv四个参数即可。除了appid是固定的外,其他都由前端传过来。
这个demo只是返回解密unionId成功,即code为0或是其他错误code,真正的unionId值,是wxBizDataCrypt.php里的$data的值,可以改为返回该值
TP5实现代码:
//获取微信小程序unionId public function getUnionId() { $sessionKey = Request::instance()->param("sessionKey", '', 'htmlspecialchars'); $encryptedData = Request::instance()->param("encryptedData", '', 'htmlspecialchars'); $iv = Request::instance()->param("iv", '', 'htmlspecialchars'); $appid = 'wxxxxxxxxxxxxxx'; //引入文件 vendor('wxunionid.wxBizDataCrypt'); $pc = new \WXBizDataCrypt($appid, $sessionKey); $unionId = $pc->decryptData($encryptedData, $iv, $data); return $unionId; }
由于小程序上一个用户对一个小程序的openid是相同的,unionId也相同,我们每次解析unionId后可以将openid和unionId保存在数据库,用unionId作为用户唯一表示,小程序登陆的时候先使用openid查找数据库是否有openid对应的unionId值,有则直接返回用户数据进行登陆(目前openid可以直接获取,但是unionId需要用户手动授权,这样用户只需一次授权以后即可“无痕登陆”)