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

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

用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的信息。

绑定流程的详细描述

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

  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步中说的绑定关系表中。

微信开发教程:用户账号绑定到微信公众号的方法分享相关推荐

  1. 用户账号绑定到微信公众号的方法分享

    最近由于工作需要,接触了微信公众号的开发.业务上要求绑定微信用户和系统用户,以便用户在一次绑定后能够通过系统用户的身份去使用一些功能.我关注的招行信用卡公众号实现了这个功能,所以估计还是可行的,在网上 ...

  2. 微信公众号开发教程[010]-消息管理-获取公众号的自动回复规则

    注意,这个api只能获得在公众号管理后台已开启自动回复(即关闭了公众号的开发服务器URL设置).如下: 下图表明即关闭了公众号的开发服务器URL设置: 我的自动回复规则如下: 1).关注时的自动回复: ...

  3. php自动绑定微信,【教程】绑定自主微信支付配置说明

    1.安装证书 [微信商户平台网址:https://pay.weixin.qq.com/index.php/account] 步骤1 登录商户平台安装证书 (登录商户平台的帐号和密码在邮箱可查看到) 步 ...

  4. easywechat微信开发系列(1):公众号网页授权

    准备工作: 1.已认证的服务号(apppid.appsecret.token.aes_key) 2.安全域名 3.已经用composer安装好easywechat 1.config/app.php 的 ...

  5. 微信开发api “此图片来自微信公众平台未经允许不可引用”的解决方案

    在使用微信开发api接口接管后, 获取公众号的素材发现图片显示"此图片来自微信公众平台未经允许不可引用" 问题: 方案一(推荐): 在html中的<head>里面添加& ...

  6. 微信公众平台开发教程(一) 微信公众账号注册流程

    微信公众平台开发教程(一) 微信公众账号注册流程 具体的操作步骤 1.注册公众账号 注册地址:http://mp.weixin.qq.com/ 1)首先需要邮箱注册: 2)邮箱激活.邮箱将会收到激活邮 ...

  7. 微信公众平台开发教程(九)微信公众平台通用开发框架

    微信公众平台开发教程(九)微信公众平台通用开发框架 一.思考 开发了几个微信项目,一直在思考: 如何将微信相关的处理与业务系统联系在一起? 如何做到彼此分离,且易于扩展? 能否开发一套独立的微信服务框 ...

  8. 微信公众平台开发教程第2篇-----微信开发者接入

    原文地址为: 微信公众平台开发教程第2篇-----微信开发者接入 最近几天在群里看到没有接触过开发的朋友也有在玩微信的公众平台,微信用户到目前已经达到3个亿了吧!!  我不知道伙伴们是因为什么而接触微 ...

  9. 微信小程序开发教程第八章:微信小程序分组开发与左滑功能实现

    接着上面微信小程序开发教程第八章:微信小程序分组开发与左滑功能实现.(第一二章:微信小程序开发教程,第三四章:微信小程序项目结构以及配置&微信小程序首页面开发,第五章:微信小程序名片夹详情页开 ...

最新文章

  1. 进程间通信的方式(四):信号量
  2. android提交服务器,Android向WEB服务器提交数据
  3. Azkaban-two_server模式-job任务运行
  4. python--迭代器与生成器
  5. 怎么把python从c盘移到d盘_如何转移Pycharm的设置或者缓存到其他盘
  6. 如何把代码写的更优雅,你需要这一份代码精进书单!
  7. bat: 调用WinRAR.exe压缩文件
  8. 神经网络容易受到对抗攻击,网络攻防原理与技术
  9. 数字图像处理基础——图像空间操作的3种形式
  10. Unbuntu 安装Protobuf
  11. 【html】【微信小程序】将图片压缩,文件上传的方法
  12. 【python】根据图片链接(地址)抓取图片
  13. 在手机上进行python开发的软件推荐
  14. 用Python实现自动扫雷
  15. Floyd算法求最短路径(附代码实例)
  16. 计算机集中控制系统结构上和DCS基本一致,dcs集中控制系统
  17. unity 加载关卡_Unity5.0_Application.isLoadingLevel 正在加载关卡_软件教程_资源库
  18. NLP在线医生(一)
  19. Simulink 自动代码生成电机控制:非线性磁链观测器
  20. 建筑工程质量竣工资料软件

热门文章

  1. win10 系统下本地 IIS 管理器 MIME 类型添加
  2. 技术Leader,技术和管理哪个重要?
  3. java网页快照-网页转存为图片
  4. wpf 定制虚线边框
  5. Ubuntu 输入法的切换
  6. 强化学习入门 : 一文入门强化学习 (Sarsa、Q learning、Monte-carlo learning、Deep-Q-Network等)
  7. 三羊献瑞+祥瑞生辉(15年蓝桥杯)
  8. “起床困难综合症”「NOI2014」【题解】
  9. 如何享受免费网络iPhone 5连接电脑上网
  10. 服务器机械硬盘寿命一般多少,机械硬盘的使用寿命:正常使用,完全可以10年以上...