支付二维码整合 - 三码合一支持支付宝、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、微信的更多相关文章

  1. 微信支付之01------获取订单微信支付二维码的接口------Java实现

    [ 前言:以前写过一个获取微信二维码支付的接口,发现最近公司新开的项目会经常用到,现在我又翻出代码看了一遍,觉得还是把整个代码流程记下来的好 ] 借鉴博客: 他这篇博客写得不错,挺全的:https:/ ...

  2. 通过生成支付二维码来实现微信支付的解决方案 - EasyWechat版(转)

    上一篇我们讲了在微信浏览器内实现微信支付的功能,它特别适合于一些基于微信公众号的h5站点等,支付流程也相当流畅,但是... 还有一种情况,比如现在北哥兄弟连PC版,是生成了一个二维码,这个二维码是专属 ...

  3. PHP实现一个二维码同时支持支付宝和微信支付

    实现思路 生成一个二维码,加入要处理的url连接 在用户扫完码后,在对应的脚本中,判断扫码终端,调用相应的支付 若能够扫码之后能唤起相应app,支付宝要用手机网站支付方式,微信要使用jsapi支付方式 ...

  4. 微信web端生成支付二维码

    授权获取二维码类: <?php /** * Trade类 * @author xyyphp * @date 2016/10/10 */ abstract class TradeControlle ...

  5. springboot微信支付,支付二维码生成

    https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=9_1 微信扫码支付开发者文档,里面会有支付流程的教程 接口链接 URL地址:htt ...

  6. asp.net mvc PC端二维码支付实例(微信二维码支付)

    一.微信支付方式介绍 微信提供了各种支付方式,试用于各种不同的支付场景,主要有如下几种: 1.刷卡支付 刷卡支付是用户展示微信钱包内的“刷卡条码/二维码”给商户系统扫描后直接完成支付的模式.主要应用线 ...

  7. JAVA实现的微信扫描二维码支付

    吐槽一下 支付项目采用springMvc+Dubbo架构实现,只对外提供接口. 话说,为什么微信支付比支付宝来的晚了那么一点,一句话,那一阵挺忙的,然后就没有时间整理,最近做完支付宝支付,顺便也把微信 ...

  8. (用微信扫的静态链接二维码)微信native支付模式官方提供的demo文件中的几个bug修正

    native支付模式一demo(用微信扫的静态链接二维码)BUG修复,一共4个BUG 1.native_call_qrcode.php这个文件中的代码无法生存native支付的短地址2.WxPayPu ...

  9. 微信支付生成带logo的二维码

    利用到一个qrcode类 比较简洁 原作者没有加入二维码嵌入logo的功能 在这里我进行了小小的修改 可以实现生成微信支付二维码时打上logo 生成png格式的利用到该类中的png方法(我已经改好了) ...

随机推荐

  1. Java swing JFrame用repaint出现闪烁的问题解决

    这几天用swing写登录页面背景动图的时候发现一直会有闪烁(我的类是继承JFrame),就来搜原因后发现好像是因为repaint会调用update()方法中的清屏操作导致闪烁. 我当时看的是这个文章 ...

  2. 四、缓存DNS

    作用:缓存解析结果,提高解析速度 搭建方式: 1.全局转发,所有的DNS解析请求全部转发给公网DNS 2.根域迭代,所有的DNS解析请求全部发给根域DNS服务器 真机上实现缓存DNS服务器 1.搭建Y ...

  3. linux安装后配置

    1.1 系统设置(自测用,公司不需要) 1.1.1 Selinux系统安全保护 Security-Enhanced Linux – 美国NSA国家安全局主导开发,一套增强Linux系统安 全的强制访问 ...

  4. linux远程和软件包的管理

    远程管理 ssh   用户名@对方IP地址 -X   在本地可以运行对方的图形程序 端口 22 [root@room9pc01 ~]# ssh root@172.25.0.11 [root@serve ...

  5. 「题解」黑暗塔 wizard

    本文将同步发布于: 洛谷博客: csdn: 博客园: 简书. 题目 题意简述 给定 \(y\),求 \(\varphi(x)=y\) 中 \(x\) 的个数和最大值. \(1\leq y\leq 10 ...

  6. js-动态表单校验-吐血总结最近遇到的变态表单校验2---element+原生

    上一部分总结了基础常用的js表单校验,包括原生以及框架,下面来总结这一个月涉及到的动态校验: 动态表单校验大致分为三种情况: 1. 首先是固定校验规则,但是表单组件是动态生成的,例如:在表单或者表格里 ...

  7. Linkerd 2.10(Step by Step)—设置服务配置文件

    Linkerd 2.10 系列 快速上手 Linkerd v2.10 Service Mesh 腾讯云 K8S 集群实战 Service Mesh-Linkerd2 & Traefik2 部署 ...

  8. Golang中的各种时间操作

    Golang中的各种时间操作 需求 时间格式的转换比较麻烦,自己写了个工具,可以通过工具中的这些方法相互调用转成自己想要的格式,代码如下,后续有新的函数再添加 实现代码 package utils i ...

  9. 玩转STM32MP157- 使用fbtft驱动 lcd ili9341

    之前使用了 fbtft 成功驱动了lcd st7735r,现在尝试下驱动 ili9341, 配置 跟之前用 fbtft 驱动 st7735r 一样,先用 make menuconfig 配置内核,添加 ...

  10. Ubuntu18.04下安装Docker并配置SSL证书加密远程连接

    Docker下载与安装 下载安装包 国内网络连接docker镜像还是比较慢的,这里推荐直接下载docker镜像,Ubuntu镜像下载路径为:https://download.docker.com/li ...