现在很多网站都已经建立了一套完整的多用户账号体系,基于这套体系,再做其他应用的多用户扩充套件就非常方便。例如,有了微软的 outlook 账户,就可以登入 win8,可以登入微软的邮箱,还可以登入 skype 。同样地,一个 WordPress APPle ID 可以享受苹果的所有服务。正所谓,一个账号,处处使用。   对于企业,可能会有产品线通常有网站,WordPress APP,WordPress 微信公众号等。统一各产品线的账号体系,实现一个账号处处使用的目标是非常有必要的。网站和 WordPress APP 使用同一个账号,不需要做任何多余的工作,客户只要有多用户名称密码即可登入。对于 WordPress 微信公众号,由于它是基于 WordPress 微信公众平台的一个应用,需要遵守平台的规则,所以需要做一些额外的工作才能达到账号互通的目标。   接下来我们就来讨论一下,如何做到 WordPress 微信公众号多用户与网站多用户的账号体系无缝对接。   当多用户关注 WordPress 微信公众号后,会有一些互动,互动过程中可能需要获取到多用户的身份资讯(对应到网站的账户资讯),例如在公众号中下单,查询订单等操作。那么现在问题来了:对于同一个多用户,我们如何建立 WordPress 微信公众号多用户(openid)与网站多用户(userid)之间的对应关系。这个过程我们称之为系结。   WordPress 微信账号系结   为了简化讨论,我总结了这样两个场景:   一、多用户已注册成为我们的网站多用户,但还未关注我们的 WordPress 微信公众号;   二、多用户未注册,但已关注我们的 WordPress 微信公众号。   对于以上两种情况,下面分别讨论。   场景一   多用户已注册成为我们的网站多用户,但还未关注我们的 WordPress 微信公众号。如何方便多用户关注公众号,同时又能把多用户和 WordPress 微信公众号系结在一起呢?很自然地就可以想到二维码这个入口。   近几年,二维码的应用特别广泛。 WordPress 微信对二维码的推广及应用可以说是如鱼得水,WordPress 微信二维码支付,WordPress 微信二维码登入,WordPress 微信二维码名片等等。可以说,二维码已经成为 WooCommerce O2O 中连线线上线下的重要纽带。小马哥也称” 二维码是线上线下的一个关键入口” 。   在这里,需要多用户在网站上先登入,然后在合适的地方给出一个系结入口,比如在个人设定里。系结流程如下:   WordPress 微信账号系结流程   这里需要用到 WordPress 微信的二维码生成功能:http://mp.weixin.qq.com/wiki/18/28fc21e7ed87bec960651f0ce873ef8a.html   关于 WordPress 微信二维码,官方文件中这样说:   目前有 2 种型别的二维码,分别是临时二维码和永久二维码,前者有过期时间,有效期 30 天(2592000 秒),但能够生成较多数量,后者无过期时间,数量较少(目前引数只支持 1–100000,即 10 万个)。两种二维码分别适用于帐号系结、多用户来源统计等场景。   显然,我们使用临时二维码比较合适。每当多用户重新整理页面时,都可以生成一次。   由于二维码里可以带有场景值(scene_id),当多用户扫描带有场景值的二维码后,WordPress 微信服务器会把场景值推送给我们自己的服务器,我们拿到场景值后,就可以做验证和系结逻辑。注意:生成二维码需要认证后的服务号。   一次完整的系结流程应该是这样的:   ①多用户登入网页,点选 “系结 WordPress 微信账户”;   ②后台使用 WordPress 微信介面,生成二维码连结返回给前端显示,并建立场景值 A 与多用户的对应关系;   ③多用户扫描二维码,并点选关注 WordPress 微信公众号(假如已关注,直接跳到④);   ④后台接收 WordPress 微信服务器推送的场景值 A;   ⑤后台根据场景值 A,查询到对应的多用户 ID(依赖于②中建立的对应关系);   ⑥建立多用户 userid 与 WordPress 微信多用户 openid 的对应关系;   ⑦给多用户的 WordPress 微信客户端推送 “系结成功” 的提示;   ⑧通知前台页面,系结已完成,重新整理页面,并返回一些 WordPress 微信账户资讯。完成系结。   其中,②中,“建立场景值 A 与多用户之间的对应关系”,因为多用户已经登入,所以多用户点选 “系结 WordPress 微信账户” 时,我们可以在后台分配一个临时场景值 A 与多用户 ID 之间的对于关系。对于多用户量不大的网站,可以直接使用 php 中的 apc 来快取,并设定一个过期时间(与临时二维码过期时间设定成一样即可)。不要使用 session 来储存这种对应关系,因为④中是 WordPress 微信的推送事件,是不带 session 资讯的,可以使用 redis 这类快取或 DB 来储存。另,这里要使用临时二维码,数量上没有限制,只有时间限制,前台定时重新整理即可。   ⑧中,因为 http 没有推送机制,所以简单的方法就是轮询去查询,是否已经完成系结,完成系结后再重新整理页面。   完成系结后,多用户再跟我们的 WordPress 微信公众号互动时,根据 openid 可以找到对应的 userid,即完成身份识别。对于之前提到的下单,查询订单,都是可以实现的。   整个系结过程并不复杂,实现起来也没有太大的技术难度,关键的是思路。   上述流程是多用户已经在网页端登入了,也就是说已经注册多用户。对于没有登入的情况,我们也可以做,在登入页面生成一个二维码,让多用户用 WordPress 微信扫一扫。假如多用户已经注册,则可以自动登入,并完成网站账号和 WordPress 微信账号的系结;假如多用户没有注册,则网页跳转到系结账号页面,只要多用户输入邮箱密码快速注册,同时也完成了网站账号和 WordPress 微信多用户的系结。实现技术方案跟上述类似。   场景二   场景二,对于多用户来说操作略微复杂,因为它需要多用户在 WordPress 微信客户端的网页中完成登入/注册。所以,假如注册过程太过复杂繁琐,不建议使用。   流程:   多用户系结账户流程   上述系结流程整合了注册的过程,所以看起来比较复杂。实现起来也没有太大的难度,我们重点关注一下安全性方面的问题,因为系结账户涉及到多用户的资讯保安,考虑两个问题:   1 、如何防止连结被伪造   登入/注册的连结需要确保是我们自己的服务器生成的,其他人无法伪造。可以参考 WordPress 微信的验证服务器地址的有效性:   http://mp.weixin.qq.com/wiki/17/2d4265491f12608cd170a95559800f2d.html 。   所以一个比较安全的登入连结可以是这样的:   http://api.hello1010.com/wechat/login.html?openid=x1&signature=x2×tamp=x3&nonce=x4&echostr&=x5   校验签名的代码:   token 值可以跟自己的 WordPress 微信公众号后台的一致,也可以换一个,建议换一个安全点。   2 、如何确保 openid 是可信的   考虑这种场景:A 多用户进入登入页面,复制登入连结到浏览器,把 openid 替换为 B 多用户的 openid,使用 A 多用户的账号密码登入。这样就把 A 多用户的 userid 和 B 多用户的 openid 系结在一起了,显然是不安全的。   解决方案有很多,比如可以给 openid 加密,在加密方法保密的情况下,多用户无法伪造加密后的 openid 。假如不想给 openid 加密,可以在生成连结时,在服务器端建立 openid 与签名 signature 的对应关系,假如多用户篡改了 openid 就无法通过校验。   记住,永远不要轻信客户端传过来的资讯。   扩充套件应用   完成系结后,我们可以做一些简单的应用。比如,公司需要举办一个线下路演活动,该活动需要报名才能参加,并且需要签到。   这是一个典型的可以用 WordPress 微信实现的 WooCommerce O2O 例子。流程如下:   线下路演签到流程   其中,“系结多用户子流程” 就是场景二中的流程。报名的互动在这里不再累述,每个业务都不一样。   对于一个已经完成系结的多用户,他参加一个活动,需要做的就是通过 WordPress 微信报名,然后扫描二维码签到,体验相当流畅。