小程序登陸相比微信登陸要繁瑣一些栏豺,因為登陸的時候不能直接拿到用戶的信息撤嫩。需要再次到后臺進行解密生年。
這篇文章所用的服務(wù)架構(gòu)如下:
1、Laravel后臺:主要是管理用戶晋辆,和一些操作邏輯登陸邏輯渠脉。
2、微信后臺:主要是儲存微信配置項瓶佳,用戶微信用戶授權(quán)解密等等芋膘。
3、微信官方后臺:微信官方服務(wù)器霸饲。
4索赏、小程序前端
之所以將微信授權(quán)和解密放在單獨的服務(wù)器是因為在公眾號授權(quán)方面涉及到多站點授權(quán),需要統(tǒng)一回調(diào)到統(tǒng)一站點贴彼,再進行分發(fā)潜腻。而且服務(wù)單一,易維護器仗。
首先列出應(yīng)該查看的小程序API:
2、wx.getUserInfo(Object object)
3精钮、code2Session
下面是流程圖:
其實認真看圖就完全明白了威鹿,為了照顧你們可能看不懂我寫的字,我就簡單說一下流程轨香。
1忽你、用戶打開小程序,小程序就執(zhí)行wx.login方法臂容。會靜默獲取到j(luò)s_code科雳。留著備用根蟹。
此階段小程序的有的數(shù)據(jù):js_code
2、小程序前端接下來調(diào)用wx.getUserInfo方法(withCredentials參數(shù)為true)糟秘,注意這個方法需要用戶授權(quán)简逮。也就是彈出萬惡授權(quán)框,??注意用戶拒絕授權(quán)要做處理(也就是啥都不讓用戶干尿赚,跳到一個頁面放一個授權(quán)button散庶,點擊重新彈出授權(quán)框)。授權(quán)成功后會返回encryptedData凌净、iv和一堆驗證的數(shù)據(jù)悲龟,留著encryptedData、iv備用冰寻。
此階段小程序的有的數(shù)據(jù):js_code躲舌、encryptedData、iv
3性雄、小程序前端用剛才拿到的js_code去Laravel后臺獲取3rdSession(后面說這是個啥)没卸。
? ? ? ? a)這個接口都干了啥,返回了啥秒旋?
接受到j(luò)s_code之后约计,Laravel后臺就用這個js_code去請求微信后臺的獲取open_id和session_key接口。
b)微信后臺的這個接口都干了啥迁筛?
微信后臺調(diào)用code2Session接口(上面提到過)煤蚌。這個接口接收js_code,返回open_id和session_key细卧,返回給Laravel后臺open_id和session_key(用來解密尉桩,留著備用)。
c)Laravel后臺接收到open_id和session_key之后贪庙,把這兩個放起來存著蜘犁,因為經(jīng)常變,放在緩存中就可以止邮。我用的是這種格式[open_id(3rdSeesion) => session_key]这橙,之后把open_id(3rdSeesion)返回給小程序前端
3rdSession其實就是一個標識,正常來說應(yīng)該把open_id和session_key存在緩存导披,鍵是一個隨機字符串屈扎,這個字符串就是3rdSession,為了方便撩匕,小程序正好也需要open_id,就用open_id代替了3rdSession鹰晨。
此時微信后臺參數(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)這個接口干了啥令漂?
?Laravel后臺用傳遞過來的open_id(3rdSession)膝昆、encryptedData、iv叠必、去請求微信后臺解密接口荚孵。
? ? ? ? ? ? ? ? b)這個接口干了啥?
微信后臺用傳之前的?session_key 和傳遞過來的 iv??去解密encryptedData纬朝。將解密后的信息返回給Laravel后臺收叶。
c)Laravel后臺接收到微信后臺返回的用戶信息之后,用里面的unionId去做和網(wǎng)站用戶的處理(此處看自己網(wǎng)站的邏輯)共苛。處理之后將token返回給小程序前端判没。接下來就可以實現(xiàn)用戶認證的請求,也就是登陸狀態(tài)隅茎。
為什么要用unionId澄峰?
因為你不確定你會不會僅僅只開發(fā)這個一個小程序,如果同一網(wǎng)站要多個小程序和公眾號辟犀,這樣用戶的open_id就很難統(tǒng)一俏竞,處理不了。所以在最開始做的時候一定要考慮到這個問題堂竟。微信開放平臺就是干這個的魂毁。自己去文檔吧。
建議laravel使用overtrue的easywechat出嘹,超級傻瓜式操作席楚。
完事了。