一、背景
最近公司在做微信公众号开发,由于业务需要,公司选择了订阅号用于每天发推送,又有一些小功能需要做二次开发
众所周知,公众号分两种:订阅号 和 服务号,两者的微信权限是不一样的:
微信开发嘛,第一步就是考虑网页授权登陆,之前就用测试号开发过,so easy~
二、正常流程
正常微信网页授权流程是这样的:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140842
官网步骤讲解的很清楚,有问题的同学可以私信或者留言与我讨论,这里不多说
结果。。。
惊了,啥情况?咋整啊?大佬帮帮我啊!
三、变通的思路
想想有没有什么变通的做法,和服务端同学研究了一下
在微信公众号管理后台的 开发 - 基本配置 里开启服务器配置
这样就不可以通过微信后台配置子菜单,而只能通过服务端代码配置
发现服务端同学可以在用户 关注订阅号 的时候,获取到 用户openId , 用openId向微信服务器发送请求获取用户信息
服务端同学请参考:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140839
这样就完成了 注册
第一步解决了,数据库里已经有了这个用户的记录
在用户进行和订阅号交互的时候,例如 子菜单的点击事件 ,服务端同学又可以获取到用户的 openId
openId也就是微信用户的唯一标识,它在数据库里,与我们自己appServer的用户uid是一一对应的
只要有这个openId我们就能够获取到用户信息了!
四、缺点
子菜单的事件有两类,view 和 click
view事件的话,可以跳转至页面,但没法获取用户openId
click事件,能获取用户openId,但没法跳转至页面
鱼和熊掌不可兼得,怎么办?
好吧,再妥协一下,click事件里,发送一条 自动回复消息 总行了吧
回复的消息是一个a标签,带一个参数:openId
<a href="地址?openId">展示给用户的消息</a>
用户点击这条消息就可以跳转至我们的配置好的页面了
我们判断本地是否有用户信息,没有的话走一个接口用openId跟服务端交换用户信息就好啦
五、bug
网页上测试没啥问题,绑定到微信上,接口走不通了
把链接复制出来,发现链接结尾总会多一个=号
百度了一下,好像没有哪位同学遇到和我一样的问题,尴尬!!!
猜测一下,能加等号的无非就是参数问题
麻烦服务端同学帮我把上面的a标签改为:
<a href="地址?o=openId">展示给用户的消息</a>
然后获取这个openId,问题果然解决了
猜测是微信会把之前的openId认为是key,而认为它的value为空,所以默认加一个=
还是不能偷懒,该咋写咋写
关于如何获取url上的参数,给同学们推荐:https://www.cnblogs.com/suyuanli/p/8046783.html
六、反思和优化
以上的流程变相的为订阅号做到了微信网页授权,但是有几个问题:
1、用户不能够点击子菜单直接跳转至相应页面,需要多一次点击的用户行为,从产品角度,不是很合理
听说可以把a标签改成图文消息的模式,可能这样能够稍微挽回一点用户体验,但是根本问题没有解决
2、openId直接暴露在url中,可能会有一些安全隐患、
可能openId加密处理一下会少好一些,同时获取用户信息后一定要叫叫服务端同学返回鉴权的token
3、获取用户信息的方式类似于 静默授权 的模式,用户信息不知不觉的被拿到,可能产生反感
解决的话:做一个假的授权dialog?233333~
七、结语
以上方式就可以变通的进行微信订阅号的网页授权,可能是是个人技术限制,总感觉这个方法low low的,哈哈哈,总归是实现了。
希望这篇文章能够帮助同学们成功爬坑,如果对您有所帮助,请关注、点赞并收藏,有其他问题也可以留言或私信,欢迎讨论!
网友评论