支付二维码整合 - 三码合一支持支付宝、QQ、微信
支付二维码整合 - 三码合一支持支付宝、QQ、微信
1. 前提:获取各个二维码的具体内容
在写代码前,我们需要先获取不同支付方式的二维码内容。很简单,只需要打开各个支付码,截图,然后随便找个可以扫码的工具把各个码的内容给扫出来,得到文本内容即可。下面是我的内容:
支付宝:
https://qr.alipay.com/tsx108134acakckixsivtd4
微信:
wxp://f2f0kIl6qSrlWNFuIo8t8rXCU7Si7CC7ucQs
QQ:
https://i.qianbao.qq.com/wallet/sqrcode.htm?m=tenpay&f=wallet&a=1&ac=CAEQi5uqmQMY8Y-T_wU%3D_xxx_sign&u=QQ号&n=昵称
2. 方法一:使用Nginx 分发内容
可以看到各个支付方式都是甚于带参跳转协议,所以我们可以用一个固定的网址,让它去检测不同的网站进而跳转不同的链接。
这一步可以用后台程序跳转,也可以用Nginx 这样的服务器去做,因为只需要能对请求的内容做区分就可以了。
用Nginx 可以这样写:
location /pay {
if ( $http_user_agent ~* "AlipayClient" ) { return 302 "https://qr.alipay.com/tsx108134acakckixsivtd4"; }
if ( $http_user_agent ~* "MicroMessenger" ) { return 302 "wxp://f2f0kIl6qSrlWNFuIo8t8rXCU7Si7CC7ucQs"; }
if ( $http_user_agent ~* "QQ" ) { return 302 "https://i.qianbao.qq.com/wallet/sqrcode.htm?m=tenpay&f=wallet&a=1&ac=CAEQi5uqmQMY8Y-T_wU%3D_xxx_sign&u=QQ号&n=昵称"; }
return 400 "不支持的类型";
}
经测试,发现QQ, 微信不可以用 可能是腾讯为了安全规避了由跳转过来的调用吧。
3. 方法二:使用独立的二维码1
由于不能使用跳转去完全支持三种支付方式了。这里我们小改一下,首先用二维码生成工具生成样式统一的二维码,因为原生那个三家的码都长得不太一样会影响美观。
QQ:

微信:

