微信账户绑定

WBOY
WBOYasal
2016-08-08 09:30:261609semak imbas

原文地址: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教程有兴趣的朋友有所帮助。

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn