2173关注8289浏览
小程序审核突然没通过,理由如下:
这个问题开发过程中自己确实遇到过,几率性的,一般第一次不行,第二次肯定可以了,但是不是一开始写小程序就有的,不知道什么时候开始就这样了,验证的逻辑都是按照的,从来没有改变过。然后上社区一搜,很多类似的问题,如下图所示。
看了下这个问题,第一次验证签名如下:
小程序端通过wx.login成功后获取的code
rawdata,这个我都是同一用户登录,前后信息没啥变化
通过1中的code,后端调用api获得的session data,其中openid肯定同一用户每次也都一样的,session_key如果过期,那么第一次和第二次理论应该是不一样的。(但实际情况前后两次是一致的,具体可参见下图)
小程序端获取到的用户的签名
后端通过session key校验出来的签名。
很明显,4和5不一致,校验失败。接下来是第二次交验:
还是同样的逻辑顺序。
小程序端通过wx.login成功后获取的code。很明显,code跟第一次是不一样的,另外根据文档描述,因为又重新调用了wx.login,会导致session_key过期。(这似乎说明code发生变化也是对的,因为按推测,seesionkey应该也发生了变化,否则怎么叫“被更新”)请看下图文档说明:
rawdata,这个我都是同一用户登录,前后信息没啥变化
根据1中的描述,奇怪的现象就发生了,在后端根据新的code,获取的session data,很明显session key还是第一次是一样的,也就是说,我重新调用了wx.login, code是变了,但是session key却和第一次保持一致的。
小程序端获取到的用户的签名
后端通过session key校验出来的签名。因为用的是同样的rawdata,同样的session key,所以两次校验的结果是一样的,但是第二次4中,小程序端获取的签名是跟此次校验结果是一致的。
所以问题就来了,这问题到底出在什么地方?似乎文档描述的就有问题,还是我本身的逻辑顺序有问题?请指教,谢谢。
-
至过去的我
2044人对此回答表示赞同
我是未来的你,你现在是不是在年找寻小程序答案。你不要感觉诧异,给你来信原因,就是让你不在后悔。今天去学习如何推广小程序,相信......点击查看更多> -
Aria
20人对此回答表示赞同
为什么我一个米大师应用名称同步的问题,上礼拜五到现在都没人可以帮我们解决呢?在这里却看到了3个不同名字的人员。。真心求助
展开200回复分享发布于 5年前评论(0)
收起评论
-
Vivian
16人对此回答表示赞同
我提的问题,也经常石沉大海,那个开发者工具在笔记本上不能使用的问题,几年了还没解决
展开160回复分享发布于 5年前评论(0)
收起评论
-
Nova
15人对此回答表示赞同
你这条帖子是我见过评论最长回复最长的一条帖子。
展开152回复分享发布于 5年前评论(2)
收起评论
-
Aubree 2019-03-15 19:12
但是微信方面开发,支持是出了名的难找!!大概比使用开源的东西提issues还难,效率还低
回复 -
Luis 2019-03-17 08:29
哈哈,也是没办法,一开始提的有点情绪,但作为开发者,确实是想切切实实的能解决问题,不管是哪一方的问题,开发者千千万万,总归会有各种重复的或者甚至在他们眼里是弱智的问题,但从开发者角度讲,还是希望能得到有效的帮助,而不是互嘲,总之我相信,不管谁写的代码,总有错的。当然你提到的,很多人提到的为什么基本都没回复的,我想下面的截图多多少少能解释下这个问题:
回复
-
-
爱不复生
15人对此回答表示赞同
code的作用只是用来换取session_key,从你提供的信息来看,不会是code的问题,只可能是session_key的问题。有个问题需要注意:
展开1522回复分享发布于 5年前评论(22)
收起评论
-
偷生者 2019-03-05 13:20
蹭个热点,这个需求可以考虑一下。需求地址:https://developers.weixin.qq.com/community/develop/doc/000a8e3618c1d03f2357c59b757800
回复 -
Jose 2019-03-07 17:42
哈哈,是的,官方文档是写了只有5分钟,所以现在就是直接每次appload就login换sessionkey,session不会5分钟的,是保证本次启动小程序都是有效的。至少官方是这么回答的。
回复 -
百毒不侵 2019-03-09 11:46
code的有效期不是只有5分钟吗?
回复 -
韩啸半步癫 2019-03-11 14:46
所以Link说了最佳实践,或者像
陈建才sama所说,不管三七二十一,你appload的时候直接wx.login获取最新的code,保存下来,接下来小程序能保证,在小程序没关闭之前,这个code一直是有效的,等同于session是有效的,这样你只要一直用这个code去后台换取sessionkey就行了。当然这过程中,不管是你用button点击获取到的userInfo还是直接wx.getUserInfo获取的UserInfo,通通都是有效的。 回复 -
黎明星晨 2019-03-13 19:42
这么冗余的流程非常不合理
回复 -
Mackenzie 2019-03-15 13:54
你在回调里直接wx.login导致code改变,等同于session改变,而回调函数onGetUserInfo里返回给你的userInfo的签名是使用你wx.login之前的sessionkey加密的签名,所以肯定会不行,但是个人觉得,你可以在wx.login之后(当然wx.login还是写在了回调函数onGetUserInfo),在直接调用下wx.getUserInfo获取下最新签名的UserInfo,应该是可以的,当然这很明显不是最佳实践。
回复 -
恨钢不成铁 2019-03-17 18:44
是的
回复 -
zqsg走一波 2019-03-19 14:50
在进入小程序的时候调用wx.login,意思是不能在回调函数onGetUserInfo里面调用wx.login,是吗?
回复 -
万发财 2019-03-21 21:38
参考我上面的回复,会有问题。建议是在进入小程序的时候调用wx.login/wx.checkSession。
回复 -
枯等年轮 2019-03-23 13:04
我有一个比较急的疑问 回复 -
Victoria 2019-03-25 13:25
明白了,非常感谢。所有疑问都得到了解答,谢谢。
回复 -
Luz鹿糍 2019-03-27 13:00
一次wx.login/wx.checkSession之后,都可以保证在小程序结束运行之前session_key不过期。
回复 -
肆无忌惮 2019-03-29 21:26
补充下,其实问题的核心就是您的建议这一条,个人感觉没法100%的做到。
回复 -
伯兰 2019-03-31 10:17
非常感谢您的回答,让我更清晰的理解了这个问题。但是还是非常抱歉,就像“
f番茄花园”所说的,问题依然存在,核心还是在第一次我想获取getUserInfo,必须是通过按钮的,让用户主动的授权。那还是这样的问题,为了保证用户第一次点击这个按钮获取的UserInfo有效,势必需要在用户点击按钮前先wx.login,保证codesessionkey等有效。正因为如此,wx.login我可以控制,比如像“ f番茄花园”所说,我小程序一加载,就去login获取有效的code,但问题是getUserInfo不受程序控制,必须由用户触发,比如就是过了很久(反正就是session已过期),用户第一次去点了getUserInfo按钮,那么这个时候拿到的用户签名肯定是无效的,验签肯定失败,而geUserInfo我们只能控制按钮的点击回调,我们无法在用户点击前(或者准确的说,正好要点击前,或者叫点击了,但是在回调函数执行前)我们做一次checkSeesion的动作,如果seesion过期,我们就login下,就是这种情况是我们目前没法做到的。导致用户第一次点击授权获取其用户信息时,验签失败。而程序只能在接收到失败后,再wx.login一次,然后再“暗暗”的wx.getUserInfo调用获取正确的签名(因为用户已经点击按钮,授权已经可以,可以直接调用wx.getUserInfo了,是这样吗?因为暂时也没做这个测试,按文档理解是这样的,只是不知道签名有误的算不算授权了?),再验证签名?是吗?还是我理解有误,有其他方式?谢谢。 回复 -
Xaviera 2019-04-02 20:17
控制台警告开发工具和体验版似乎都有但是线上版本有没有我就不是很清楚了……
回复 -
Alvaro 2019-04-05 00:10
你说的是什么警告?
回复 -
Ruth 2019-04-06 17:02
也就是说,为了逻辑比较统一的话,我可以认为,button为getUserInfo模式下的时候,其实重点是获取授权,给了用户信息只是捎带手做的事情对吧……
回复 -
DarrienLi 2019-04-08 17:43
补充说明一点:wx.getUserInfo并不是直接废弃,只是废弃了其首次获得用户授权的能力。如果已经通过button得到用户的授权(可通过wx.getSetting判断),后续都是可以直接用wx.getUserInfo接口不弹窗获取到用户信息的。
回复 -
Yuan0 2019-04-11 00:15
那么……我倒是有问题了
回复 -
Gracia 2019-04-12 23:31
这个问题我来回答一下主。
回复 -
Caleb 2019-04-14 19:51
实在不好意思,对于您的解答我还是有个疑问,需要麻烦问下。就是您说的1和2步骤,我不知道会不会出现这样的情况,就是我完成1步骤后,出于某种原因(因为至少目前开发者是没法获知以及控制sessionkey的有效期的),sessionkey过期了,然后现在开始执行步骤2,那么我拿到的用户签名肯定也是无效的,对吗?这样我去验签肯定会失败。而因为目前小程序wx.getUserInfo必须通过<buttonopen-type="getUserInfo"></button>这样的形式,让用户主动点击才能获取对吗?就算是wx.authorize({scope:"scope.userInfo"}),也无法弹出授权窗口。这样问题就来了,为了验证签名,如果这种情况发生,是不是势必需要用户第二次点击这个按钮才能正确验签?如果这样的话,体验就很差了,还是说,我始终哪里没搞明白?麻烦帮忙解答下,谢谢。
回复 -
你庄哥 2019-04-16 11:47
非常感谢您的回答,那问题应该就是我步骤错了,我是先wx.getUserInfo拿到signature,然后再wx.login+jscode2session拿到session_key,最后才验签的,您说的1,2我反掉了。非常感谢。
回复
加载更多 -
-
Jack
5人对此回答表示赞同
参考流程代码
展开50回复分享发布于 5年前评论(0)
收起评论
-
Cruz_
4人对此回答表示赞同
学习了。
展开40回复分享发布于 5年前评论(0)
收起评论
-
有口无心
2人对此回答表示赞同
谢谢您这么及时的回答问题,我姑且认为是回答。首先这个发帖人我完全不认识,所以说明这个问题似乎不需要定向来排查吧?很多不一样的开发者都遇到了相同的问题,当然不说100%排除是我们这些人犯了同样的错误,我希望也是我们犯了错,因为毕竟你们比我们牛,几乎不会出错,而且我们错了更容易改,对吧?另外你们在提供这些相对敏感的信息时候,有保密的文本吗?直接贴在公开的论坛里让别人看到appid和openid?虽然这不是secret,但总感觉有点怪怪得啊,一般其他平台,提供这些敏感信息,都是有保密的字段可以填写的,只有你们可以看到,不是吗?另外既然您说了要appid,那我这正好有2个,我想说的是这2个都同时有这个问题。另外我比较弱鸡,还是请麻烦解答下,直接这么公开的提供appid和openid没啥安全隐患吧?再次感谢您专业的帮助。
展开27回复分享发布于 5年前评论(7)
收起评论
-
Jack 2019-03-17 15:25
之前通过`wx.getUserInfo()`获取用户信息时,它有个前提条件要求先`wx.login()`而且未过期。现在换成通过按钮触发的形式后,是在哪一个阶段获取授权code呢?是在点击按钮之前就要获取到code?还是在bindgetuserinfo的回调函数内部获取code? 回复 -
灰机小小 2019-03-19 11:34
刚测试了下,这个问题可以解决了,就是不要直接拿回调函数里给的UserInfo,而是在回调函数里自己先判断下seesion是否过期,过期了可以直接wx.getUserInfo的。在回调函数里,已经有权限直接调用wx.getUserInfo了。虽然感觉奇怪了点,但是这个问题确实就可以完美解决了。
回复 -
吴世之 2019-03-21 21:17
我们问的应该是同一个问题,在回调里再获取code,此时的UserInfo很可能就已经是无效的了。但是不知道能否直接在回调函数里,直接再wx.getUserInfo一次,如果可以,这个问题也能暂时完美的解决掉,马上测试下,呵呵。
回复 -
吴新格 2019-03-23 23:45
我有一个比较急的疑问
回复 -
Zavier 2019-03-25 10:09
抱歉,补上解密部分,就2句话,
回复 -
Jeremiah 2019-03-27 08:22
谢谢,抱怨提问我是承认的,因为个人感觉,你们既然已经有了这么好的经验,也看到了别人的问题,为什么不直接回答下呢?而是直接忽略?或者你们针对这样“线上线下我们定位过非常多次”的问题,有什么相关的排查文档可以查看?我相信,专业我们这些无知的开发者也不会让你们感到厌烦不是吗?我还是想说下自己的看法,虽然可能还是错的,也不怕您的耻笑。
回复 -
龙骑士 2019-03-29 20:17
刷新下页面,我修改了回答。
回复
-