最近作一個項目,微信小程序、Android、IOS同步進行開發,小程序從微信內部直接登陸,Android、IOS也須要用微信登錄,爲了肯定同一用戶的身份,須要使用到微信的unionId。php
將小程序、APP都綁定到同一微信公衆平臺後,Android、IOS能直接獲取到unionId,但在小程序上獲取unionId須要用到後端解密。html
網上有一些獲取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須要用戶手動受權,這樣用戶只需一次受權之後便可「無痕登錄」)微信