小程序登陸相比微信登陸要繁瑣一些,因?yàn)榈顷懙臅r(shí)候不能直接拿到用戶的信息。需要再次到后臺進(jìn)行解密。
這篇文章所用的服務(wù)架構(gòu)如下:
1、Laravel后臺:主要是管理用戶,和一些操作邏輯登陸邏輯。
2、微信后臺:主要是儲存微信配置項(xiàng),用戶微信用戶授權(quán)解密等等。
3、微信官方后臺:微信官方服務(wù)器。
4、小程序前端
之所以將微信授權(quán)和解密放在單獨(dú)的服務(wù)器是因?yàn)樵诠娞柺跈?quán)方面涉及到多站點(diǎn)授權(quán),需要統(tǒng)一回調(diào)到統(tǒng)一站點(diǎn),再進(jìn)行分發(fā)。而且服務(wù)單一,易維護(hù)。
首先列出應(yīng)該查看的小程序API:
2、wx.getUserInfo(Object object)
下面是流程圖:

其實(shí)認(rèn)真看圖就完全明白了,為了照顧你們可能看不懂我寫的字,我就簡單說一下流程。
1、用戶打開小程序,小程序就執(zhí)行wx.login方法。會靜默獲取到j(luò)s_code。留著備用。
此階段小程序的有的數(shù)據(jù):js_code
2、小程序前端接下來調(diào)用wx.getUserInfo方法(withCredentials參數(shù)為true),注意這個(gè)方法需要用戶授權(quán)。也就是彈出萬惡授權(quán)框,??注意用戶拒絕授權(quán)要做處理(也就是啥都不讓用戶干,跳到一個(gè)頁面放一個(gè)授權(quán)button,點(diǎn)擊重新彈出授權(quán)框)。授權(quán)成功后會返回encryptedData、iv和一堆驗(yàn)證的數(shù)據(jù),留著encryptedData、iv備用。
此階段小程序的有的數(shù)據(jù):js_code、encryptedData、iv
3、小程序前端用剛才拿到的js_code去Laravel后臺獲取3rdSession(后面說這是個(gè)啥)。
? ? ? ? a)這個(gè)接口都干了啥,返回了啥?
接受到j(luò)s_code之后,Laravel后臺就用這個(gè)js_code去請求微信后臺的獲取open_id和session_key接口。
b)微信后臺的這個(gè)接口都干了啥?
微信后臺調(diào)用code2Session接口(上面提到過)。這個(gè)接口接收js_code,返回open_id和session_key,返回給Laravel后臺open_id和session_key(用來解密,留著備用)。
c)Laravel后臺接收到open_id和session_key之后,把這兩個(gè)放起來存著,因?yàn)榻?jīng)常變,放在緩存中就可以。我用的是這種格式[open_id(3rdSeesion) => session_key],之后把open_id(3rdSeesion)返回給小程序前端
3rdSession其實(shí)就是一個(gè)標(biāo)識,正常來說應(yīng)該把open_id和session_key存在緩存,鍵是一個(gè)隨機(jī)字符串,這個(gè)字符串就是3rdSession,為了方便,小程序正好也需要open_id,就用open_id代替了3rdSession。
此時(shí)微信后臺參數(shù):open_id和session_key
此階段小程序的有的數(shù)據(jù):js_code和open_id、encryptedData、iv、open_id(3rdSession)
4、小程序前端接著用現(xiàn)在有的數(shù)據(jù)open_id(3rdSession)、encryptedData、iv、去請求Laravel后臺解密encryptedData(被加密的用戶信息)
? ? ? ? a)這個(gè)接口干了啥?
?Laravel后臺用傳遞過來的open_id(3rdSession)、encryptedData、iv、去請求微信后臺解密接口。
? ? ? ? ? ? ? ? b)這個(gè)接口干了啥?
微信后臺用傳之前的?session_key 和傳遞過來的 iv??去解密encryptedData。將解密后的信息返回給Laravel后臺。
c)Laravel后臺接收到微信后臺返回的用戶信息之后,用里面的unionId去做和網(wǎng)站用戶的處理(此處看自己網(wǎng)站的邏輯)。處理之后將token返回給小程序前端。接下來就可以實(shí)現(xiàn)用戶認(rèn)證的請求,也就是登陸狀態(tài)。
為什么要用unionId?
因?yàn)槟悴淮_定你會不會僅僅只開發(fā)這個(gè)一個(gè)小程序,如果同一網(wǎng)站要多個(gè)小程序和公眾號,這樣用戶的open_id就很難統(tǒng)一,處理不了。所以在最開始做的時(shí)候一定要考慮到這個(gè)問題。微信開放平臺就是干這個(gè)的。自己去文檔吧。
建議laravel使用overtrue的easywechat,超級傻瓜式操作。
完事了。