Java将微信和支付宝支付的个二维码合二为一的方法

因公司需要将支付宝和微信的二维码合成一个,不管用户用支付宝扫还是微信扫都能打开对应的支付页面,在网上找了一些文章,很感谢各位大神的经验,我也记录下我是如何将两个二维码合二为一的~。

原理:支付宝或微信生成的二维码中本质都内嵌了一个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依赖

 <!-- 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以流的形式输出即可。

如:

 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参数可以添加请求参数。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • java版微信和支付宝退款接口

    本文实例为大家分享了java微信退款接口和支付宝退款接口的具体代码,供大家参考,具体内容如下 1.微信退款接口  相对来说我感觉微信的退款接口还是比较好调用的,直接发送httppost请求即可: /** * * 微信退款 * @param transaction_id 微信支付订单号 * @param out_refund_no 商户订单号 * @param total_fee 总金额 * @param refund_fee 退款金额 * @param op_user_id 操作人 * @ret

  • Java判断浏览器是微信还是支付宝

    下面一段代码给大家介绍java判断浏览器是微信还是支付宝,具体代码如下所示: @RequestMapping("getBrowser.do") public String getBrowser(HttpServletRequest req, HttpServletResponse resp) { String userAgent = req.getHeader("user-agent"); if (userAgent != null && userA

  • java服务器端微信、支付宝支付和退款功能

    工作需要,写了服务器端的支付和退款功能,包含微信和支付宝,网上也有很多demo可以借鉴,我把我的代码放出来,写的比较简单,有问题的欢迎指正,大家一起学习. 微信支付需要调用微信的统一下单接口,而支付宝不用. 我写的时候微信和支付宝都单独写了一个工具类,来调用支付,给前端返回需要的数据. ps:支付是可以不需要服务器端的,不过为了安全一点点,所以前端需要调起支付的字段都直接从服务器端返回,前端拿到字段直接调起支付就可以了. Map<String,String> map = new HashMap

  • Java将微信和支付宝支付的个二维码合二为一的方法

    因公司需要将支付宝和微信的二维码合成一个,不管用户用支付宝扫还是微信扫都能打开对应的支付页面,在网上找了一些文章,很感谢各位大神的经验,我也记录下我是如何将两个二维码合二为一的~. 原理:支付宝或微信生成的二维码中本质都内嵌了一个url,在扫码时实际是定向去访问二维码中内嵌的url,这样我就可以将这个url指定到我的一个控制器,在控制器中判断是微信还是支付宝软件扫的,然后去唤醒各自的支付即可. 1.首先生成二维码: folderName:存储二维码图片的文件夹名 imageName:二维码图片名

  • 微信小程序将字符串生成二维码图片的操作方法

    最近接到这样一个需求,需要在小程序里将十几位随机字符串转换为二维码的形式展示.公众号中(另一终端)调用JSSDK扫一扫功能,去扫描小程序生成的二维码.得到字符串,然后进行接下来的逻辑处理. 下面记录的是小程序中生成二维码图片这一操作,用的是原文作者改版后的生成二维码工具weapp-qrcode.js(demo的众多文件中只需将util下的这个文件拷贝到自己项目中),可在原文地址里clone demo. 截图(copy原文) 使用 1.页面wxml中放置绘制二维码的canvas 加入点击改变二维码

  • Java 实现微信和支付宝支付功能

    一.前期准备 1.申请好微信商户号appid,拿到商户id和商户秘钥,退款的话需要商户证书 2.申请好支付宝商户号appid,商户公钥和秘钥(需要用支付宝工具自己生成),支付宝退款不需要证书 二.数据库表设计 1.微信支付配置表 CREATE TABLE `py_wx_config` ( `wx_config_id` varchar(18) NOT NULL COMMENT '微信支付配置ID', `appid` varchar(128) DEFAULT NULL COMMENT '微信公众号I

  • Java番外杂谈之每天扫的二维码你了解它内含的信息吗

    ️二维码发展简史️ 条形码的诞生 在理解二维码技术原理之前,我们先来简单看下它是怎么发展起来的.早在1948年,伯纳德·塞尔沃还是费城煤气科技学院的一名研究生,在一次偶然的机会他得知当地的一家超市的老板想要院长帮忙设计一种可以扫描商品价格的装置,用以提高超市内货品销售的效率.因为超市里的收银员在结算货品的时候每次都需要手动输入架构,超时客流量达的时候,收银员结算效率十分低下.但是院长觉得这是一件非常不容易做到的事情. 然而伯纳德·塞尔沃与他的朋友约瑟夫·伍德兰德却觉得这是一个巨大的商机,决定要好

  • 微信接口生成带参数的二维码

    为了满足用户渠道推广分析的需要,公众平台提供了生成带参数二维码的接口.使用该接口可以获得多个带不同场景值的二维码,用户扫描后,公众号可以接收到事件推送. 用户扫描带场景值二维码时,可能推送以下两种事件: (1)如果用户还未关注公众号,则用户可以关注公众号,关注后微信会将带场景值关注事件推送给开发者. (2)如果用户已经关注公众号,在用户扫描后会自动进入会话,微信也会将带场景值扫描事件推送给开发者. 获取带参数的二维码的过程包括两步:(I)首先创建二维码ticket:(II)然后凭借ticket到

  • 微信 开发生成带参数的二维码的实例

    微信开发生成带参数的二维码的讲解 在微信公众号平台开发者那里,在"账号管理"那里,有一项功能是"生成带参数的二维码",通过这儿生成的二维码,只要通过微信扫一扫之后,会把事件自动推送到微信公众号上 用微信扫一扫推送到开发者网址那儿的数据如下: <xml><ToUserName><![CDATA[gh_452****b0f2]]></ToUserName> <FromUserName><![CDATA[o

  • 微信小程序长按识别二维码的几种情况分析

    目录 一.image标签 + show-menu-by-longpress=“{{true}}” 二.wx.previewImage 三. web-view 支持长按识别的码 补充:扫码中有几个可配置的参数注意下 总结 小程序中的图片已支持长按识别了,总结一下几种情况下: 一.image标签 + show-menu-by-longpress=“{{true}}” <image src="{{qrcode}}" mode="widthFix" show-menu

  • java二维码生成的方法

    本文实例为大家分享了java二维码的实现代码,供大家参考,具体内容如下 这次用到的jar包是zxing,没有用到core的jar包 先导入zxing.jar包 生成二维码 package cn.huse.erweima; import java.io.File; import java.util.HashMap; import com.google.zxing.BarcodeFormat; import com.google.zxing.EncodeHintType; import com.go

  • 微信小程序如何使用canvas二维码保存至手机相册

    前言 在使用canvas绘制海报的过程中不建议使用原生来进行画图,因为默认是不支持rpx像素的,px不会做到自适应. 推荐使用插件 Painter github地址 github.com/Kujiale-Mob (本地下载)- 配置很简单,也容易上手,无论是画矩形,还是将图片合成canvas:还是自己定义文字:都是很方便的. 附上一个简单的例子吧 <painter :customStyle="customStyle" :palette="imgDraw" /&

随机推荐