.Net之微信小程序获取用户UnionID
前言:
在實(shí)際項(xiàng)目開發(fā)中我們經(jīng)常會(huì)遇到賬號統(tǒng)一的問題,如何在不同端或者是不同的登錄方式下保證同一個(gè)會(huì)員或者用戶賬號唯一(便于用戶信息的管理)。這段時(shí)間就有一個(gè)這樣的需求,之前有個(gè)客戶做了一個(gè)微信小程序商城(店主端的),然后現(xiàn)在又要做一個(gè)會(huì)員購物端的小程序商場。首先之前用戶登錄憑證都是使用微信openid來做的唯一標(biāo)識,而現(xiàn)在客戶需求是要做到用戶在會(huì)員端小程序跳轉(zhuǎn)到到店主端小程序假如之前該用戶微信是在店主端審核通過的用戶則不需要在進(jìn)行資料提交審核操作,直接登錄。所以,所以我們使用了UnionID來進(jìn)行關(guān)聯(lián),如下是我們現(xiàn)在項(xiàng)目的基本流程(畫的丑莫見怪)。
說說UnionID機(jī)制:
如果開發(fā)者擁有多個(gè)移動(dòng)應(yīng)用、網(wǎng)站應(yīng)用、和公眾帳號(包括小程序),可通過 UnionID 來區(qū)分用戶的唯一性,因?yàn)橹灰峭粋€(gè)微信開放平臺(tái)帳號下的移動(dòng)應(yīng)用、網(wǎng)站應(yīng)用和公眾帳號(包括小程序),用戶的 UnionID 是唯一的。換句話說,同一用戶,對同一個(gè)微信開放平臺(tái)下的不同應(yīng)用,unionid是相同的。
官方UnionID機(jī)制詳細(xì)說明:https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/union-id.html
微信開放平臺(tái)綁定小程序流程:
登錄微信開放平臺(tái)?— 管理中心 — 小程序 — 綁定小程序(直接使用微信官方圖)
微信小程序獲取UnoinID的兩種方式:
調(diào)用接口 wx.getUserInfo,從解密數(shù)據(jù)(encryptedData)中獲取 UnionID(推薦使用):
推薦使用原因:無需關(guān)注微信公眾號即可獲取到UnionID。
調(diào)用接口wx.getUserInfo前提:用戶允許授權(quán)獲取用戶信息!
開發(fā)者后臺(tái)校驗(yàn)與解密開放數(shù)據(jù):
微信為了保證用戶信息,把用戶通過wx.getUserInfo接口獲取到的相關(guān)敏感信息進(jìn)行了加密。加密方式對稱加密(后面會(huì)提到),首先我們需要通過微信小程序登錄流程獲取到用戶的session_key(會(huì)話密鑰),然后我們可以報(bào)獲取到的會(huì)話密鑰使用緩存存起來,在通過用戶授權(quán)獲取用戶相關(guān)信息,如下是用戶授權(quán)成功獲取到的用戶信息:
基本流程圖如下:
(encryptedData)加密數(shù)據(jù)解密算法:
開發(fā)者如需要獲取敏感數(shù)據(jù),需要對接口返回的加密數(shù)據(jù)(encryptedData)?進(jìn)行對稱解密。解密算法如下:
對稱解密使用的算法為 AES-128-CBC,數(shù)據(jù)采用PKCS#7填充。
對稱解密的目標(biāo)密文為 Base64_Decode(encryptedData)。
對稱解密秘鑰 aeskey = Base64_Decode(session_key), aeskey 是16字節(jié)。
對稱解密算法初始向量 為Base64_Decode(iv),其中iv由數(shù)據(jù)接口返回
很遺憾的是微信居然沒有為我們大.Net提供解密算法demo,實(shí)屬讓人不算,最后自己根據(jù)網(wǎng)上的資料還是配上了符合微信對稱加密的解密算法。
代碼實(shí)現(xiàn):
首先關(guān)于session_key(會(huì)話密鑰)的獲取,請看下面的wx.login+code2Session 方式
調(diào)用接口wx.getUserInfo獲取encryptedData(加密數(shù)據(jù))和iv(初始向量):
.Net WebApi 解密數(shù)據(jù)接口:
注意參數(shù)使用Convert.FromBase64String轉(zhuǎn)化,提示“Base-64字符數(shù)組的無效長度” 的問題:
原因:加密參數(shù)中的"+"通過地址欄傳過來時(shí),后臺(tái)會(huì)解析為空格。
解決:最好的做法是 使用encryptedData.Replace("+", "%2B")先將空格編碼,然后再作為參數(shù)傳給另一頁面?zhèn)鬟f,這樣頁面在提取參數(shù)時(shí)才會(huì)將“%2B”解碼為加號.但這兒為了簡化,將空格直接還原為"+"或者是直接在后臺(tái)將空格替換為“+”encryptedData.Replace(' ', '+');
直接通過?wx.login?+?code2Session?獲取到該用戶 UnionID:
其實(shí)這個(gè)方式就是實(shí)現(xiàn)了小程序的登錄流程,微信官方詳細(xì)說明:
https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/login.html
優(yōu)點(diǎn):無需用戶授權(quán)。
前提:用戶需要關(guān)注該微信公眾號。
小程序端調(diào)用接口wx.login獲取code憑證,在通過請求auth.code2Session接口獲取用戶信息(UnionID,openid,session_key會(huì)話密鑰)兩種方式:
1.直接通過wx.login請求到code憑證后,在請求該地址獲取用戶信息:
詳細(xì)說明請看微信官方文檔(代碼略):https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/login/auth.code2Session.html
2.通過請求wx.login獲取code憑證,在向.net webapi后端請求code2Session接口:
原因:因?yàn)槲覀冃枰獙Λ@取的用戶信息做相關(guān)業(yè)務(wù)邏輯處理。
微信小程序端代碼:
/***封裝用戶promise登錄,通過code憑證獲取用戶信息(UnionID,openid,session_key會(huì)話密鑰)
*/
userLogin: function() {
var that = this;
//定義promise方法
return new Promise(function(resolve, reject) {
//調(diào)用登錄接口
wx.login({
success: function(res) {
if (res.code) {
console.log("用戶登錄授權(quán)code為:" + res.code);
//調(diào)用wx.request請求傳遞code憑證換取用戶openid,并獲取后臺(tái)用戶信息
wx.request({
url: 'https://www.xxxx.xxx.api/User_oAuth/GetUserInfo',//后臺(tái)請求用戶信息方法
data: {
code: res.code //code憑證
},
header: {
'content-type':'application/json' // 默認(rèn)值
},
success(res) {
console.log(res.data)
if (res.data.errcode == 0) {
//存入session緩存中
console.log(res.data.openid);//微信用戶唯一標(biāo)識
console.log(res.data.UnionID);//微信開發(fā)平臺(tái)聯(lián)合ID
console.log(res.data.session_key);//會(huì)話密鑰
//***注意****
//注意:這里是直接把session_key緩存起來,在上面wx.getUserInfo會(huì)使用到
wx.setStorageSync("session_key",res.data.session_key);//promise機(jī)制放回成功數(shù)據(jù)
resolve(res.data);
} else
{ reject('error'); }
}, fail: function(res)
{
reject(res);
wx.showToast({ title: '系統(tǒng)錯(cuò)誤' })
}, complete: () => { } //complete接口執(zhí)行后的回調(diào)函數(shù),無論成功失敗都會(huì)調(diào)用
}) } else
{
reject("error");
}}
})
})}
.Net WebApi 請求用戶信息接口:
原文鏈接:https://www.cnblogs.com/Can-daydayup/p/11437754.html
.NET社區(qū)新聞,深度好文,歡迎訪問公眾號文章匯總?http://www.csharpkit.com?
總結(jié)
以上是生活随笔為你收集整理的.Net之微信小程序获取用户UnionID的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: .NET 程序员如何学习Vue
- 下一篇: .NET CORE 怎么样从控制台中读取