点击访问原文
您还可以加入全栈技术交流群(QQ群号:254842154)
问题
今天同事在调试微信公众号网页授权时,发现一个非常诡异的问题。当scope为snsapi_base时,可以正常授权,当scope为snsapi_userinfo时,无法授权,出现空白页面。
解决过程
首先可以排除接口权限的问题,因为snsapi_base
和snsapi_userinfo
需要的权限是一样的。也可以排除是微信sdk的问题,所以还是从自身找问题。通过后台调试,把授权页面的地址打印出来是这样子的:
//把下面url中的scope=snsapi_userinfo 改为 scope=snsapi_base可以正常授权
https://open.weixin.qq.com/connect/oauth2/authorize?appId=wx87cf9295e2eeba97&redirect_uri=http%3A%2F%2Fapi.fellowplus.com%2Fexam%2F&response_type=code&scope=snsapi_userinfo&state=STATE&connect_redirect=1#wechat_redirect
对比官网wiki文章,同事肉眼对比链接没有发现任何问题。后来我表示不服,决定肉眼再观察一遍,终于发现 appId
中的字母I
应该是小写的。改成小写后测试通过。OMG,又是linux的大小写问题。
非常简单的一个低级错误,一方面暴露了我们自己的不严谨,没有严格按照微信官方的wiki来做,忽略了url参数中的大小写问题;另外一方面,也反映出微信的不厚道,同样都是大写的字母I
,为什么snsapi_base
的授权模式是可以的,而snsapi_userinfo
不行呢,我猜可能是前者在获取appid
这个参数时,会统一转换成小写,而snsapi_userinfo
时没有做这个操作。导致微信授权服务接收不到appid
这个参数。此时,微信应该报一个类似于获取appid失败
这样的错误的,可是并没有,而是停留在授权页面无法跳转到用户的redirect_uri
,用户看到的表现就是空白页面。微信这样做可能是出于安全考虑吧。
假如在网页授权时有类似的空白页出现,可以从我刚刚提供的思路去查看,是否有类似的大小写问题。
其他问题
在做网页授权时,经常会遇到的一个其他问题是提示:redirect_uri参数错误
。出现这个问题的原因通常都是没有在接口权限表中修改OAuth2.0网页授权的授权回调页面域名,或者填写在域名前面多加了http
或者https
工具
在开发微信公众号时,可以申请测试号来体验,它拥有大部分高级权限(除微信支付之外)。在公众号处于申请阶段,用这个测试号来开发是非常棒的!
http://mp.weixin.qq.com/debug/cgi-bin/sandboxinfo?action=showinfo&t=sandbox/index
另外,给大家推荐一个github上非常实用的微信公众号开发sdk,它对微信公众号的sdk做了二次封装,包括缓存access_token等处理,目前有php版本的。https://github.com/dodgepudding/wechat-php-sdk