自己搭建服务器,把微信与支付宝的收款码安全地合二为一!

自己搭建服务器,把微信与支付宝的收款码安全地合二为一!

余泽楠余泽楠

一、前言

随着“无现金社会”的快速发展,越来越多的商家开始使用各种电子支付平台来收款,这给人们带来了许多便利。

但是,麻烦事还是有的。其中之一,就是不同电子支付平台必须使用不同的收款码来收款。

难道这个问题就不能解决吗?不是的。最近,芝麻二维码新推出的的收款码合并功能着实火了一把,它可以很方便地把支付宝和微信支付的收款码合并起来。

不过,其背后存在的安全问题也不容忽视。

首先,目前合并出来的二维码跳转链接还没有使用 HTTPS 加密,这也就导致了二维码或收款链接被篡改的可能性大大增加。

其次,这里使用的毕竟是第三方平台的服务,服务器的控制权不在自己的手里,又涉及到金钱交易,难免让人有些不放心。

其实,只需要了解一下其中的原理,而且有自己的服务器的话,完全可以搭建一个服务器来提供二维码合并服务,安全与方便兼顾!


二、原理

我们先了解一下「用户代理」这个概念。

用户代理(以下简称为 UA)可以理解成浏览器告诉网页服务器当前用的是什么浏览器(或软件)来访问它的。以下是一个用户代理的例子:

Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/603.3.8 (KHTML, like Gecko) Version/10.1.2 Safari/603.3.8

简单点说,合并之后的二维码内容其实就是一个普通的网页链接。当客户端访问这个链接时,网页服务器通过识别客户端请求报文当中的 UA 字段来决定返回客户端的内容。例如,用户使用支付宝扫描这个二维码之后,支付宝使用内嵌的浏览器访问这个链接,而网页服务器识别到了使用支付宝这个软件访问之后,就返回支付宝的收款链接。流程如下图所示:



通过网页服务器的访问日志(过程略)可以看出,微信的 UA 中都含有 MicroMessenger 这个字符串;而支付宝的 UA 中都包含有 AlipayClient 这个字符串。

支付宝收款码中的链接使用的是标准 HTTPS 协议(形如QR.ALIPAY.COM/FKX09xxxx),支持直接访问链接跳转到付款界面。

微信收款码中的链接使用的是微信自家的协议(形如wxp://f2f0I7EK3CNIg0xxxxxxBUesaWwGYH_RO07E),而且并不支持支持直接访问链接跳转到付款界面,只能使用二维码识别功能才能跳转到付款界面。

因此,当服务器检测到客户端使用微信访问时,应该返回一张带提示的微信收款码图片,然后用户根据提示长按识别图片中的二维码来付款;当服务器检测到客户端使用支付宝访问时,应该返回支付宝收款码中的链接,支付宝将自动弹出付款界面;当服务器检测到客户端使用其他软件或浏览器访问时,应该给予适当的提示。

三、操作环境

注:应该没有人只为了这个收款码而专门搭一个服务器吧,所以以下省略软件安装过程。

四、获取微信收款码图片

以 iPhone 为例,打开微信主界面,点击右上角的 “+” ,选择 “收付款” ,然后点击 “二维码收款”,出现收款码界面之后点击“保存收款码”。过程如下图所示:


然后,从手机上提取这张图片到电脑,用 PS 等图片修改软件在图片中插入一点提示语,将其命名为 wechat_pay_qr.jpg 待用。wechat_pay_qr.jpg 效果如下图:


五、获取支付宝收款码中的链接

以 iPhone 为例,打开支付宝主界面,点击右上角的 “+” ,选择 “收钱”, 出现收款码界面之后点击“保存图片”。过程如下图所示:


然后,从手机上提取这张图片到电脑,打开浏览器访问 Web QR ,把二维码上传到网页上来识别。过程如下图所示:

识别结果将出现在下面的方框中。把识别到的链接拷贝保存好待用。

六、配置服务器

6.1 配置 Nginx

(为了不影响到其他网页的运行,这里单独创建一个配置文件)

vim /etc/nginx/conf.d/pay_qr_bind.conf

请按实际情况以及注释提示修改以下内容,在命令行窗口按下 i ,将内容直接粘贴到命令行窗口中,再按下 ESC ,最后输入 :wq 按回车。

server {
    listen       443 ssl http2;
    server_name  pay.example.com; #pay.example.com修改成您使用的域名
    ssl_certificate "/etc/pki/tls/certs/cert.pem"; #pay.example.com 域名的证书文件路径
    ssl_certificate_key "/etc/pki/tls/certs/key.pem"; #pay.example.com 域名的证书密钥文件路径

    location / {
    root /usr/share/nginx/pay_qr;
    index index.html;

	location = /index.html{
		if ($http_user_agent ~* "MicroMessenger") {
      		return 301 "https://pay.example.com/wechat_pay_qr.jpg";#pay.example.com修改成您使用的域名
     	}
    	if ($http_user_agent ~* "AlipayClient") {
      		return 301 "HTTPS://QR.ALIPAY.COM/FKX09xxxxxxQWMZL3JT64C"; #双引号中的链接修改为上面步骤五识别到的支付宝收款码链接
     	 }
		}
    }
}

6.2 创建合并收款码专用目录

mkdir /usr/share/nginx/pay_qr

6.3 创建提示文件

cat << EOF >> /usr/share/nginx/pay_qr/index.html

以下内容直接粘贴到命令行窗口中按回车即可。

<html>
<head>
<meta charset="UTF-8">
<title>Error</title>
</head>
<body>
请使用微信或支付宝扫描此二维码,谢谢!
</body>
</html>
EOF

6.4 上传微信收款码图片

请通过 FTP 或 SFTP 等文件传输工具把上面步骤四中的 wechat_pay_qr.jpg 上传到服务器上的 /usr/share/nginx/pay_qr目录中。这里省略过程。

上传完成后,修改一下权限。

chmod 644 /usr/share/nginx/pay_qr/wechat_pay_qr.jpg

6.5 重启 Nginx

systemctl restart nginx

如果服务不能中断,请执行以下命令。

systemctl reload nginx

七、生成合并的收款码

打开浏览器访问 Web QR ,点击 “Create” ,在下面的输入框中输入形如以下格式的网址:

https://pay.example.com/index.html

其中,把 http://pay.example.com 修改成您使用的域名即可。如下图所示:



把生成的二维码保存下来,然后用一下 PS 等图片修改软件进行以下美工操作或者加一些提示信息,最后打印出来就可以用了!

八、注意事项

  1. 软件和操作界面总是不断更新的。本文的方法仅供参考,不可能长期有效,请知悉。
  2. 为了安全,合并收款码中的链接仅可以使用 HTTPS 协议。请务必确保数字证书是有效的,否则会出现 -1202 错误,这也说明了使用 HTTPS 的重要性。
  3. 请务必开启到账语音提醒功能,以防万一!
  4. 由于条件有限,这里只测试了个人用户的收款码。
文章被以下专栏收录
19 条评论
推荐阅读