微信公众号开发模式之用户账号绑定

  • A+
所属分类:编程语言

公司需要微信这个平台和用户交流,于是开始研究微信公众平台。微信公众平台分为两种模式,其一是编辑模式,比如用户发什么内容,你可以响应什么内容。另外一种便是开发模式,这个模式功能丰富,不仅仅可以获取到用户的基本信息,还能获取用户的地理位置以及其他功能。

本来准备自己来开发一套微信公众号后台,后来发现已经有相关的开源产品,使用过三四种,发现最好用的还是"微擎",咱们运维生存时间也不是替他打广告,确实比较好用,界面美观而且可以自己开发插件。不过呢,功能还是有些不足。

最近想研究微信怎么绑定网站的用户账号,类似招商银行那种,其实招商和微信是有深度合作,提供的接口也是很丰富,甚至他们网络都走专线。这不是我们这次要讲的重点,以下是来自网上的内容,有些道理。

最近由于工作需要,接触了微信公众号的开发。业务上要求绑定微信用户和系统用户,以便用户在一次绑定后能够通过系统用户的身份去使 用一些功能。我关注的招行信用卡公众号实现了这个功能,所以估计还是可行的,在网上搜索了一下,发现这个问题没什么好的答案,很多都说取不到微信用户名实 现不了,甚至有说实现了这个功能的应该是与微信有内部合作的。

搜索无果,遂自己动手实验,后发现其实完全可以的,看来实践才是检验真理的唯一标准,方案上也很简单,我分几点来说。

用OpenID绑定即可

微信接口中虽然没给用户的微信账号,但给了用户的OpenID,这个OpenID对一个公众号是唯一的,测试也证明不会改变,也就是说同一个微信号和同一个公众号交互,我们得到的OpenID是不会变的,因此,可以用OpenID作为微信用户的身份标识。

如何绑定

俗话说,没吃过猪肉还没见过猪跑。看招行信用卡公众号是如何做的,在微信里面给用户一个验证链接,用户点击链接,微信会用内嵌的浏览器打开这个链接,然后就是一般的网页登录验证界面,我们通过HTTP(S)获取用户输入的系统用户名与密码,验证通过后完成绑定。 具体如何生成链接和如何传递OpenID下面详述。

如何生成绑定链接

绑定涉及到用户的身份甚至利益,所以需要注意安全性。我们需要绑定的是OpenID和系统用户,系统用户名是用户直接在链接页面输入后通过 HTTP(S)传给我们的,这没有问题。OpenID对用户来说透明,用户不会传给我们,我们也只有在用户在微信中向公众号发消息时才可获得 OpenID,所以很明显,OpenID需要包含在生成的链接中,至于需不需要对OpenID作加密就看你自己了,我觉得这不重要,更为重要的是要在链接 中带上签名和加上时间戳。因为我们需要确认这个链接是由我们服务端生成的,用户自己或者其他人不能够伪造出这个链接,加上时间戳是为了给这个链接一个过期 时间,如果不限制过期时间,假设用户绑定后这个链接通过某种方式被别人知道,那么这个人就可以把自己的账号与用户的微信号绑定。所以我采取的方法是用 OpenID、过期时间再加上一个密钥生成签名,生成签名的方法和微信服务器接口验证时的签名方法类似(密钥最好另选一个只有自己知道的)。

如何传递OpenID

有了绑定链接,用户点了绑定链接,但这只是第一步,第二步我们需要在用户在链接页面提交登录请求后进行验证,OpenID怎么传到第二步中呢?有人 说了,这还不简单,在登录表单中加一个隐藏域放用户的OpenID一起提交给验证的Handler不就OK了,那我只能说很遗憾,你前面所做的安全工作都 白费了,一旦A用户的OpenID泄漏,B用户就可以把自己的账号与A用户的微信号绑定了。所以永远不要相信客户端提交的东西。我的方法是当用户点击生成 链接后,在链接页载入时,将OpenID存到session中,因为这个session是没法伪造的(cookie被盗除外),所以只有点击这个链接的用 户的session中才会有链接中包含的OpenID。

关于微信服务器签名多说一句

大家都知道微信公众号消息接口验证时微信会向我们服务器发一个GET请求,在其中带上只有我们和微信服务器知道的签名,我们在请求处理 Handler中会验证这个签名,这点大家无异议;消息接口验证通过后,微信就会把用户发的消息以POST的方式发给我们,很多人可能会在这里忽视对签名的检查,从而给恶意者伪造用户请求的机会。在微信以POST方式传递用户的消息时,仍然会将签名信息附在URL参数中,我们在处理每一个POST请求时, 第一步还是得像处理消息接口验证时一样,去对URL参数中的签名作验证,只有签名验证通过后才可去取POST的信息。

关于微信公众号用户账号绑定就是这么多,其实很容易实现,我在这里把我的方法和大家分享一下,老鸟可以忽略,主要是希望对新手有一些帮助。欢迎探讨,敬请轻拍。

参考资料

微擎:http://www.we7.cc
微信公众平台:http://mp.weixin.qq.com
转自:abyssly.com/2013/09/20/wx_bind/(打不开,内容是从百度快照抠出来的)

站点:运维生存时间  网址: http://www.ttlsa.com/html/4004.html

weinxin
微信公众号
扫一扫关注运维生存时间公众号,获取最新技术文章~

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

目前评论:14   其中:访客  13   博主  0   引用   1

    • 张宗星 9

      我想问一下,绑定之后,如何将用户的信息保存在cookie中,view的功能是我们写一个returnURL,request和response是微信请求自己服务器 创建的,如何保存的用户浏览器中?

      • tt 9

        撒地方1

        • 焦灿 9

          假如用户直接点菜单中的 绑定账户,微信不会给openid。那么你生成的链接怎么包含用户的openid

          • 王鹏健 9

            博主您好 如何传递OpenID 中 用户点击生成 链接后,在链接页载入时,将OpenID存到session中,因为这个session是没法伪造的(cookie被盗除外), 请问此时的OpenID 是从连接中获取的吗 这段不是很明白

              • 博主 9

                @王鹏健 你说的有点乱,不是很明白

              • 小小当家 9

                我发现一些公众账号不是通过楼主这种方式实现绑定的,比如“北京交警”中的业务办理->我的违法,点击之后直接是绑定的界面,并没有像招行一样发个消息,这是怎么办到的?

                  • 博主 9

                    @小小当家 实际上点击我的违法,他会跳转到北京交警的的绑定页面,你把我的违法看做一个超链接,他里面包含http://xxxx.com/bind.php页面

                  • k仔勋 9

                    请问博主,验证完成后,接下来如何主动通知用户已经绑定完成呢,即当用户点击连接完成绑定后,关闭这个微信内浏览器后,如何发消息来通知用户绑定好呢?好像没有这种关闭浏览器的event会传到消息api吧?

                      • 博主 9

                        @k仔勋 目前绑定都是在网页上进行的,网页会自动跳转。

                          • k仔勋 9

                            @博主 是的,这个我知道,功能也按这个思路做好了,但是在网页上跳转提示绑定完成后,用户还是需要点击返回回到微信对话框里,这时候是接收不到用户返回微信对话框里的event的,不能在用户返回微信对话框的时候提示绑定完成,这个有办法解决吗?

                              • 博主 9

                                @k仔勋 目前的绑定还是需要用户点击微信上面的返回回到微信的。—这是我目前所了解到的。招商银行目前也是这么做的。

                                  • k仔勋 9

                                    @博主 好吧,再次感谢博主!

                          • 来自外部的引用: 1

                            • 道隐无名