在登陆的时候,如果隔一段时间,再点击登陆按钮,第一次会失败,服务解密那里41003,第二次才能成功
在获取群分享的open_gid也一样,用户第一次点击分享卡片进来是可以的,后面再点击就41003了 这是我群分享的写法
this .share_tk(); share_tk: function () { var shareTicket = wx.getStorageSync( 'shareTicket' ); var shop_id = wx.getStorageSync( 'shop_id' ); if (!util.isNotEmpty(shareTicket)) { return ; } var t = this ; wx.getShareInfo({ shareTicket: shareTicket, success: function (res) { wx.checkSession({ success: function (e) { var session_key = wx.getStorageSync( 'session_key' ); t.ajax_share(res.encryptedData, res.iv, session_key); }, fail: function () { wx.login({ success: function (lres) { if (lres.code) { var post_data = { m: 'mall' , c: 'ApiLogin' , a: 'get_session' , code: lres.code, }; util.ajax(post_data, function (data) { wx.setStorageSync( 'session_key' , data.data); t.ajax_share(encryptedData, iv, data.data); }, null , true ); } } }); } }) } }) }, //分享函数 ajax_share: function (encryptedData, iv, session_key) { var shareTicket = wx.getStorageSync( 'shareTicket' ); var shop_id = wx.getStorageSync( 'shop_id' ); var token = wx.getStorageSync( 'token' ); var t = this ; console.log( '发送分享信息' ); var post_data = { m: 'Share' , c: 'ApiIndex' , a: 'share_shop' , shop_id: shop_id, encryptedData: encryptedData, iv: iv, session_key: session_key, token: token }; util.ajax(post_data, function (data) { wx.removeStorageSync( 'shareTicket' ); console.log(data); }, function (data) { wx.login({ success: function (lres) { if (lres.code) { post_data = { m: 'mall' , c: 'ApiLogin' , a: 'get_session' , code: lres.code, }; util.ajax(post_data, function (data) { wx.setStorageSync( 'session_key' , data.data); post_data = { m: 'Share' , c: 'ApiIndex' , a: 'share_shop' , shop_id: shop_id, encryptedData: encryptedData, iv: iv, session_key: data.data, token: token }; util.ajax(post_data, function (data) { console.log( '第二次成功' ); wx.removeStorageSync( 'shareTicket' ); }, function (data) { console.log( '第二次失败' ); }, true ); }, null , true ); } } }); }, true ); }, |
我觉得还是微信官方有bug,用open-type="getUserInfo"的bindgetuserinfo方法拿到的e.detail里面encryptedData和iv会有这个问题,这几天遇到这问题了,我是在方法里面再调用wx.getUserInfo,用这里获取的encryptedData和iv解密就没这问题。
我试试你的方法
我用你这个方法解决了登陆的解密问题,不过那个群发的问题不能用这个啊,小程序真麻烦
看起来是login呼叫顺序的问题。
你的login在callback中呼叫,每次呼叫login会刷新code,随之session_key也会改变。
导致你在解密数据时,用新的获得的session去解密旧的,当然会出错啦。
验证这个问题也简单,你可以把提交的数据都打印出来,对比一下第一次失败和第二次成功的数据,看一下两次的key。
首先万分感谢您的热心,我是把每次登陆获取到seesion_key保存在本地了,使用的时候先调用checkSession都是有效的,没有进到Login里面。。这个分享看的比较乱,我帖我登陆的你看看,或者能贴你登陆的写法我看看嘛?
login:
function
(e) {
var
t =
this
;
if
(t.data.load == 0) {
return
;
}
t.setData({
load: 0
});
setTimeout(
function
() {
t.setData({
load: 1
});
}, 2000)
var
res = e.detail;
if
(res.errMsg.indexOf(
'ok'
) <= -1) {
return
false
;
}
var
userInfo = res.userInfo;
wx.login({
success:
function
(lg) {
if
(lg.code) {
var
post_data = {
code: lg.code,
m:
'mall'
,
c:
'ApiLogin'
,
a:
'index'
,
key: app.globalData.key,
reginfo: userInfo,
encryptedData: res.encryptedData,
iv: res.iv,
};
var
shop_id = wx.getStorageSync(
'shop_id'
);
if
(util.isNotEmpty(shop_id)) {
post_data.shop_id = shop_id;
}
wx.request({
url: app.globalData.url +
"?m=mall&c=ApiLogin&a=index"
,
method:
'POST'
,
data: post_data ,
success:
function
(res) {
wx.setStorageSync(
'token'
, res.data.data.token);
wx.setStorageSync(
'uinfo'
, res.data.data.uinfo);
wx.setStorageSync(
'share_title'
, res.data.data.share_title);
wx.setStorageSync(
'session_key'
, res.data.data.session_key);
var
to_url = wx.getStorageSync(
'to_url'
);
if
(util.isNotEmpty(to_url) ==
true
&& to_url !=
"pages/login/login"
) {
wx.redirectTo({
url: to_url
})
}
else
{
wx.redirectTo({
url:
"/pages/index/index"
})
}
}
})
}
else
{
console.log(
'登录失败!'
+ res.errMsg)
}
}
});
return
;
},
我们的模块化程度太高,将login做成了component,代码贴出来估计有点晕。
我刚才说的你可以追踪服务器端post数据,第一次失败和第二次成功数据对比。
另外我大胆猜测一下,你们登录是在开发者工具中刷新以后,第一次登录失败第二次登录成功。
下面附上代码。
methods: {
autoLogin(){
this
.isAuthorized().then(authorized => {
const shouldUseOpenData = weapp.canIUse(
'button.open-type.getUserInfo'
)
this
.setData({
shouldUseOpenData: !authorized && shouldUseOpenData
})
if
(authorized){
return
weapp.requireAuth().then(data =>
this
.component.onLoad(data))
}
})
},
// on-tap screen or tap getUserInfo button
onTapLogin(e){
const {loading, shouldUseOpenData} =
this
.data
if
(loading){
return
}
const {detail:{errMsg}} = e
if
(shouldUseOpenData ===
true
&& errMsg ===
'getUserInfo:ok'
){
return
weapp.requireAuth().then(data =>
this
.component.onLoad(data))
}
this
.autoLogin()
},
isAuthorized(){
return
weapp.getSetting().then(({authSetting}) => {
return
authSetting[
'scope.userInfo'
] ===
true
}).
catch
((err)=>console.log(err))
/* eslint no-console:0 */
}
}
你们大厂来的把,代码真看得懵~~~~我post过去数据看每次都是不一样的 你有时间能中文解释下你们登陆判断流程最好了,小弟冰天雪地跪拜了开发者工具中刷新以后,第一次登录失败第二次登录成功(的确是这样) 我的问题跟这个帖子的问题是一样的https://developers.weixin.qq.com/blogdetail?action=get_post_info&docid=000a4e620e0040e75fb6772985b800&highline=41003