最近折腾了一下合并收款码,简单记录一下折腾的过程,方法不唯一,只是提供一种思路,如果各位大佬有更加简单粗暴的办法,那就更好了。
原理
首先解析出三个二维码的内容,用 Nginx 判断 User agent 后,返回302,跳转到对应的 URL。
支付宝
支付宝的收款码内容大概是这个样子的:
HTTPS://QR.ALIPAY.COM/FKX04064LA1PNS8SI7BLE4
抓了一下支付宝的 UA,大概是这个样子的:
Mozilla/5.0 (Linux; U; Android 6.0.1; zh-CN; A0001 Build/MMB29M) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/40.0.2214.89 UCBrowser/11.3.8.909 UCBS/2.10.1.4 Mobile Safari/537.36 Nebula AlipayDefined(nt:WIFI,ws:432|0|2.5) AliApp(AP/10.0.12.042101) AlipayClient/10.0.12.042101 Language/en useStatusBar/true
然后就有了下面这段 Nginx 配置
if ( $http_user_agent ~* "AlipayClient" ) { return 302 "HTTPS://QR.ALIPAY.COM/FKX04064LA1PNS8SI7BLE4"; }
经过测试,支付宝正常弹出支付窗口。
微信&QQ
同理,得到了下面这段 Nginx 配置
if ( $http_user_agent ~* "MicroMessenger" ) { return 302 "wxp://f2f0adN69vNDsE9d2xVmp258P9cAqEU_07EU"; }
if ( $http_user_agent ~* "QQ" ) { return 302 "https://i.qianbao.qq.com/wallet/sqrcode.htm?m=tenpay&a=1&u=1798390978&ac=EE86F6B43A000048EEABEE3E0CA8BE91F063DC3C6DACAD291A98B1CDF4108FA9&n=Zohar Wang&f=wallet"; }
但是经过测试,微信和 QQ 都不能正常弹出支付窗口,搜了一下,貌似是因为调用微信和 QQ 的支付需要申请一个特殊的支付接口,而且相当麻烦,不然只能扫收款码进行支付。
但是,长按二维码识别,也是可以正常弹出支付窗口,于是,曲线救国,用 Photoshop 做了两张图:
然后,用 Nginx 判断 User agent 后,跳转到相应的图片。
经过测试,微信和 QQ 正常弹出支付窗口。
##小插曲
我最初使用的是 pay.iwch.me 这个域名做跳转,但微信扫描后出现下图的风险通知:
更换至 pay.yecdn.com 域名后,没有再次出现这个风险通知,初步怀疑是 iwch.me 域名没有备案,而 yecdn.com 有备案的原因。但是因为我没有其他有备案的域名做测试,所以不能确定是不是因为域名没备案而导致的风险通知。
总结
完整的 Nginx 配置如下:
server
{
listen 80;
listen [::]:80;
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name pay.yecdn.com;
server_tokens off;
location /generate_204 { return 204; }
location /zohar {
if ( $http_user_agent ~* "AlipayClient" ) { return 302 "HTTPS://QR.ALIPAY.COM/FKX04064LA1PNS8SI7BLE4"; }
if ( $http_user_agent ~* "MicroMessenger" ) { return 302 "https://static.yecdn.com/static/pay/zohar-wechat.png"; }
if ( $http_user_agent ~* "QQ" ) { return 302 "https://static.yecdn.com/static/pay/zohar-qq.png"; }
}
location / {
return 200 Success;
default_type text/html;
}
include enable-ssl-yecdn.conf;
}
最后,生成一个跳转域名的二维码即可使用。