背景
在使用小程序獲得用戶手機(jī),返回服務(wù)器解密寝殴,總是不間斷的出現(xiàn)錯(cuò)誤。錯(cuò)誤代碼為
nodejs.ERR_OSSL_EVP_BAD_DECRYPTError: error:06065064:digital envelope routines:EVP_DecryptFinal_ex:bad decrypt
開發(fā)環(huán)境
前端:mpvue
后端:eggjs
錯(cuò)誤原因
以上兩個(gè)錯(cuò)均是解密時(shí) sessionKey 與獲取到的 加密串沒有匹配明垢。
必須進(jìn)入頁面就靜默走一次登錄流程蚣常,只有成功以后才能點(diǎn)擊按鈕。server 拿到加密信息才能正確解密袖外。
參考代碼
第一步:在頁面加載的時(shí)候就調(diào)用login史隆,獲得session
onLoad() {
// 測試
this.getCode(); // 默認(rèn)登錄,獲得code和session曼验、openid
},
getCode() {
wx.login({
success: (res) => {
console.log(res);
this.getOpenid(res.code);
},
});
},
getOpenid(code) {
const appid = "xxxx"; // 請(qǐng)更換您自己的appid
const secret = "xxxx"; // 請(qǐng)更換您自己的secret
const data = { appid, secret, code };
this.$https
.request({
url: this.$interfaces.getOpenid,
method: "post",
data: data,
})
.then((res) => {
console.log(res);
// 將openid存儲(chǔ)到vuex中
this.$store.dispatch("setOpenId", res.openid);
this.$store.dispatch("setSessionKey", res.session_key);
})
.catch((err) => console.log(err));
},
第二步:編寫checkSession代碼泌射,專門用于在提交的時(shí)候檢查session是否變化
checkSession() {
wx.checkSession({
success: () => {
// 未過期
console.log(this.$store.getters.sessionKey);
},
fail: () => {
// 過期
this.getCode();
},
});
},
第三步:調(diào)用getPhoneNumber獲得用戶手機(jī)
<button open-type="getPhoneNumber" @getphonenumber="getPhoneNumber">
{{ username }}
</button>
getPhoneNumber(e) {
// 判斷授權(quán)是否成功
console.log(e);
if (e.mp.detail.errMsg === "getPhoneNumber:ok") {
console.log(1);
console.log(e.mp.detail.errMsg);
this.iv = e.mp.detail.iv;
this.encryptedData = e.mp.detail.encryptedData;
this.$store.dispatch("setIsAuthenticated",
this.checkSession(); // 檢查session是否改變
this.decryptPhoneNumber(
this.$store.getters.openId,
this.$store.getters.sessionKey
);
},
decryptPhoneNumber(openid, session_key) {
const data = {
openId: openid,
sessionKey: session_key,
iv: this.iv,
encryptedData: this.encryptedData,
};
this.$https
.request({
url: this.$interfaces.decryptPhoneNumber, // 請(qǐng)更換您自己的url
method: "post",
data: data,
})
.then((res) => {
this.$store.dispatch("setPhone", res);
})
.catch((err) => console.log(err));
},
問題解決。
問題點(diǎn)
微信小程序的session是定期更新的鬓照,一般出錯(cuò)就是因?yàn)閟ession出錯(cuò)熔酷,所以在自開始頁面加載就獲得code、openid和session豺裆。在每次調(diào)用頁面的時(shí)候再更新程序拒秘。