然后小改一下上面的Nginx 配置,改成如果是这两个的话跳转到对应的页面。
删减1
上面这个页面,如果你是从微信浏览器打开的应该会看到微信的支付码,如果是QQ 浏览器中打开应该会看到QQ 的支付码。如果是从其他浏览器或者PC 则什么码都看不到。
此时的Nginx 的配置:
location /donate {
root /www/pages/build/donate;
if ( $http_user_agent ~* "AlipayClient" ) { return 302 "https://qr.alipay.com/tsx108134acakckixsivtd4"; }
if ( $http_user_agent ~* "MicroMessenger" ) { rewrite ^/(.*) /wechat.html break; }
if ( $http_user_agent ~* "QQ" ) { rewrite ^/(.*) /qq.html break; }
return 302 "https://www.pulsgarney.com/";
}
4. 方法三:使用独立的二维码2
做到这里了基本能实现功能了。
但如果用户是直接从手机的客户端里打开那其实那个体验还是不太好。因为那样他们就等于是得扫码,打开对应的页面,然后再长按一次扫码才能看到收银台。这个步骤体验也很糟糕。可以怎么优化一下呢?我们把前端页面的代码修改一下:如果是在手机客户端中打开的那我们就直接显示对应的支付码就好了,不要再显示那个中转页面的二维码了。
这部分的改动就看你用的是什么前端程序了,应对改就行了。下面是我这个博客的部分代码:
const [qrCode, setQrCode] = React.useState('');
React.useEffect(() => {
const ua = window.navigator.userAgent || '';
if (ua.includes('AlipayClient')) {
setQrCode(process.env['REACT_APP_DONATE_ALIPAY'] || '');
} else if (ua.includes('MicroMessenger')) {
setQrCode(process.env['REACT_APP_DONATE_WECHAT'] || '');
} else if (ua.includes('QQ')) {
setQrCode(process.env['REACT_APP_DONATE_QQ'] || '');
} else {
setQrCode(process.env['REACT_APP_DONATE_INDEX'] || '');
}
}, []);
因为我的博客使用了同构的SSR. 所以需要将浏览器的代码用 React.useEffect 给包起来,否则在服务器渲染时会报错。另外各个不同的二维码内容用环境变量加载起来,这样如果需要替换内容可以不动这部分代码。
经测试,微信正常,但支付宝内好像不让加载JS 文件?页面是加载了,但JS 的功能全废了。。QQ 的二维码好像太复杂没识别出来……
5. 总结
折腾的过程很有意思,但没有和他们合作的能力靠Hack 的方式实现最终的实用性还是槽点满满的,所以,要真有刚需的还是接第三方的服务吧~
支付二维码整合 - 三码合一支持支付宝、QQ、微信的更多相关文章
- 微信支付之01------获取订单微信支付二维码的接口------Java实现
[ 前言:以前写过一个获取微信二维码支付的接口,发现最近公司新开的项目会经常用到,现在我又翻出代码看了一遍,觉得还是把整个代码流程记下来的好 ] 借鉴博客: 他这篇博客写得不错,挺全的:https:/ ...
- 通过生成支付二维码来实现微信支付的解决方案 - EasyWechat版(转)
上一篇我们讲了在微信浏览器内实现微信支付的功能,它特别适合于一些基于微信公众号的h5站点等,支付流程也相当流畅,但是... 还有一种情况,比如现在北哥兄弟连PC版,是生成了一个二维码,这个二维码是专属 ...
- PHP实现一个二维码同时支持支付宝和微信支付
实现思路 生成一个二维码,加入要处理的url连接 在用户扫完码后,在对应的脚本中,判断扫码终端,调用相应的支付 若能够扫码之后能唤起相应app,支付宝要用手机网站支付方式,微信要使用jsapi支付方式 ...
- 微信web端生成支付二维码
授权获取二维码类: <?php /** * Trade类 * @author xyyphp * @date 2016/10/10 */ abstract class TradeControlle ...
- springboot微信支付,支付二维码生成
https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=9_1 微信扫码支付开发者文档,里面会有支付流程的教程 接口链接 URL地址:htt ...
- asp.net mvc PC端二维码支付实例(微信二维码支付)
一.微信支付方式介绍 微信提供了各种支付方式,试用于各种不同的支付场景,主要有如下几种: 1.刷卡支付 刷卡支付是用户展示微信钱包内的“刷卡条码/二维码”给商户系统扫描后直接完成支付的模式.主要应用线 ...
- JAVA实现的微信扫描二维码支付
吐槽一下 支付项目采用springMvc+Dubbo架构实现,只对外提供接口. 话说,为什么微信支付比支付宝来的晚了那么一点,一句话,那一阵挺忙的,然后就没有时间整理,最近做完支付宝支付,顺便也把微信 ...
- (用微信扫的静态链接二维码)微信native支付模式官方提供的demo文件中的几个bug修正
native支付模式一demo(用微信扫的静态链接二维码)BUG修复,一共4个BUG 1.native_call_qrcode.php这个文件中的代码无法生存native支付的短地址2.WxPayPu ...
- 微信支付生成带logo的二维码
利用到一个qrcode类 比较简洁 原作者没有加入二维码嵌入logo的功能 在这里我进行了小小的修改 可以实现生成微信支付二维码时打上logo 生成png格式的利用到该类中的png方法(我已经改好了) ...
随机推荐
- 七、SSL加密网站(待解决)
keytool -genkeypair -alias tomcat -keyalg RSA -keystore /usr/local/tomcat/keystore //创建私钥和证书文件提示输入密 ...
- UF_MTX 矩阵操作
Open C UF_MTX2_copyUF_MTX2_determinantUF_MTX2_identityUF_MTX2_initializeUF_MTX2_multiplyUF_MTX2_mu ...
- 【NX二次开发】uf5945获得旋转矩阵、uf5947根据变换矩阵移动或复制对象
返回一个矩阵,可以绕任意轴旋转. 与uf5947结合可以将对象沿着任意轴进行旋转.不是所有对象都能用uf5947变换,带参的实体.部件都不可以用此函数变换.下面是旋转WCS的例子. extern Dl ...
- java并发编程JUC第十二篇:AtomicInteger原子整型
AtomicInteger 类底层存储一个int值,并提供方法对该int值进行原子操作.AtomicInteger 作为java.util.concurrent.atomic包的一部分,从Java 1 ...
- iNeuOS工业互联网平台,在高校教学实训领域的应用
目 录 1. 概述... 2 2. 实训柜... 2 3. 培训内容... 4 4. 二次开发培训... 5 1. 概述 中国工业互联网从 0 ...
- NOIP模拟测试3「序列·熟练剖分·建造游乐园(play)」
---恢复内容开始--- 序列 刚调出来样例就A了,假装是水题. 因为是乱序,我们要求出来每两项之间最小公比,而不是直接比 求出来每两项之间最小公比,然后扫一遍就完了.(还要注意重复情况) 那么问题就 ...
- 剖析虚幻渲染体系(06)- UE5特辑Part 1(特性和Nanite)
目录 6.1 本篇概述 6.1.1 本篇内容 6.1.2 基础概念 6.2 UE5新特性 6.2.1 UE5编辑器 6.2.1.1 下载编辑器及资源 6.2.1.2 启动示例工程 6.2.1.3 编辑 ...
- YOLO V4的模型训练
1.YOLO V4模型训练的基本思路 所有机器学习涉及模型训练,一般都有训练集.验证集.测试集,因此需要准备数据集.有了数据集,再调用训练的算法,获取训练的结果.v3.v4模型训练方法相同. 2.YO ...
- 可扩展的 Web 架构与分布式系统
作者:Kate Matsudaira 译者:尹星 本文介绍了分布式架构是如何解决系统扩展性问题的粗略方法,适合刚刚入门分布式系统的同学,我把整篇文章翻译如下,希望给你一些启发. 备注:[idea]标注 ...
- 【TCP/IP】TCP服务器并发处理&源码
前言 本笔记记录的是 单个服务端并发式处理多个客户端. 下次有空在发个 单线程多个服务端并发式处理多种客户端.其实就是本笔记的一个改良版,用到select() / poll() / epoll(). ...