制作 QQ 微信支付宝三合一收款码

1、分析
能不能把QQ微信支付宝三合一,只需要扫一个收款码就行呢?
这里涉及到一个知识点,则是User-Agent,大厂的webview都会携带自家的UA信息,比如说:

QQ:MQQBrowser/6.2 TBS/043221 Safari/537.36 QQ/7.0.0.3135
微信:MQQBrowser/6.2 TBS 043220 Safari/537.36 MicroMessenger/6.5.8.1060 NetType/4G Language/zh_CN
支付宝:UCBrowser/11.5.0.939 UCBS/2.10.1.6 Mobile Safari/537.36 AliApp(AP/10.0.15.051805) AlipayClient/10.0.15.051805 Language/zh-Hans

这样就很轻松区分是QQ还是微信还是支付宝扫码了:

User-Agent 含有 QQ/ 为QQ
User-Agent 含有 MicroMessenger 为微信
User-Agent 含有 AlipayClient 为支付宝

既然能够区分每个软件,那就可以通过自建一个网址,通过二维码生成扫描这个网址后,判断浏览器的UA,来分发不同的收款码

大致的流程则为:
客户端扫码 -> 服务端根据 User-Agent 判断客户端类型 -> 分别返回不同的处理

2、生成
首先解码QQ、微信和支付宝生成的付款码,可以去http://tool.oschina.net/qr?type=2在线解码。

QQ:i.qianbao.qq.com/wallet/sqrcode.ht...
(https 协议,无法唤醒QQ)
支付宝:HTTPS://QR.ALIPAY.COM/FKX00838MLMPTYZVT8VO8A
(https 协议,可直接唤醒支付宝 APP)
微信:wxp://f2f0mu4tCV4PedzPC5fkBKbdoBT6jctdi9ez
(微信自己的支付协议,无法唤醒微信)

下面就可以直接写代码了,判断 User-Agent 如果是支付宝直接跳转支付宝链接,如果是QQ和微信则跳转QQ和微信的链接。

但由于QQ与微信无法直接唤醒APP,所以直接输出一个QQ与微信的二维码,然后长按扫码实现支付。

代码如下:

<?php
    $ua = $_SERVER['HTTP_USER_AGENT'];
    if (strpos($ua, 'MicroMessenger')) {
        $type = 'wepay';
        $name = '微信支付';
        //微信支付链接
        $url = 'wxp://f2f0mu4tCV4PedzPC5fkBKbdoBT6jctdi9ez';

        $icon_img = '<img src="http://ww2.sinaimg.cn/large/005zWjpngy1fojrwgr20oj303k03kglg.jpg" width="48px" height="48px" alt="'.$name.'">';
    }
    elseif (strpos($ua, 'AlipayClient')) {
        $type = 'Alipay';
        $name = '支付宝支付';
        //支付宝链接
        $url = 'HTTPS://QR.ALIPAY.COM/FKX00838MLMPTYZVT8VO8A';

        header('location: ' . $url);
        $icon_img = '<img src="http://news.taoming.com/uploads/allimg/141020/6363_141020152251_1.png" width="48px" height="48px" alt="'.$name.'">';
    }
    elseif (strpos($ua, 'QQ/')) {
        $type = 'qq';
        $name = 'QQ钱包支付';
        //QQ钱包支付链接
        $url = 'https://i.qianbao.qq.com/wallet/sqrcode.htm?m=tenpay&f=wallet&u=1527736751&a=1&n=%E3%80%80%E6%B1%A1%E6%B1%A1%E7%9A%84%E5%B0%8F%E4%BB%99%E5%A5%B3%F0%9F%8D%83&ac=2CD652F018FE3F8890E22D12F02DC60735A04ABB984CD758BEDEC42FA2437991';

        $icon_img = '<img src="http://ww2.sinaimg.cn/large/005zWjpngy1fojrvmp427j303k03kjrb.jpg" width="48px" height="48px" alt="'.$name.'">';
    }
    else {
        $type = 'other';
        $name = '打赏作者';
        $url = 'http://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
        $icon_img = '<img src="http://ww2.sinaimg.cn/large/005zWjpngy1fojs089x6tj303k03kjr6.jpg" width="48px" height="48px" alt="'.$name.'">';
    }
    $qr_img = '<img src="http://qr.liantu.com/api.php?text='.urlencode($url).'">';
?>
<!DOCTYPE html>
<html>
<head>
        <meta charset="utf-8">
        <meta name="renderer" content="webkit">
        <meta http-equiv="X-UA-Compatible" content="IE=Edge, chrome=1">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title><?=$name?></title>
        <style type="text/css">
                * {margin: auto;padding: 0;border: 0;}
                html {-ms-text-size-adjust: 100%;-webkit-text-size-adjust: 100%}
                body {font-family: -apple-system, SF UI Text, Arial, Microsoft YaHei, Hiragino Sans GB, WenQuanYi Micro Hei, sans-serif;color: #333;}
                img {max-width: 100%;}
                h3 {padding: 10px;}
                .container {text-align: center;}
                .title {padding: 2em 0;background-color: #fff;}
                .content {padding: 2em 1em;color: #fff;}
                .wepay {background-color: #23ac38;}
                .qq {background-color: #4c97d5;}
                .other {background-color: #ff7055;}
        </style>
</head>
<body class="<?=$type?>">
        <div class="container">
                <div class="title"><?=$icon_img?><h1><?=$name?></h1></div>
                <div class="content"><?=$type=='other'?$qr_img.'<h3>请使用支付宝、微信、QQ客户端扫码付款</h3>':$qr_img.'<h3>扫描或长按识别二维码,向TA付款</h3>'?></div>
        </div>
</body>
</html>

Demo演示:
可以通过扫描文章底部的二维码进行测试,或点击下面的演示地址:
file

本作品采用《CC 协议》,转载必须注明作者和本文链接
不要轻易放弃。学习成长的路上,我们长路漫漫,只因学无止境 Don't give up easily. On the way of learning and growing up, we have a long way to go, just because there is no end to learning.
本帖由系统于 4年前 自动加精
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!