最近做一個項目,微信小程序、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需要用戶手動授權,這樣用戶只需一次授權以后即可“無痕登陸”)