小程序確實很簡單。解決這個問題時候,忽略了官方文檔的一句話,耗費了好幾個小時的時間。
所以,找不出錯誤的時候,多看官方文檔!
官方文檔很重要 ! 就是忽略了這句話:獲取微信用戶綁定的手機號,需先調用wx.login接口。
傳遞給php的參數(code , iv,encryptData)都是正確的,sessionKey也沒有問題,引用的文件都是官方下載的。
可就是解密失敗,返回-41003(aes 解密失敗),(奇怪的是,用微信官方demo的 appid,sessionKey, encrypt, iv,即使沒有登錄狀態,也可以解密成功。)
正確的代碼是:
在onLoad函數中(獲取微信用戶綁定的手機號,需先調用wx.login接口,進入登錄狀態):
wx.login({
success (res) {
that.setData({
code:res.code
})
if (res.code) {
//發起網絡請求
wx.request({
url: '自己的url'+res.code,
success(res){
console.log("request成功")
},
fail(res){
console.log("request失敗")
}
})
} else {
console.log('登錄失敗!' + res.errMsg)
}
}
})
在獲取用戶手機號的按鈕,綁定一個函數例如(還要調用一次wx.login,code只能用一次):
//獲取用戶手機號
//獲取用戶手機號
getPhoneNumber:function(e){
var that = this;
console.log("正在獲取 敏感加密數據 手機號")
//這是兩個 需要發送給 php的參數,還需要 發送 wx.login產生的code,需要一次發送
console.log("iv 是:",e.detail.iv)
console.log("encryptedData 是:",e.detail.encryptedData)
var encryptedData = encodeURIComponent(e.detail.encryptedData);//一定要把加密串轉成URI編碼
wx.login({
success (res) {
if (res.code) {
//發起網絡請求
//發起網絡請求
wx.request({
url: '自己的url',
success:function(res){
console.log("獲取用戶手機號:wx.login中request成功",res)
},
fail:function(res){
console.log("獲取用戶手機號,請求失敗!")
}
})
} else {
console.log('登錄失敗!' + res.errMsg)
}
}
})
},
常見錯誤:
1、解密的時候,報錯:iv 應該是16個 byte,不應該是15個byte,說明數據傳輸時,iv 中的 + 自動轉換成了 " "(空格)。
在 php接收 iv 后,將 iv 中 的空格替換為加號 即可。
/**
* 請求過程中因為編碼原因+號變成了空格
* 需要用下面的方法轉換回來
*/
function define_str_replace($_data)
{
return str_replace(' ','+',$_data);
}