微信、支付宝实现一码付

文章目录 (?) [+]

    前言

            随着“无现金社会”的不断推进,越来越多的商家开始使用微信、支付宝等收款码来收款,这使得支付变得更加安全、便捷。与此同时也出现了多种电子支付客户端,如微信、支付宝、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. 点击下方的打赏按钮可以体验一码付 [手动滑稽]

    本文标题:微信、支付宝实现一码付
    本文链接:https://lanseyujie.com/post/wechat-alipay-achieve-one-qrcode-pay.html
    版权声明:本文使用「署名-非商业性使用-相同方式共享」创作共享协议,转载或使用请遵守署名协议。
    点赞 0 分享 0
    本文已有4条留言:
    • 头像
      cndong  Windows 10 x64Windows 10 x64 Google Chrome 64.0.3282.186Google Chrome 64.0.3282.186
      发表于 2018-03-21 20:10:13 来自 北京市 的朋友 回复该评论
    • 试过了 不行
    • 头像
      煮只鸡  Xiaomi 6Xiaomi 6 Google Chrome 61.0.3163.98Google Chrome 61.0.3163.98
      发表于 2017-12-10 13:28:40 来自 江西省南昌市 的朋友 回复该评论
    • 很棒!!!这个合并功能应该挺实用的,但是知道的人不多。
    • 头像
      shaoke  Windows 10 x64Windows 10 x64 QQBrowser 9.7.12661.400QQBrowser 9.7.12661.400
      发表于 2017-11-30 14:30:46 来自 上海市 的朋友 回复该评论
    • 楼主试验了没