前言
随着“无现金社会”的不断推进,越来越多的商家开始使用微信、支付宝等收款码来收款,这使得支付变得更加安全、便捷。与此同时也出现了多种电子支付客户端,如微信、支付宝、QQ等,商家为了兼顾更多种支付平台就得准备多个收款码。最近,芝麻二维码新推出了收款码合并功能( https://www.hotapp.cn/shouqian ),它可以把微信和支付宝的收款码合并起来实现一码付。
原理
网站应用中为了辨识用户访问使用的操作系统及版本、CPU 类型、浏览器及版本、浏览器渲染引擎、浏览器语言、浏览器插件可以通过读取 UserAgent 信息来实现。同理为了区别不同的支付客户端我们亦可以通过读取支付客户端的 UserAgent 信息实现。
某 Android 手机上的微信 UserAgent 信息:
Mozilla/5.0 (Linux; Android 7.1.1; OD103 Build/NMF26F; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/53.0.2785.49 Mobile MQQBrowser/6.2 TBS/043508 Safari/537.36 MicroMessenger/6.5.13.1100 NetType/WIFI Language/en
某 Android 手机上的支付宝 UserAgent 信息:
Mozilla/5.0 (Linux; U; Android 7.1.1; zh-CN; OD103 Build/NMF26F) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/40.0.2214.89 UCBrowser/11.6.4.950 UWS/2.11.0.20 Mobile Safari/537.36 UCBS/2.11.0.20 Nebula AlipayDefined(nt:WIFI,ws:360|0|3.0) AliApp(AP/10.1.2.091816) AlipayClient/10.1.2.091816 Language/en useStatusBar/true
某桌面操作系统浏览器的 UserAgent 信息:
Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.78 Safari/537.36
由以上信息可知微信客户端内置浏览器的 UserAgent 包含了一个 MicroMessenger 的特殊标识,而支付宝内置浏览器的 UserAgent 包含了一个 AlipayClient 的特殊标识,由此可将两种支付客户端区分开来。
function OneQRCPay_UADetector() { $ua = $_SERVER['HTTP_USER_AGENT']; if (strpos($ua, 'AlipayClient') == true) { OneQRCPay_AliPay(); // 响应支付宝访问事件 } else if (strpos($ua, 'MicroMessenger') == true) { OneQRCPay_WechatPay(); // 响应微信访问事件 } else { die('错误:未知的支付客户端!请使用微信、支付宝扫描访问。'); } }
如何做到合并微信和支付宝的收款码呢?先做一个页面用于响应不同的客户端支付请求,然后再将此页面 URL 做成二维码,顾客支付时扫描该二维码即可实现一码付。
支付宝收款码中的链接是标准的 HTTPS 协议链接,形如 HTTPS://QR.ALIPAY.COM/FKX01234Z5XXXXX ,可以通过重定向唤起支付宝支付页面。但是微信收款码中的链接是其私有的协议链接,形如 wxp://f2f0YfH1eXtXXXXXXXX ,只能通过扫描访问唤起支付页面,无奈微信支付在扫码后还需对页面的二维码进行识别。
function OneQRCPay_AliPay() { $url = ''; header('Location: ' . $url); die(); } function OneQRCPay_WechatPay() { $wcpqrc = 'https://www.example.com/wcpqrc.png?timestamp='. time(); // 微信收款码图片 $wcpp = <<<EOF <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <title>微信支付</title> </head> <body> <div class="wcpqrc" style="position: absolute;margin: auto;top: 0;bottom: 0;left: 0;right: 0;width: 800px;"> <h2>长按图片识别二维码</h2> <img src="{$wcpqrc}" alt="微信支付" title="微信支付" style="width: 800px;" /> </div> </body> </html> EOF; die($wcpp); }
插件
Z-BlogPHP 插件:https://app.zblogcn.com/?id=1472
Github:https://github.com/lanseyujie/ZBlogPHPApps/tree/master/plugin/OneQRCPay
P.S. 点击下方的打赏按钮可以体验一码付 [手动滑稽]