支付宝:web页面扫码支付、网站支付、支付宝即时到账 + springmvc

news/2024/5/19 0:45:31/文章来源:https://blog.csdn.net/qq_37878579/article/details/78789629

一、场景:公司需要在网站上进行支付宝支付。
二、API:使用支付宝开放平台的支付能力-即时到账接口。支付宝开放平台链接
三、分析:

1、支付宝的文档比较容易看,主要是有相应的DEMO,我这里看的DEMO是 JAVA-UTF-8版本。
这里写图片描述
2、导入DEMO,在com.alipay.config中填入对应的partner和key(在对应的商户后台获取)就可以直接运行了解支付流程了。
这里写图片描述
3、改写:我这边使用的是springmvc+mybatis。商品发起购买(走支付宝支付)、跳转到支付宝、支付宝回调支付状态。

四、实现:1、商品发起购买请求(将DEMO中的页面直接拿过来用了)。
[javascript] view plain copy
<body>  <div class="header">  <div class="container black">  <div class="qrcode">  <div class="littlecode">  <img width="16px" src="img/little_qrcode.jpg" id="licode">  <div class="showqrs" id="showqrs">  <div class="shtoparrow"></div>  <div class="guanzhuqr">  <img src="img/guanzhu_qrcode.png" width="80">  <div class="shmsg" style="margin-top:5px;">  请扫码关注  </div>  <div class="shmsg" style="margin-bottom:5px;">  接收重要信息  </div>  </div>  </div>  </div>        </div>  </div>  <div class="container">  <div class="nav">  <a href="https://www.alipay.com/" class="logo"><img src="img/alipay_logo.png" height="30px"></a>  <span class="divier"></span>  <a href="http://open.alipay.com/platform/home.htm" class="open" target="_blank">开放平台</a>  <ul class="navbar">  <li><a href="https://doc.open.alipay.com/doc2/detail?treeId=62&articleId=103566&docType=1" target="_blank">在线文档</a></li>  <li><a href="https://cschannel.alipay.com/portal.htm?sourceId=213" target="_blank">技术支持</a></li>  </ul>  </div>  </div>  <div class="container blue">  <div class="title">支付宝即时到账(create_direct_pay_by_user)</div>  </div>  </div>  <div class="content">  <%-- <form action="${ctx}/aliPay/open" class="alipayform" method="POST" target="_blank"> --%>  <div class="element" style="margin-top:60px;">  <div class="legend">支付宝即时到账交易接口快速通道 </div>  </div>  <div class="element">  <div class="etitle">商户订单号:</div>  <div class="einput"><input type="text" name="WIDout_trade_no" id="out_trade_no"></div>  <br>  <div class="mark">注意:商户订单号(out_trade_no).必填(建议是英文字母和数字,不能含有特殊字符)</div>  </div>  <div class="element">  <div class="etitle">商品名称:</div>  <div class="einput"><input type="text" name="WIDsubject" id="WIDsubject" value="test商品123"></div>  <br>  <div class="mark">注意:产品名称(subject),必填(建议中文,英文,数字,不能含有特殊字符)</div>  </div>  <div class="element">  <div class="etitle">付款金额:</div>  <div class="einput"><input type="text" name="WIDtotal_fee" id="WIDtotal_fee" value="0.01"></div>  <br>  <div class="mark">注意:付款金额(total_fee),必填(格式如:1.00,请精确到分)</div>  </div>  <div class="element">  <div class="etitle">商品描述:</div>  <div class="einput"><input type="text" name="WIDbody" id="WIDbody" value="即时到账测试"></div>  <br>  <div class="mark">注意:商品描述(body),选填(建议中文,英文,数字,不能含有特殊字符)</div>  </div>  <div class="element">  <input type="button" class="alisubmit" id="sbumitBtn" value ="确认支付">  </div>  </div>  <div id="returnAli"></div>  <div class="footer">  <p class="footer-sub">  <a href="http://ab.alipay.com/i/index.htm" target="_blank">关于支付宝</a><span>|</span>  <a href="https://e.alipay.com/index.htm" target="_blank">商家中心</a><span>|</span>  <a href="https://job.alibaba.com/zhaopin/index.htm" target="_blank">诚征英才</a><span>|</span>  <a href="http://ab.alipay.com/i/lianxi.htm" target="_blank">联系我们</a><span>|</span>  <a href="#" id="international" target="_blank">International Business</a><span>|</span>  <a href="http://ab.alipay.com/i/jieshao.htm#en" target="_blank">About Alipay</a>  <br>  <span>支付宝版权所有</span>  <span class="footer-date">2004-2016</span>  <span><a href="http://fun.alipay.com/certificate/jyxkz.htm" target="_blank">ICP证:沪B2-20150087</a></span>  </p>  </div>  
</body>  2、点击确认支付之后,这里通过ajax请求后台,将返回的一段html代码直接放到上面的<div id="returnALi"></div>中,这个表单会自动提交。
[javascript] view plain copy
$(function (){  $("#sbumitBtn").on('click', function(){  $.ajax({  type : "post",  data : {  WIDout_trade_no : $('#out_trade_no').val(),  WIDsubject : $('#WIDsubject').val(),  WIDtotal_fee : $('#WIDtotal_fee').val(),  WIDbody : $('#WIDbody').val()  },  url : "${ctx}/aliPay/open",  success : function(data) {  $('#returnAli').append(data.sHtmlText);  },  error : function(da){  }  });  })  });  3、后台controller中,基本是将demo中的alipayapi.jsp直接拿来用了,不同的是,参数的传递是自己定义的,返回方式符合apringmvc要求,并且根据业务需求保存了状态为未支付的订单信息。
[javascript] view plain copy
@RequestMapping("open")  
public ResponseEntity<HttpEntity> open(Model model, String WIDout_trade_no, String WIDsubject, String WIDtotal_fee,  String WIDbody) {  //////////////////////////////////// 请求参数//////////////////////////////////////  // 商户订单号,商户网站订单系统中唯一订单号,必填  String out_trade_no = WIDout_trade_no;  // 订单名称,必填  String subject = WIDsubject;  // 付款金额,必填  String total_fee = WIDtotal_fee;  // 商品描述,可空  String body = WIDbody;  // 把请求参数打包成数组  Map<String, String> sParaTemp = new HashMap<String, String>();  sParaTemp.put("service", AlipayConfig.service);  sParaTemp.put("partner", AlipayConfig.partner);  sParaTemp.put("seller_id", AlipayConfig.seller_id);  sParaTemp.put("_input_charset", AlipayConfig.input_charset);  sParaTemp.put("payment_type", AlipayConfig.payment_type);  sParaTemp.put("notify_url", AlipayConfig.notify_url);  sParaTemp.put("return_url", AlipayConfig.return_url);  sParaTemp.put("anti_phishing_key", AlipayConfig.anti_phishing_key);  sParaTemp.put("exter_invoke_ip", AlipayConfig.exter_invoke_ip);  sParaTemp.put("out_trade_no", out_trade_no);  sParaTemp.put("subject", subject);  sParaTemp.put("total_fee", total_fee);  sParaTemp.put("body", body);  // 其他业务参数根据在线开发文档,添加参数.文档地址:https://doc.open.alipay.com/doc2/detail.htm?spm=a219a.7629140.0.0.O9yorI&treeId=62&articleId=103740&docType=1  // 如sParaTemp.put("参数名","参数值");  // 建立请求  String sHtmlText = AlipaySubmit.buildRequest(sParaTemp, "get", "确认");  model.addAttribute("sHtmlText", sHtmlText);  // 保存支付记录  hysWebMeetingAliService.insertSelective(sParaTemp);  return new ResponseEntity(model, HttpStatus.OK);  
}  4、回调:也是直接将DEMO中的notify_url.jsp中的java代码拿来稍微做了修改和加上业务代码(修改状态等);[javascript] view plain copy
@RequestMapping("notify")  
@ResponseBody  
public String notify(HttpServletRequest request){  //获取支付宝POST过来反馈信息  Map<String,String> params = new HashMap<String,String>();  Map requestParams = request.getParameterMap();  for (Iterator iter = requestParams.keySet().iterator(); iter.hasNext();) {  String name = (String) iter.next();  String[] values = (String[]) requestParams.get(name);  String valueStr = "";  for (int i = 0; i < values.length; i++) {  valueStr = (i == values.length - 1) ? valueStr + values[i]  : valueStr + values[i] + ",";  }  //乱码解决,这段代码在出现乱码时使用。如果mysign和sign不相等也可以使用这段代码转化  //valueStr = new String(valueStr.getBytes("ISO-8859-1"), "gbk");  params.put(name, valueStr);  }  //获取支付宝的通知返回参数,可参考技术文档中页面跳转同步通知参数列表(以下仅供参考)//  //商户订单号  String out_trade_no = request.getParameter("out_trade_no");  //支付宝交易号  String trade_no = request.getParameter("trade_no");  //交易状态  String trade_status = request.getParameter("trade_status");  //获取支付宝的通知返回参数,可参考技术文档中页面跳转同步通知参数列表(以上仅供参考)//  if(AlipayNotify.verify(params)){//验证成功  //////////////////////////////////////////////////////////////////////////////////////////  //请在这里加上商户的业务逻辑程序代码  //——请根据您的业务逻辑来编写程序(以下代码仅作参考)——  boolean flg = false;  if(trade_status.equals("TRADE_FINISHED")){  //判断该笔订单是否在商户网站中已经做过处理  //如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序  //请务必判断请求时的total_fee、seller_id与通知时获取的total_fee、seller_id为一致的  //如果有做过处理,不执行商户的业务程序  //注意:  //退款日期超过可退款期限后(如三个月可退款),支付宝系统发送该交易状态通知  } else if (trade_status.equals("TRADE_SUCCESS")){  //判断该笔订单是否在商户网站中已经做过处理  //如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序  //请务必判断请求时的total_fee、seller_id与通知时获取的total_fee、seller_id为一致的  //如果有做过处理,不执行商户的业务程序  //注意:  //付款完成后,支付宝系统发送该交易状态通知  //根据订单号将订单状态和支付宝记录表中状态都改为已支付  flg = hysWebMeetingAliService.changeOrderAndAliStatusSuccess(out_trade_no);  }  //——请根据您的业务逻辑来编写程序(以上代码仅作参考)——  //out.print("success"); //请不要修改或删除  if(flg){  return "success";  }else{  return "fail";  }  //////////////////////////////////////////////////////////////////////////////////////////  }else{//验证失败  //out.print("fail");  return "fail";  }  
}  5、return_url:页面跳转同步通知页面路径,就是支付成功后,支付宝回跳的一个页面。“需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问”,支付宝明确规定了回跳的页面后面不能自定义参数,那么有的我们就是根据一些类型去判断跳转的就有点麻烦了。我这里做了一个取巧的做法:先把return_url.jsp中的java代码也直接搬过来,略做修改(换成springmvc的方式),我的回跳地址就是IP/aliPay/returnUrl,然后再new ModelAndView("redirect:/meeting/info")进行重定向到我们想到的url中,(参数问题看下文总结第4点吧)。
[javascript] view plain copy@RequestMapping("returnUrl")  public ModelAndView returnUrl(HttpServletRequest request){  ModelAndView mv = new ModelAndView("redirect:/meeting/info");  //获取支付宝GET过来反馈信息  Map<String,String> params = new HashMap<String,String>();  Map requestParams = request.getParameterMap();  for (Iterator iter = requestParams.keySet().iterator(); iter.hasNext();) {  String name = (String) iter.next();  String[] values = (String[]) requestParams.get(name);  String valueStr = "";  for (int i = 0; i < values.length; i++) {  valueStr = (i == values.length - 1) ? valueStr + values[i]  : valueStr + values[i] + ",";  }  //乱码解决,这段代码在出现乱码时使用。如果mysign和sign不相等也可以使用这段代码转化  //valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8");  params.put(name, valueStr);  }  //获取支付宝的通知返回参数,可参考技术文档中页面跳转同步通知参数列表(以下仅供参考)//  //商户订单号  String out_trade_no = request.getParameter("out_trade_no");  //支付宝交易号  String trade_no = request.getParameter("trade_no");  //交易状态  String trade_status = request.getParameter("trade_status");  <span style="color:#ff0000;">String meetingId = request.getParameter("extra_common_param");  mv.addObject("meetingId", meetingId);</span>  //获取支付宝的通知返回参数,可参考技术文档中页面跳转同步通知参数列表(以上仅供参考)//  //计算得出通知验证结果  boolean verify_result = AlipayNotify.verify(params);  if(verify_result){//验证成功  //////////////////////////////////////////////////////////////////////////////////////////  //请在这里加上商户的业务逻辑程序代码  //——请根据您的业务逻辑来编写程序(以下代码仅作参考)——  if(trade_status.equals("TRADE_FINISHED") || trade_status.equals("TRADE_SUCCESS")){  //判断该笔订单是否在商户网站中已经做过处理  //如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序  //如果有做过处理,不执行商户的业务程序  }  //该页面可做页面美工编辑  
//          out.println("验证成功<br />");  //——请根据您的业务逻辑来编写程序(以上代码仅作参考)——  //////////////////////////////////////////////////////////////////////////////////////////  }else{  //该页面可做页面美工编辑  
//          out.println("验证失败");  }  return mv;  }  五、总结:1、支付宝集成比较简答,稍微看下DEMO,跑一下了解了流程就比较容易了。
2、调试的时候,特别是回调,要把项目部署到能够外网访问的服务器上。
3、我没有遇到上面莫名其妙的问题,如果遇到了的话,可以联系我,或者看下Eclipse远程debug这篇文章,进行问题的跟踪。
4、做页面跳转同步通知页面路径时,需要传递参数怎么办,我一开始是自定义了一个参数,可是没有取到,然后我看到DEMO中有一句注释是这么写的:
[javascript] view plain copy
// 其他业务参数根据在线开发文档,添加参数.文档地址:https://doc.open.alipay.com/doc2/detail.htm?spm=a219a.7629140.0.0.O9yorI&treeId=62&articleId=103740&docType=1  
所以我打开看了之后,选择了公用回传参数extra_common_param,我自己知道这个字段对于我来说是什么含义。不过也要注意,人家说明了:
[javascript] view plain copy
参数body(商品描述)、subject(商品名称)、extra_common_param(公用回传参数)不能包含特殊字符(如:#、%、&、+)、敏感词汇,也不能使用外国文字(旺旺不支持的外文,如:韩文、泰语、藏文、蒙古文、阿拉伯语);  open方法中设值:
[javascript] view plain copy
sParaTemp.put("extra_common_param", meetingId);  returnUrl方法中取值,并作为重定向参数:
[javascript] view plain copy
String meetingId = request.getParameter("extra_common_param");  mv.addObject("meetingId", meetingId);  

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_779361.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Chrome插件:Octotree,在GitHub网站上显示代码树

https://github.com/buunguyen/octotree 上图说明&#xff0c;简洁明了&#xff01;

WAP,手机网站建站资料收集 - 老古董

http://www.williamlong.info/archives/832.html WAP是“无线应用协议”的英文简称&#xff0c;它提供了通过手机访问互联网的途径。只要有了一个支持WAP的手机&#xff0c;就可以随时随地随身地访问互联网。使用手机上网速度虽然比较慢&#xff0c;但也是移动办公的一种选择&…

JavaWeb-网站在线用户信息、网站访问量以及管理踢出用户实例

这个稍微比上个版本做得完善了一点&#xff0c;用了JavaBean来封装用户信息&#xff0c;添加了一个管理踢用户的功能。 上一个的用户访问量是通过监听request来统计的&#xff0c;在这个实例中&#xff0c;我们也可以通过过滤器来实现统计网站访问量。 直接看源码吧&#xff…

宝塔开启root_宝塔面板重大安全bug,导致一些网站甚至一些gov网站数据库被人恶意删除...

宝塔面板linux7.42&#xff0c;7.5.14测试版&#xff0c;windows6.8版本受影响&#xff0c;其他的版本没有这个问题。https://bbs.zsxwz.com/thread-3223.htmphpmyadmin授权漏洞&#xff0c;导致无需验证就可以直接登录数据库。这个问题应该存在挺久的了&#xff0c;查了一下自…

.cc是什么文件_网站服务器应该如何有效做到防御CC?

市面上普遍两种攻击模式CC攻击和DDOS攻击,DDOS攻击这个是只能通过硬件防护墙来防护的&#xff0c;CC攻击比较麻烦他是需要部署策略才能防御的&#xff0c;接下来具体和大家介绍下CC攻击是一个什么样类型的攻击和解决办法CC攻击攻击原理&#xff1a;简单解释下 攻击者控制一部分…

话说“武汉真爱医院”负面信息被百度毫不留情的给收录了|网站入侵

今天下午上班时正一如既往的敲着代码&#xff0c;做着手头待完成的工作&#xff0c;突然公司内部技术QQ群弹出消息&#xff0c;是头儿发的&#xff0c;一张图&#xff0c;截图如下&#xff1a; 是一条在百度搜索中以“武汉真爱医院”为关键词搜索出来的信息&#xff0c;相信大家…

workerman php网站,workerman的入口文件

WorkerMan入口文件和nginxPHP-FPM下的PHP应用程序一样&#xff0c;WorkerMan中的应用程序也需要一个入口文件&#xff0c;入口文件名没有要求&#xff0c;并且这个入口文件是以PHP Cli方式运行的。 (推荐学习&#xff1a;workerman教程)入口文件中是创建监听进程相关的代码&…

网站提速-缓存技术(5)

在PHP中使用memcache 数据库&#xff08;select&#xff09;读出来的数据使用memcache。在会话控制session中使用<?php$memnew Memcache;$mem->connect("localhost",11211);$sql"select * from saisai";$mysqlinew mysqli("192.168.211.128&qu…

PyQt4安装方法 - - ITeye技术网站

PyQt4安装方法 - - ITeye技术网站PyQt4安装方法 博客分类&#xff1a;框架PythonQtJavaScriptPerlGoogle 现在使用Qt4做淘宝助理5.0&#xff0c;对Qt还不算熟悉有时候想快速的看看某个类或者方法的用途&#xff0c;又不想新建一个项目。这时候Python for Qt就派上用场了。虽然…

java创建文件目录在linux上不成功_宝塔面板利用宝塔面板在阿里云Ubuntu服务器上部署Wordpress博客网站详细图文教程...

啰嗦一句&#xff1a;请网站域名备案了再来折腾再把域名解析到购买的阿里云服务器公网IP宝塔Linux面板是提升运维效率的服务器管理软件&#xff0c;支持一键LAMP/LNMP/集群/监控/网站/FTP/数据库/JAVA等100多项服务器管理功能。有30个人的专业团队研发及维护&#xff0c;经过20…

要匹配的标签和内容_SEO网站优化中标签的使用 - 神马网站优化软件

原出处&#xff1a;超级排名系统原文链接&#xff1a;SEO网站优化中标签的使用 - 超级排名系统网站优化的站内优化是非常重要的一个环节&#xff0c;当一个网站的页面数量达到一定量级的时候&#xff0c;要坚持把网站做的扁平化就显得尤为困难&#xff0c;由于站内资源的限制&a…

seo管理php源码_提高网站收录的方法,教你如何解决SEO的一大难题

提高网站收录是SEO的一大难题。非凡教育教你如何解决提高网站收录这一做SEO优化的难题。SEO优化大师教你提高网站收录的方法。稳定的更新配合网站收录量的提高可以有效提高网站的权重&#xff0c;使SEO见到成效。<br> (二维码自动识别)【上海非凡进修学院】上海淘宝培训|…

网站广告那点事儿

2019独角兽企业重金招聘Python工程师标准>>> 我一直用Chrome&#xff0c;前段时间也在纠结是不是用AdBlock吧网站广告屏蔽了&#xff0c;现在我还是启用了AdBlock&#xff0c;不过不是天天开启&#xff0c;3天左右关闭一次。 为什么要开启AdBlock 网站广告是网站的…

LaTeX入门系列之六(LaTeX网站汇总)

2019独角兽企业重金招聘Python工程师标准>>> 为了方便大家充分利用互联网学习和使用LaTeX&#xff0c;这里将相关的网络资源整理介绍一下&#xff0c;内容主要来自《Latex入门》-刘海洋-电子工业出版社一书。 1.CTAN&#xff08; the comprehensivie TeX Archive N…

建站学php还是java_建站用php还是java

建站用php还是java&#xff1f;建站用php&#xff0c;因为php是常用的网站编程语言&#xff0c;有全球超过81.7%的公共网站在服务器端采用PHP。而Java是一门面向对象编程语言&#xff0c;更适于系统程序的开发。phpPHP即“超文本预处理器”&#xff0c;是一种通用开源脚本语言。…

html打开百度自动搜索,网站添加百度自动推送代码的方法

今天有用户过来询问网站如何添加百度自动推送的代码以增加网站的收录数量&#xff0c;所以就水了这篇博文&#xff0c;如果你有此需求的话&#xff0c;不防按照此文章的方法来获取一下百度的推送代码。百度自动推送代码的作用图获取百度推送代码的方法1、打开百度搜索资源平台&…

hao123网站需要服务器吗,我已经设置“www.hao123.com”为我的主页了,可是打开IE还是“http://www.k986.com/”这个网站,也查不出毒,怎么办?...

安装IE 7 后&#xff0c;首次打开&#xff0c;会自动连接到 http://go.microsoft.com/fwlink/?LinkId74005 这个网页进行自定义设置&#xff0c;只有完成了自定义设置后&#xff0c;以后每次打开IE才会显示主页&#xff0c;不然会一直连接到这个网页。你可以这样设置&#xff…

钉钉获取免登授权码 php_钉钉扫码登录网站(两种方式实现)

钉钉扫码登录网站(两种方式实现)效果&#xff1a;源代码地址&#xff1a;https://github.com/jellydong/DingQrCodeLogin动手敲代码&#xff01;第一步&#xff0c;钉钉后台配置参考链接&#xff1a;获取appId及appSecret.点击进入钉钉开发者平台 的页面&#xff0c;点击左侧菜…

如何提高SEO优化团队效率

自2008年以来SEO这个词逐渐进入我们的视野&#xff0c;在经过多年的发展以及行业的发展涌现了许多优秀的SEO团队以及SEO优化公司&#xff0c;整个行业进行了新一轮的发展势头&#xff0c;但是也面临着对应的难题&#xff0c;也就是SEO优化团队效率的把控。(领导&#xff1a;小子…

记一次网站服务器迁移

背景&#xff1a;天翼云服务器经过两三个月的备案终于通过了&#xff08;打开了80,443,8080端口&#xff09;&#xff0c;所以准备给网站搬个新家。 记录一下本次迁移的过程吧&#xff0c;欢迎交流~ 0. 环境参数 操作系统&#xff1a;Debian 4.9.30-2deb9u5 (2017-09-19) x86_…