不败君

前端萌新&初级后端攻城狮

三合一支付二维码原理及开发过程

三合一支付二维码原理及开发过程

2019-10-13 11:00:06

围观(5161)

在很多实体店付款会遇到扫一个二维码即可实现支付宝、微信、QQ支付。

其实原理很简单,无非就是判断 UA ,也就是浏览器标识。

扫码之后其实是调用了 webview 这时候三合一的二维码是跳转到了我们的网页,就可以获取到它的 UA 标识。

根据 UA 标识可以判断是使用了什么 APP 扫码,接着就跳转这个 APP 提供的支付二维码。


废话少说。先创建一个 PHP 文件,比如 pay.php 写入:

<?php
	var_dump($_SERVER['HTTP_USER_AGENT']);

然后上传这个文件到服务器(网站根目录),因为需要在外网也能访问。然后使用微信打开该 URL (域名 + /pay.php) 可以获取到一段字符串,这段字符串就是 UA 标识:

Mozilla/5.0 (Linux; Android 9; MI 8 UD Build/PKQ1.180729.001; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/67.0.3396.87 XWEB/990 MMWEBSDK/190703 Mobile Safari/537.36 MMWEBID/569 MicroMessenger/7.0.7.1521(0x27000739) Process/tools NetType/WIFI Language/zh_CN

然后再使用支付宝去打开这个 URL ,微信还可以通过发送 URL 给朋友然后再点击打开。支付宝就只能用一些二维码生成工具了,比如使用http://tool.oschina.net/qr?type=2,将这个 URL 生成为二维码然后使用支付宝打开。

获取到的 UA 是:

Mozilla/5.0 (Linux; U; Android 9; zh-CN; MI 8 UD Build/PKQ1.180729.001) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/69.0.3497.100 UWS/3.18.0.62 Mobile Safari/537.36 UCBS/3.18.0.62_190812172930 NebulaSDK/1.8.100112 Nebula AlipayDefined(nt:WIFI,ws:393|0|2.75) AliApp(AP/10.1.75.6035) AlipayClient/10.1.75.6035 Language/zh-Hans useStatusBar/true isConcaveScreen/true Region/CN

接下来还有最后一个 QQ 的 UA 需要获取到,同上,扫码或者直接用 QQ 打开线上的 URL 即可获取到:

Mozilla/5.0 (Linux; Android 9; MI 8 UD Build/PKQ1.180729.001; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/66.0.3359.126 MQQBrowser/6.2 TBS/044904 Mobile Safari/537.36 V1_AND_SQ_8.1.5_1258_YYB_D PA QQ/8.1.5.4215 NetType/WIFI WebP/0.3.0 Pixel/1080 StatusBarHeight/89 SimpleUISwitch/1

通过 UA 可以看到使用的手机及安卓系统的版本号,所以还可以用作其他用途。

有了三个 UA 后,仔细看看有哪些地方不一样,有哪个字符可以判断它是通过什么访问的。

微信的标识:

MicroMessenger

支付宝的标识:

AlipayClient

QQ的标识很简单,就是QQ

有了标识,就需要从三个 APP 中获取支付二维码并进行解析。

先获取微信支付二维码解析后的值(下文称为支付真实地址)。也就是在微信钱包拿到这张图:

wechat.jpg

然后使用工具进行解析二维码,比如使用这个工具: http://tool.oschina.net/qr?type=2

解析后可获得一段字串(本文已经将解析出来的值进行修改,所以通过工具解析上面这个微信支付的二维码并不能得到下面这个字串,而是后面少了两个字串,这些支付字串仅作为本文演示所用):

wxp://f2f0fAFFYqeFZjSNXMfek5-74jM1cgc41-

然后同样方式拿到支付宝和QQ的。

https://qr.alipay.com/fkx0784241zw3ttx4sijs

https://i.qianbao.qq.com/wallet/sqrcode.htm?m=tenpay&f=wallet&a=1&ac=CAEQvr_N7QUY3oKK7Q%3D_xxx_sign&u=1572036542&n=%E8%8E%AB%E5%BE%97%E6%84%9F%E6%83%85%E7%9A%84%E4%BB%A3%E7%A0%81%E6%9C%BA%E5%99%

有了支付真实地址,接下来就继续在 pay.php 敲代码:

<?php
	$ua = $_SERVER['HTTP_USER_AGENT'];

	if (mb_strpos($ua, 'MicroMessenger')) {
		//此时是使用微信支付
		header('location:wxp://f2f0fAFFYqeFZjSNXMfek5-74jM1cgc41-');
	}

	if (mb_strpos($ua, 'AlipayClient')) {
		//此时是使用支付宝支付
		header('location:https://qr.alipay.com/fkx0784241zw3ttx4sijs');
	}

	if (mb_strpos($ua, 'QQ')) {
		//此时是使用QQ支付
		header('location:https://i.qianbao.qq.com/wallet/sqrcode.htm?m=tenpay&f=wallet&a=1&ac=CAEQvr_N7QUY3oKK7Q%3D_xxx_sign&u=1572036542&n=%E8%8E%AB%E5%BE%97%E6%84%9F%E6%83%85%E7%9A%84%E4%BB%A3%E7%A0%81%E6%9C%BA%E5%99%');
	}

	echo '发生错误,请使用支付宝、微信、QQ 打开本链接';

然后可以发现,只有支付宝可以正常支付,QQ 和微信打开都无法正常支付,这是因为微信和 QQ 都不支持唤醒支付。

所以只能修改成这样,当微信或者 QQ 访问时,在页面上输出一张二维码 通过长按二维码进行支付。

首先需要一个生成二维码的类支持,所以本文使用 phpqrcode 官网:http://phpqrcode.sourceforge.net/

同样将 phpqrcode.php 放到根目录。

然后创建一个 pay_qrcode.php 文件,写入:

<?php
include_once 'phpqrcode.php';
$param = $_GET['param'];

switch ($param) {
  	case 0:
    	$param = 'wxp://f2f0fAFFYqeFZjSNXMfek5-74jM1cgc41-';
    	break;
  	case 1:
    	$param = 'https://i.qianbao.qq.com/wallet/sqrcode.htm?m=tenpay&f=wallet&a=1&ac=CAEQvr_N7QUY3oKK7Q%3D_xxx_sign&u=1572036542&n=%E8%8E%AB%E5%BE%97%E6%84%9F%E6%83%85%E7%9A%84%E4%BB%A3%E7%A0%81%E6%9C%BA%E5%99%';
    	break;
}

QRcode::png($param);

再回来重新改一下 pay.php:

<?php
	$ua = $_SERVER['HTTP_USER_AGENT'];

	switch($ua){
      	case mb_strpos($ua, 'MicroMessenger') != false:
          	echo '<img src="pay_qrcode.php?param=0">';
        	echo '请长按二维码进行支付';
          	break;
      	case mb_strpos($ua, 'AlipayClient')  != false:
        	header('location:https://qr.alipay.com/fkx0784241zw3ttx4sijs');
        	break;
      	case mb_strpos($ua, 'QQ')  != false:
        	echo '<img src="pay_qrcode.php?param=1">';
        	echo '请长按二维码进行支付';
        	break;
      	default:
        	echo '请使用支付宝、微信、QQ 打开本链接';
    }

此时 已经完成了三合一二维码支付的开发。可以利用二维码生成工具,将你的 URL 进行生成一个二维码,这就是一个三合一支付的二维码。

效果扫码可见:

t2.jpg

本文地址 : bubaijun.com/page.php?id=142

版权声明 : 未经允许禁止转载!

评论:我要评论

李策 沙发

但是有些三码合一,是可以直接付款的,这个是怎么做到的呢

评论时间:2019-12-10 21:27:19

回复

BBJ不败君 板凳

@李策支付宝可以直接唤醒支付所以支付宝就不说了。QQ不了解 也不谈了。微信可以这样:利用服务号开发一个支付的H5网页,识别到微信扫码就跳这个H5网页,网页上直接一个输入框输入金额 提交订单之后就调用微信公众号的“统一下单”接口交互进行唤醒支付。

评论时间:2019-12-11 09:11:43

回复

发布评论:
Copyright © 不败君 粤ICP备18102917号-1

不败君

首 页 作 品 微 语