Heim  >  Artikel  >  Backend-Entwicklung  >  微信账户绑定

微信账户绑定

WBOY
WBOYOriginal
2016-08-08 09:30:261522Durchsuche

原文地址:http://hello1010.com/bind-wechat/

二维条码/二维码(2-dimensional bar code)是用某种特定的几何图形按一定规律在平面(二维方向上)分布的黑白相间的图形记录数据符号信息的;在代码编制上巧妙地利用构成计算机内部逻辑基础的“0”、“1”比特流的概念,使用若干个与二进制相对应的几何形体来表示文字数值信息,通过图象输入设备或光电扫描设备自动识读以实现信息自动处理

最近几年,二维码的应用特别广泛。微信对二维码的推广及应用可以说是如鱼得水,微信二维码支付,微信二维码登录,微信二维码名片等等。可以说,二维码已经成为 O2O中连接线上线下的重要纽带。小马哥也称"二维码是线上线下的一个关键入口"。

现在很多网站都已经建立起来自己的一套完整用户账号体系,在全民微信的时代,势必要考虑开发和运营微信公众号,不是为赶潮流,只为方便用户,因为微信提供了O2O很好的解决方案,更重要的是,微信具有一个良性的并不断完善的生态链。

当用户关注微信公众号后,会有一些交互,交互过程中可能需要获取到用户的身份信息(对应到网站的账户信息),例如在公众号中下单,查询订单等操作。那么现在问题来了:对于同一个用户,我们如何建立微信公众号用户(openid)与网站用户(userid)之间的对应关系。这个过程我们称之为绑定。


为了简化讨论,我总结了这样两个场景:

一、用户已注册成为我们的网站用户,但还未关注我们的微信公众号; 
二、用户未注册,但已关注我们的微信公众号。

对于以上两种情况,下面分别讨论。

场景一

用户已注册成为我们的网站用户,但还未关注我们的微信公众号。在这里,需要用户在网站上先登录,然后在合适的地方给出一个绑定入口,比如在个人设置里。绑定流程如下:


这里需要用到微信的二维码生成功能:生成带参数的二维码

关于微信二维码,官方文档中这样说:

目前有2种类型的二维码,分别是临时二维码和永久二维码,前者有过期时间,最大为1800秒,但能够生成较多数量,后者无过期时间,数量较少(目前参数只支持1--100000)。两种二维码分别适用于帐号绑定、用户来源统计等场景。

显然,我们使用临时二维码比较合适。每当用户刷新页面时,都可以生成一次。

由于二维码里可以带有场景值(scene_id),当用户扫描带有场景值的二维码后,微信服务器会把场景值推送给我们自己的服务器,我们拿到场景值后,就可以做验证和绑定逻辑。注意:生成二维码需要认证后的服务号。

一次完整的绑定流程应该是这样的:

①用户登录网页,点击“绑定微信账户”; 
②后台使用微信接口,生成二维码链接返回给前端显示,并建立场景值A与用户的对应关系; 
③用户扫描二维码,并点击关注微信公众号(假如已关注,直接跳到④); 
④后台接收微信服务器推送的场景值A; 
⑤后台根据场景值A,查询到对应的用户ID(依赖于②中建立的对应关系); 
⑥建立用户userid与微信用户openid的对应关系; 
⑦给用户的微信客户端推送“绑定成功”的提示; 
⑧通知前台页面,绑定已完成,刷新页面,并返回一些微信账户信息。完成绑定。

其中,②中,“建立场景值A与用户之间的对应关系”,因为用户已经登录,所以用户点击“绑定微信账户”时,我们可以在后台分配一个临时场景值A与用户ID之间的对于关系。对于用户量不大的网站,可以直接使用php中的apc来缓存,并设置一个过期时间(与临时二维码过期时间设置成一样即可)。

⑧中,因为http没有推送机制,所以最简单的方法就是轮询去查询,是否已经完成绑定,完成绑定后再刷新页面。

完成绑定后,用户再跟我们的微信公众号交互时,根据openid可以找到对应的userid,即完成身份识别。对于之前提到的下单,查询订单,都是可以实现的。

整个绑定过程并不复杂,实现起来也没有太大的技术难度,最关键的是思路。

场景二

场景二,对于用户来说操作略微复杂,因为它需要用户在微信客户端的网页中完成登录/注册。所以,假如注册过程太过复杂繁琐,不建议使用。

流程:


上述绑定流程集成了注册的过程,所以看起来比较复杂。实现起来也没有太大的难度,我们重点关注一下安全性方面的问题,因为绑定账户涉及到用户的信息安全,考虑两个问题:

1、如何防止链接被伪造

登录/注册的链接需要确保是我们自己的服务器生成的,其他人无法伪造。可以参考微信的验证服务器地址的有效性。所以一个比较安全的登录链接可以是这样的:

http://api.hello1010.com/wechat/login.html?openid=x1&signature=x2×tamp=x3&nonce=x4&echostr&=x5

校验签名的代码:

<code><span>private function checkSignature()
{
    $signature = $_GET["signature"];
    $timestamp = $_GET["timestamp"];
    $nonce = $_GET["nonce"];    

    $token = TOKEN;
    $tmpArr = array($token, $timestamp, $nonce);
    sort($tmpArr, SORT_STRING);
    $tmpStr = implode( $tmpArr );
    $tmpStr = sha1( $tmpStr );
    if( $tmpStr == $signature ){
        return true;
    }else{
        return false;
    }
}
</span></code>

token值可以跟自己的微信公众号后台的一致,也可以换一个,建议换一个安全点。

2、如何确保openid是可信的

考虑这种场景:A用户进入登录页面,复制登录链接到浏览器,把openid替换为B用户的openid,使用A用户的账号密码登录。这样就把A用户的userid和B用户的openid绑定在一起了,显然是不安全的。

解决方案有很多,比如可以给openid加密,在加密方法保密的情况下,用户无法伪造加密后的openid。假如不想给openid加密,可以在生成链接时,在服务器端建立openid与签名signature的对应关系,假如用户篡改了openid就无法通过校验。

记住,永远不要轻信客户端传过来的信息。

扩展应用

完成绑定后,我们可以做一些简单的应用。比如,公司需要举办一个线下路演活动,该活动需要报名才能参加,并且需要签到。

这是一个典型的可以用微信实现的O2O例子。流程如下:


其中,“绑定用户子流程”就是场景二中的流程。报名的交互在这里不再累述,每个业务都不一样。

对于一个已经完成绑定的用户,他参加一个活动,需要做的就是通过微信报名,然后扫描二维码签到,体验相当流畅。

如有任何问题,欢迎跟我交流!


以上就介绍了微信账户绑定,包括了方面的内容,希望对PHP教程有兴趣的朋友有所帮助。

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn