[转]将微信和支付宝支付的个二维码合二为一
本文转自:https://blog.csdn.net/woshishuiaaad/article/details/53540933
因公司需要将支付宝和微信的二维码合成一个,不管用户用支付宝扫还是微信扫都能打开对应的支付页面,在网上找了一些文章,很感谢各位大神的经验,我也记录下我是如何将两个二维码合二为一的~。
原理:支付宝或微信生成的二维码中本质都内嵌了一个url,在扫码时实际是定向去访问二维码中内嵌的url,这样我就可以将这个url指定到我的一个控制器,在控制器中判断是微信还是支付宝软件扫的,然后去唤醒各自的支付即可。
1.首先生成二维码:
folderName:存储二维码图片的文件夹名
imageName:二维码图片名称
content:是在二维码中写入的内容,这里我传入的是URL:指定我判断软件类型的控制器
- public static String genQRImage(String folderName, String imageName, String content) {
- //String filePath = System.getProperty("twtwebapp.root");
- String fileName = imageName + ".png";
- try {
- // 检查是否存在imageQR目录,不存在则先创建
- File file = new File(folderName);
- if (!file.exists() && !file.isDirectory()) {
- file.mkdir();
- }
- folderName = file.getAbsolutePath();
- int width = 200; // 图像宽度
- int height = 200; // 图像高度
- String format = "png";// 图像类型
- Map<EncodeHintType, Object> hints = new HashMap<EncodeHintType, Object>();
- hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");
- hints.put(EncodeHintType.MARGIN, 1);
- BitMatrix bitMatrix = new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, width, height, hints);// 生成矩阵
- Path path = FileSystems.getDefault().getPath(folderName, fileName);
- MatrixToImageWriter.writeToPath(bitMatrix, format, path);// 输出图像
- log.info("二维码已经生成," + path);
- fileName = path.toString();
- } catch (Exception e) {
- log.error(e.getMessage(), e);
- fileName = null;
- }
- return fileName;
- }
2.定义类型控制器:
大家一定都想问是如何判断打开软件的类型,把Request Header Cookie 都看看就明白了,扫码二维码时不会传入任何参数,
但会有一个请求头,就是这个请求头告知了我打开软件的类型。
使用request获取名为User-Agent的请求头,
支付宝的请求头:ucbrowser/1.0.0.100 u3/0.8.0 mobile safari/534.30 alipaydefined(nt:wifi,ws:360|604|3.0) aliapp(ap/9.9.7.112401) alipayclient/9.9.7.112401 language/zh-hans usestatusbar/true
微信的请求头: mqqbrowser/6.8 tbs/036887 safari/537.36 micromessenger/6.3.31.940 nettype/wifi language/zh_cn
就是根据这两个请求头去判断对应的软件类型,根据不同的软件类型去唤醒不同的支付。
- @RequestMapping("qrcallback")
- public void qrcallback(HttpServletRequest request, HttpServletResponse response) throws IOException, AlipayApiException {
- String agent = request.getHeader("User-Agent").toLowerCase();
- System.out.println("响应头的类型:"+agent);
- if (agent.indexOf("micromessenger") > 0) {
- System.out.println("微信支付");
- } else if (agent.indexOf("alipayclient") > 0) {
- System.out.println("阿里支付");
- String form = testService.aliPay();
- response.setContentType("text/html;charset=UTF-8");
- response.getWriter().write(form);//直接将完整的表单html输出到页面
- response.getWriter().flush();
- // response.sendRedirect("/ali.html");
- }
- }
3.先说简单的,唤醒支付宝支付,其实使用的是 支付宝手机网站支付:这个需要签约噢~
https://b.alipay.com/signing/productDetail.htm?productId=I1011000290000001001
这个唤起支付可以看看官网是怎么写的:https://doc.open.alipay.com/docs/doc.htm?treeId=203&articleId=105285&docType=1
有两种方式:一种是页面唤醒,自己构建请求form参数然后请求支付宝唤醒支付操作,另一种是服务端调用支付宝的SDK去生
成form参数然后去请求支付宝,我使用的是第二种。
步骤:{
1.首先引入pom.xml依赖
- <span style="white-space:pre;"> </span><!-- alipay-sdk -->
- <dependency>
- <groupId>com.twt.charge</groupId>
- <artifactId>alipay-sdk-java</artifactId>
- <version>20160519120058</version>
- </dependency>
2.生成form参数:
里面的参数自己填写从支付宝获取的那些参数,copy我的肯定出错哈
- public String aliPay() throws AlipayApiException {
- AlipayClient alipayClient = new DefaultAlipayClient(openapi, SecurityUtil.decodeBase64(appid),
- SecurityUtil.decodeBase64(rsa_private_key), "json", "utf-8", SecurityUtil.decodeBase64(alipay_pub_key));
- AlipayTradeWapPayRequest alipayRequest = new AlipayTradeWapPayRequest();// 创建API对应的request
- alipayRequest.setReturnUrl("http://192.168.1.219:22222/ali.html");
- alipayRequest.setNotifyUrl("http://192.168.1.219:22222/callback");// 在公共参数中设置回跳和通知地址
- alipayRequest.setBizContent("{" + " \"out_trade_no\":\"20160320020192222\"," + " \"total_amount\":66.66,"
- + " \"subject\":\"主题\"," + " \"seller_id\":\"213215dsa\"," +
- // " \"product_code\":\"QUICK_WAP_PAY\"" +
- " }");// 填充业务参数
- String form = alipayClient.pageExecute(alipayRequest).getBody(); // 调用SDK生成表单
- return form;
- }
将这个form以流的形式输出即可。
如:
- <span style="white-space:pre;"> </span>response.setContentType("text/html;charset=UTF-8");
- response.getWriter().write(form);//直接将完整的表单html输出到页面
- response.getWriter().flush();
}
唤起支付宝支付就这么简单,但要注意参数中的账单号要是商户系统中唯一的账单号。
4.唤起微信支付:唤起的其实是微信公众号支付,做过公众号支付的同学都知道,调用微信公众号的统一下单API时
需要传入openID,即用户在该公众号的下的唯一标识,这个过程需要用于授权登录该公众号,这个过程是一个缺点,
用户仅仅只是微信的扫码支付,但你中间不是黑箱子的形式展示,而是在支付中多出了一个授权登录的页面,并且
也比较繁琐,在唤醒微信支付的过程中请求次数较多,所以微信支付会比正在的扫码支付会慢很多。
唤起微信公众号支付:{
步骤:
1.首先拼装好你的授权登录url。在类型控制中判断如果是微信支付则重定向到微信授权登录页面,微信会重定向到
你在授权登录url中设置重定向url参数的页面,
2.跳转到这个页面后,先获取到用户code然后利用ajax访问服务端,
3.服务端使用code去获取用户的openID,
4.根据openID去调用微信公众号的统一下单API生成参数,然后返回给页面唤醒支付,这就是整个微信的流程,
中间访问了3次微信获取数据,整个流程共6次请求,需要将微信跳转的页面放到官网的微信目录下。
在写这篇博文的时候因为支付宝我还没有签约,所以没有调通,而微信也只成功了一次,但第二次什么都没改的情况
下就不行了,写这篇博文顺便捋捋思路,怎么更简单。
注:访问微信授权页面中的redirect_url参数可以添加请求参数。
}
转载于:https://www.cnblogs.com/freeliver54/p/9039595.html
[转]将微信和支付宝支付的个二维码合二为一相关推荐
- java生成二维码-微信支付、支付宝支付链接转二维码解决方案
1.后台返回链接利用js生成二维码供客户使用 需要js文件:qrcode.min.js 下载地址:http://static.runoob.com/assets/qrcode/qrcode.min.j ...
- 微信支付返回支付链接生成二维码问题
微信支付返回的二维码格式为: weixin://wxpay/bizpayurl?pr= <img id="qrcodestr" src="{wechatUrl}&q ...
- 微信闪退Bug罪魁祸首竟是二维码引擎,附源代码分析
建议别尝试:转发这个二维码到群里,3秒后你会回来骂我(抖m求骂) 近日,网传微信识别上方二维码就会出现闪退BUG,小编也忍不住尝试了一下,果然,一识别该二维码微信立马就出现了闪退的现象: 且会出现&q ...
- Java实现微信公众号直接发送参数二维码给用户
文章目录 前言 一.参数二维码的作用 二.功能实现 1. 生成带参数二维码 2. 上传二维码图片 3. 发送带参数二维码给用户 总结 前言 公众号开发近些年是一个比较热门的方向,今天为大家讲解的是用J ...
- 微信公众号扫描带参数二维码实现自动分组?
2019独角兽企业重金招聘Python工程师标准>>> 最近很多人都在问微信公众号扫描带参数二维码实现自动分组,通过微号帮平台操作实现,这个功能不止如此,微信二维码来源统计分析.微信 ...
- 微信小程序业务-字符串生成二维码(weapp-qrcode)
微信小程序业务-字符串生成二维码(weapp-qrcode) 前言 邂逅weapp-qrcode 基本使用 详细参数 小程序组件中使用 image属性详解 想使用网络图片? 参考地址 前言 在小程序项 ...
- 教你做一个微信添加好友收付款的个性二维码
准备工作 首先需要了解二维码,二维码即保存数据的一个容器.微信自己让别人添加好友的二维码同样如此,我们需要把url从微信的二维码中提取出来,在加入到自己准备的背景中.完成~ 需要的库 MyQR,pyz ...
- 微信小程序生成带参数的二维码
微信小程序生成带参数的二维码 //写一个图片来写路径,好让二维码显示出来 <image style="width:500rpx;height:500rpx;" src=&qu ...
- 微信扫一扫功能扫描二维码调用外部浏览器打开指定页面实现微信中下载APP的功能
需求分析 分享链接已经成为手机应用一个非常重要的推广传播形式.为了提高转化率,就需要用户不管是在微信内直接打开链接还是扫描二维码都能直接打下载app. 但由于微信对第三方应用管的非常严格,故目前的大环 ...
最新文章
- ossim-agent代理和要监控的服务器的配置
- CentOS下安装JDK7 转载
- java数据库防火墙,数据库centos7防火墙导致java程序访问mongodb3.0.1时报错的问题分析...
- setlenient_Java日历setLenient()方法与示例
- 【解决问题】OpenCV(3.4.1) Error: Parsing error (xx.yaml(13): Incorrect indentation) in icvYMLParseValue
- C语言二级考试都是从题库抽取吗,c語言二級考試題庫_全國計算機等級考試二級C語言的考試題目都是從《C語言題庫》裡面抽取的題目嗎_淘題吧...
- jquery 文档就绪
- 圆你的大厂梦!字节跳动Java高频面试题真题一二三面常见问题
- Dnsmasq+ipset+iptables基于域名的流量管理
- 工业云计算技术在工业自动化系统中的作用
- Freeway:Maximizing MLP for Slice-Out-of-Order Execution
- 正则表达式实现与或非
- macOS Big Sur 11.6 (20G165) 虚拟机 IOS 镜像
- pyinstaller 生成exe之后不报毒的终极方法(亲测可用)
- vm文件,.vm后缀的文件
- 记腾讯的暑期实习面试
- java 类型参数推断
- Flash/Flex学习笔记(43):动量守恒与能量守恒
- 一种4Gwifi远程控制三色灯蜂鸣报警器支持ERP安灯系统MESAPS对接
- 麻雀虽小,五脏俱全——由C语言小程序深入学习软件工程和设计开发规范
热门文章
- Enum,Int,String的互相转换 枚举转换
- [转]:tbox中数据库的使用
- 罗森伯格荣获2015年度中国数据中心优秀供应商与中国十大布线品牌两项大奖
- UIWindowLevel详解
- IBM 、M$ 、Google Apple
- robocopy的退出返回代码
- python3生成器_Python3.7之生成器
- 注册围框html,一种可调模具围框的制作方法
- mac系统如何转换python版本_mac命令行切换python版本
- python爬虫网络中断_Python 爬虫总是超时中断?试试Tenacity重试模块