小程序确实很简单。解决这个问题时候,忽略了官方文档的一句话,耗费了好几个小时的时间。
所以,找不出错误的时候,多看官方文档!
官方文档很重要 ! 就是忽略了这句话:获取微信用户绑定的手机号,需先调用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);
}
请发表评论