微信开发教程:用户帐号绑定到微信公众号的方法分享

时间:2015-02-26    做者:Abyssly   来源:Abyssly Blogphp

 

 

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

搜索无果,遂本身动手实验,后发现其实彻底能够的,看来实践才是检验真理的惟一标准,方案上也很简单,我分几点来讲。数据库

用OpenID绑定便可浏览器

微信接口中虽然没给用户的微信帐号,但给了用户的OpenID,这个OpenID对一个公众号是惟一的,测试也证实不会改变,也就是说同一个微信号和同一个公众号交互,咱们获得的OpenID是不会变的,所以,能够用OpenID做为微信用户的身份标识。安全

如何绑定服务器

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

如何生成绑定连接cookie

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

如何传递OpenID测试

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

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

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

绑定流程的详细描述

我在上面说了基本方法,但不够详细,致使一些新手朋友仍是不清楚具体如何操做,因此我在此尝试更加详细地描述整个过程的每一步:

  1. 数据库中创建用户OpenID和系统用户的绑定关系表,初始时为空。
  2. 用户和微信交互时,你能够取到用户的OpenID。
  3. 检查数据表,如发现该OpenID没有绑定系统用户,则返回一个连接供用户在微信内嵌浏览器中打开,这个连接打开后相似于系统用户登陆界面。
  4. 关键是连接的生成,连接须要带3个url参数:
     1. 用户OpenID:由于你须要在绑定页面中取到是哪一个微信用户想要绑定系统用户。
     2. 时间戳timestamp:这是为了防止连接泄漏出去被恶意利用,具体来讲就是一个你指定的过时时间,超过这个时间这个连接就失效了,用户只能再次获取。
     3. 签名signature:这是为了保证此验证连接只有你才可能生成,用户及第三方均没法伪造。  
  5. 签名的生成须要你有一个只有你知道的token(密钥,不要与设置在公众号里面的token相同),生成签名方法和验证微信服务器消息真实性相似。流程以下:
     1. 将token、OpenID、timestamp三个参数进行字典序排序。
     2. 将三个参数字符串拼接成一个字符串进行sha1加密,获得连接的signature参数。  
  6. 用户打开某个绑定连接时,你首先验证连接的有效性,即按上述5.1和5.2中描述的一样的步骤获得signature与参数中的sinature对比,若是相同,则再检查连接是否超时,两步验证均经过,你就能够将用户的微信OpenID设置到用户的session中,而后你就能够渲染验证页面,让用户输入其系统用户名和密码以提交给你服务器进行验证。
  7. 在用户提交绑定验证请求后,你只须要检查session中有没有你设置的OpenID,没有天然无效,有的话就是要绑定的OpenID了,此时你能够把这个OpenID从session中删除了。而后你若是验证系统用户名和密码经过后,就把这个OpenID和系统用户绑定起来,加入到第1步中说的绑定关系表中。

关于微信公众号用户帐号绑定就是这么多,其实很容易实现,我在这里把个人方法和你们分享一下,老鸟能够忽略,主要是但愿对新手有一些帮助。欢迎探讨,敬请轻拍。

相关文章
相关标签/搜索