怎么删除微信绑定的信用卡-微信删除绑定的信用卡-微信在哪里删除绑定的信用卡
转自:(原作者的思路蛮清晰的,赞一个!)最近因工作需求,接触到了微信公众号的开发。业务方面要求将微信用户与系统用户进行绑定,这样用户在完成一次绑定后,就能够凭借系统用户的身份来使用一些功能。招行信用卡公众号是我关注的,它实现了这个功能,所以我估计这个功能还是可行的。在网上进行搜索后,发现对于这个问题并没有什么好的答案,很多人都说取不到微信用户名所以实现不了,甚至还有人说实现了这个功能的应该是与微信有内部合作的。
搜索没有结果,于是自己动手进行实验。后来发现其实是完全可以做到的。这表明实践才是检验真理的唯一标准。方案也很简单,我分以下几点来说。
用绑定即可
微信接口中未给予用户的微信账号,然而却给予了用户的某个东西,这个东西对于一个公众号而言是唯一的,并且测试也证实它不会发生改变。这意味着,当同一个微信号与同一个公众号进行交互时,我们所得到的是不会变化的。因此,它可以被用作微信用户的身份标识。
如何绑定
俗话说,没见过猪跑还没吃过猪肉呢。招行信用卡公众号的做法是,在微信中给用户提供一个验证链接,用户点击该链接后,微信会利用内嵌的浏览器打开此链接,接着呈现出一般的网页登录验证界面,我们借助 HTTP(S)来获取用户输入的系统用户名和密码,验证通过后便可完成绑定。具体的生成链接方式以及如何传递等内容将详细说明。
如何生成绑定链接
绑定与用户的身份以及利益相关,因此要注重安全性。我们需要绑定的对象是系统用户,其用户名是用户在链接页面直接输入后经由 HTTP(S)传递给我们的,这一点不存在问题。对用户而言是透明的,用户不会传递给我们,只有当用户在微信中向公众号发送消息时,我们才能获得。所以很明显,它需要包含在生成的链接中。至于是否需要对其进行加密,这取决于你自己,我认为这并不重要。更为重要的是,要在链接中带上签名并加上时间戳。我们需要确认这个链接是由我们服务端生成的,因为用户自己或者其他人无法伪造出这个链接。加上时间戳是为了给这个链接设定一个过期时间。如果不限制过期时间,假设用户绑定后这个链接通过某种方式被别人知晓,那么这个人就能够将自己的账号与用户的微信号绑定。所以我采取的方法是,利用过期时间再加上一个密钥来生成签名,生成签名的方法与微信服务器接口验证时的签名方法相近,并且密钥最好选择一个只有自己知道的。
如何传递
https://img0.baidu.com/it/u=1128091015,2467033349&fm=253&fmt=JPEG&app=120&f=JPEG?w=800&h=1778
有了绑定链接,用户点击了它。然而,这仅仅是第一步。第二步,我们需要在用户在链接页面提交登录请求之后进行验证。那么,如何将其传到第二步中呢?有人说,这很简单呀,在登录表单里添加一个隐藏域,将用户的信息一起提交给验证不就可以了。但我只能表示很遗憾,你之前所做的安全工作都白费了。一旦 A 用户的信息发生泄漏,B 用户就能够把自己的账号与 A 用户的微信号绑定起来。因此,永远都不要相信客户端提交的东西。我的方法是这样的:当用户点击生成链接后,在链接页开始载入的时候,会将某些信息存储起来。因为这些信息是没法被伪造的(被盗的情况除外),所以只有点击了这个链接的用户的特定位置中才会有链接中所包含的内容。
关于微信服务器签名多说一句
大家都知晓,在微信公众号消息接口验证时,微信会向我们的服务器发送一个 GET 请求,并且在该请求中会带上只有我们和微信服务器才知道的签名。我们在请求处理过程中会对这个签名进行验证,这一点大家都没有异议。当消息接口验证通过之后,微信就会以 POST 的方式把用户发送的消息发给我们。很多人可能会在这个环节忽视对签名的检查,这样就会给恶意者提供伪造用户请求的机会。微信以 POST 方式传递用户消息时,会把签名信息附在 URL 参数里。我们处理每一个 POST 请求,第一步要像处理消息接口验证那样,对 URL 参数中的签名进行验证。只有签名验证通过了,才能去取 POST 的信息。
绑定流程的详细描述
我阐述了基本方法,但不够详尽,致使一些新手朋友对具体操作仍不清晰,故而我在此尝试细致地描述整个过程的每一个步骤。
数据库中建立用户和系统用户的绑定关系表,初始时为空。
用户与微信进行交互时,比如通过点击自定义菜单触发交互,你能够获取到用户的相关信息。
检查数据表。若发现没有绑定系统用户,就返回一个链接。这个链接供用户在微信内嵌浏览器中打开。打开该链接后,其类似于系统用户登录界面。
关键是链接的生成,链接需要带3个url参数:
<p><pre style=""> <code style=""><span style="font-size:14px">用户 OpenID:在绑定页面中,需要取到是哪个微信用户想要绑定系统用户。
时间戳timestamp:其目的是防止链接泄漏出去并被恶意利用。具体而言,它是你指定的一个过期时间,一旦超过这个时间,该链接就会失效,而用户只能再次获取新的链接。
https://img2.baidu.com/it/u=1427822520,179833321&fm=253&fmt=JPEG&app=138&f=JPEG?w=569&h=427
签名的作用是确保此验证链接仅你能够生成,用户和第三方都无法进行伪造。
</span></code></pre></p>
签名的生成要求你拥有一个仅你知晓的 token(密钥,不可与设置在公众号内的 token 相同),其生成签名的方法与验证微信服务器消息真实性相近。具体流程如下:
<p><pre style=""> <code style=""><span style="font-size:14px">对 token、OpenID、timestamp 这三个参数进行字典序的排序。
将三个参数字符串拼接在一起,形成一个新的字符串,然后对这个新字符串进行 sha1 加密,从而得到链接的 signature 参数。
</span></code></pre></p>
用户打开某个绑定链接后,你需先验证链接的有效性,也就是按照 5.1 和 5.2 中所描述的相同步骤,得出与参数中的对比结果,若相同,接着检查链接是否超时(个人认为先校验签名更合适,可防止被恶意篡改,先检验是否超时作为第一步更恰当),只有这两步验证都通过了,你才能将用户的微信设置到用户中,之后你就可以渲染验证页面( ),让用户输入其系统用户名和密码并提交给你的服务器进行验证。
用户提交绑定验证请求后,你需检查其中是否有你所设置的内容。若没有,则自然无效;若有,那就是要绑定的。此时,你可以将其从其中删除。接着,若验证系统用户名和密码通过,就把这个与系统用户绑定起来,并加入到第 1 步中提及的绑定关系表中。
完毕。
PS (个人看法):这种绑定的思路与微信本身提供的.0 绑定相似,区别在于这种关系的维护由平台业务方负责,而非微信方。在平台业务方维护绑定关系在实际开发中更具扩展性,至少我是这样选择的。
页:
[1]