[转]将微信和支付宝支付的个二维码合二为一

摘要:
[java]viewplaincopy@RequestMappingpublicvoidqrcallbackthrowsIOException,AlipayApiException{Stringagent=request.getHeader.toLowerCase();System.out.println;if{System.out.println;}elseif{System.out.println;Stringform=testService.aliPay();response.setContentType;response.getWriter().write;//直接将完整的表单html输出到页面response.getWriter().flush();//response.sendRedirect;}}3.先说简单的,唤醒支付宝支付,其实使用的是支付宝手机网站支付:这个需要签约噢~https://b.alipay.com/signing/productDetail.htm?

本文转自:https://blog.csdn.net/woshishuiaaad/article/details/53540933

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

原理:支付宝或微信生成的二维码中本质都内嵌了一个url,在扫码时实际是定向去访问二维码中内嵌的url,这样我就可以将这个url指定到我的一个控制器,在控制器中判断是微信还是支付宝软件扫的,然后去唤醒各自的支付即可。

1.首先生成二维码:

folderName:存储二维码图片的文件夹名

imageName:二维码图片名称

content:是在二维码中写入的内容,这里我传入的是URL:指定我判断软件类型的控制器

  1. publicstaticStringgenQRImage(StringfolderName,StringimageName,Stringcontent){
  2. //StringfilePath=System.getProperty("twtwebapp.root");
  3. StringfileName=imageName+".png";
  4. try{
  5. //检查是否存在imageQR目录,不存在则先创建
  6. Filefile=newFile(folderName);
  7. if(!file.exists()&&!file.isDirectory()){
  8. file.mkdir();
  9. }
  10. folderName=file.getAbsolutePath();
  11. intwidth=200;//图像宽度
  12. intheight=200;//图像高度
  13. Stringformat="png";//图像类型
  14. Map<EncodeHintType,Object>hints=newHashMap<EncodeHintType,Object>();
  15. hints.put(EncodeHintType.CHARACTER_SET,"UTF-8");
  16. hints.put(EncodeHintType.MARGIN,1);
  17. BitMatrixbitMatrix=newMultiFormatWriter().encode(content,BarcodeFormat.QR_CODE,width,height,hints);//生成矩阵
  18. Pathpath=FileSystems.getDefault().getPath(folderName,fileName);
  19. MatrixToImageWriter.writeToPath(bitMatrix,format,path);//输出图像
  20. log.info("二维码已经生成,"+path);
  21. fileName=path.toString();
  22. }catch(Exceptione){
  23. log.error(e.getMessage(),e);
  24. fileName=null;
  25. }
  26. returnfileName;
  27. }

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

就是根据这两个请求头去判断对应的软件类型,根据不同的软件类型去唤醒不同的支付。

  1. @RequestMapping("qrcallback")
  2. publicvoidqrcallback(HttpServletRequestrequest,HttpServletResponseresponse)throwsIOException,AlipayApiException{
  3. Stringagent=request.getHeader("User-Agent").toLowerCase();
  4. System.out.println("响应头的类型:"+agent);
  5. if(agent.indexOf("micromessenger")>0){
  6. System.out.println("微信支付");
  7. }elseif(agent.indexOf("alipayclient")>0){
  8. System.out.println("阿里支付");
  9. Stringform=testService.aliPay();
  10. response.setContentType("text/html;charset=UTF-8");
  11. response.getWriter().write(form);//直接将完整的表单html输出到页面
  12. response.getWriter().flush();
  13. //response.sendRedirect("/ali.html");
  14. }
  15. }

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依赖

  1. <spanstyle="white-space:pre;"></span><!--alipay-sdk-->
  2. <dependency>
  3. <groupId>com.twt.charge</groupId>
  4. <artifactId>alipay-sdk-java</artifactId>
  5. <version>20160519120058</version>
  6. </dependency>

2.生成form参数:

里面的参数自己填写从支付宝获取的那些参数,copy我的肯定出错哈

  1. publicStringaliPay()throwsAlipayApiException{
  2. AlipayClientalipayClient=newDefaultAlipayClient(openapi,SecurityUtil.decodeBase64(appid),
  3. SecurityUtil.decodeBase64(rsa_private_key),"json","utf-8",SecurityUtil.decodeBase64(alipay_pub_key));
  4. AlipayTradeWapPayRequestalipayRequest=newAlipayTradeWapPayRequest();//创建API对应的request
  5. alipayRequest.setReturnUrl("http://192.168.1.219:22222/ali.html");
  6. alipayRequest.setNotifyUrl("http://192.168.1.219:22222/callback");//在公共参数中设置回跳和通知地址
  7. alipayRequest.setBizContent("{"+""out_trade_no":"20160320020192222","+""total_amount":66.66,"
  8. +""subject":"主题","+""seller_id":"213215dsa","+
  9. //""product_code":"QUICK_WAP_PAY""+
  10. "}");//填充业务参数
  11. Stringform=alipayClient.pageExecute(alipayRequest).getBody();//调用SDK生成表单
  12. returnform;
  13. }

将这个form以流的形式输出即可。

如:

  1. <spanstyle="white-space:pre;"></span>response.setContentType("text/html;charset=UTF-8");
  2. response.getWriter().write(form);//直接将完整的表单html输出到页面
  3. response.getWriter().flush();

唤起支付宝支付就这么简单,但要注意参数中的账单号要是商户系统中唯一的账单号。

4.唤起微信支付:唤起的其实是微信公众号支付,做过公众号支付的同学都知道,调用微信公众号的统一下单API时

需要传入openID,即用户在该公众号的下的唯一标识,这个过程需要用于授权登录该公众号,这个过程是一个缺点,

用户仅仅只是微信的扫码支付,但你中间不是黑箱子的形式展示,而是在支付中多出了一个授权登录的页面,并且

也比较繁琐,在唤醒微信支付的过程中请求次数较多,所以微信支付会比正在的扫码支付会慢很多。

唤起微信公众号支付:{

步骤:

1.首先拼装好你的授权登录url。在类型控制中判断如果是微信支付则重定向到微信授权登录页面,微信会重定向到

你在授权登录url中设置重定向url参数的页面,

2.跳转到这个页面后,先获取到用户code然后利用ajax访问服务端,

3.服务端使用code去获取用户的openID,

4.根据openID去调用微信公众号的统一下单API生成参数,然后返回给页面唤醒支付,这就是整个微信的流程,

中间访问了3次微信获取数据,整个流程共6次请求,需要将微信跳转的页面放到官网的微信目录下。

在写这篇博文的时候因为支付宝我还没有签约,所以没有调通,而微信也只成功了一次,但第二次什么都没改的情况

下就不行了,写这篇博文顺便捋捋思路,怎么更简单。

注:访问微信授权页面中的redirect_url参数可以添加请求参数。

免责声明:文章转载自《[转]将微信和支付宝支付的个二维码合二为一》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇【转】获取屏幕分辨率及大小相关初识gauge自动化测试框架下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

微信公众号测试账号-redirect_uri域名与后台配置不一致,错误代码:10003

微信公众号测试账号-redirect_uri域名与后台配置不一致,错误代码:10003 进入公众平台测试账号。 登录公众账号——“开发者中心”——“公众平台测试账号”。 需要配置的几个重要的点: 1.此处配置服务器接口拿到Token跟下面的Token一致(此处域名配置需要加http(s)前缀) 2.此处是微信网页授权的服务器域名配置,需要与上面拿取Toke...

神牛微信通讯录好友(账号,昵称,备注,描述,标签,省市,个签)导出助手

现在微信在各个方面已经是越来越完善了,特别是一些细节方面。 比如在微信通讯录里可以添加备注,描述,标签分组,甚至是添加电话。 如果是用自己微信做微商的朋友,我想这个功能对您是超级无敌重要的吧。 特别是备注,描述啊之类的。 重要归重要,但是当微信通讯录好友多了,想把这些资料导出来整理的话,就麻烦了,因为微信不提供这个功能呀。 那怎么办呢。今天介绍款神牛微信通...

如何区分APP内的原生还是H5

【转载】原文地址:https://blog.csdn.net/hanlongzhou/article/details/93044238 1、看断网的情况把手机的网络断掉。然后点开页面。然后可以正常显示的东西就是原生写的。显示404或则错误页面的是html页面。 2、看布局边界开发者选项->显示布局边界,页面元素很多的情况下布局是一整块的是h5的,布局...

微信公众平台开发步骤(包括自定义菜单、网页授权、分享功能)

第一步:填写服务器配置 第二步:验证服务器地址的有效性 第三步:依据接口文档实现业务逻辑 用户向公众号发送消息时,公众号方收到的消息发送者是一个OpenID,是使用用户微信号加密后的结果,每个用户对每个公众号有一个唯一的OpenID。此外,由于开发者经常有需在多个平台(移动应用、网站、公众帐号)之间共通用户帐号,统一帐号体系的需求,微信开放平台(open....

微信小程序-注册相关流程

1. 先注册(https://mp.weixin.qq.com/wxopen/waregister?action=step1)  2.登录(https://mp.weixin.qq.com/)  3.依据发布流程填写相关信息(在小程序开发工具项目填写 对应的小程序 appid )记得绑定开发者,管理者  4. 还可以登录微信公众号,在小程序管理...

微慕WordPress小程序专业版v2.0

不经意间,微慕专业版发布已经过去一年了,微慕开源版的推出也有两年半了。2017年5月间,我花了2天时间,用WordPress插件做后端,写了个微信小程序,并开源到github(截至2019年10月14日,star数目为1.4k),利用业余时间不断完善,让我没想到的是,由当初简陋的几百行代码程序,现在已经是20000多行代码(包括插件和小程序)的小型软件产品...