0

0

Java调用支付宝支付接口的案例详解

php是最好的语言

php是最好的语言

发布时间:2018-08-09 13:59:35

|

4943人浏览过

|

来源于php中文网

原创

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

1、支付宝的文档比较容易看,主要是有相应的DEMO,我这里看的DEMO是 JAVA-UTF-8版本。

1.png

2、导入DEMO,在com.alipay.config中填入对应的partner和key(在对应的商户后台获取)就可以直接运行了解支付流程了。

1.png

3、改写:我这边使用的是springmvc+mybatis。商品发起购买(走支付宝支付)、跳转到支付宝、支付宝回调支付状态。

四、实现:

1、商品发起购买请求(将DEMO中的页面直接拿过来用了)。

[javascript] view plain copy


百家CMS微商城
百家CMS微商城

百家CMS微商城从诞生开始,就坚持着简单实用的原则,基于目前最流行的WEB2.0的架构(php+mysql),拥有成熟、稳定的微电商技术解决方案。基于完整的会员等级制度,完善的微商城购物流程,订单管理、优惠券、搜索、购物车等功能。采用跨平台机制,可同时对接微信公众号平台和支付宝服务窗,兼容微博、手机QQ等平台;丰富的支付方式、支持微信支付、支付宝支付、货到付款、余额支付、网银支付等。并且拥有完整的

下载
  1.   

  2.     

    class

    ="header">  

    立即学习Java免费学习笔记(深入)”;

  3.         

    class

    ="container black">  

  4.             

    class

    ="qrcode">  

  5.                 

    class

    ="littlecode">  

  6.                     Java调用支付宝支付接口的案例详解"16px" src="img/little_qrcode.jpg" id="licode">  

  7.                     

    class

    ="showqrs" id="showqrs">  

  8.                         

    class

    ="shtoparrow">

      
  9.                         

    class

    ="guanzhuqr">  

  10.                             Java调用支付宝支付接口的案例详解"img/guanzhu_qrcode.png" width="80">  

  11.                             

    class

    ="shmsg" style="margin-top:5px;">  

  12.                             请扫码关注  

  13.                             

      
  14.                             

    class

    ="shmsg" style="margin-bottom:5px;">  

  15.                                 接收重要信息  

  16.                             

      
  17.                         

      
  18.                     

      
  19.                 

            
  20.             

      
  21.         

      
  22.         

    class

    ="container">  

  23.             

    class

    ="nav">  

  24.                 "https://www.alipay.com/" class="logo">Java调用支付宝支付接口的案例详解"img/alipay_logo.png" height="30px">  

  25.                 class="pier">  

  26.                 "http://open.alipay.com/platform/home.htm" class="open" target="_blank">开放平台  

  27.                 

      class
    ="navbar">  

  28.                     

  29. "https://doc.open.alipay.com/doc2/detail?treeId=62&articleId=103566&docType=1"
  30.  target="_blank">在线文档

      
  31.                     

  32. "https://cschannel.alipay.com/portal.htm?sourceId=213"
  33.  target="_blank">技术支持

      
  34.                   

  35.             

      
  36.         

      
  37.         

    class

    ="container blue">  

  38.             

    class

    ="title">支付宝即时到账(create_direct_pay_by_user)

      
  39.         

      
  40.     

      
  41.     

    class

    ="content">  

  42.         "${ctx}/aliPay/open" class="alipayform" method="POST" target="_blank"> --%>  

  43.             

    class

    ="element" style="margin-top:60px;">  

  44.                 

    class

    ="legend">支付宝即时到账交易接口快速通道 

      
  45.             

      
  46.             

    class

    ="element">  

  47.                 

    class

    ="etitle">商户订单号:

      
  48.                 

    class

    ="einput">"text" name="WIDout_trade_no" id="out_trade_no">

      
  49.                 
      

  50.                 

    class

    ="mark">注意:商户订单号(out_trade_no).必填(建议是英文字母和数字,不能含有特殊字符)

      
  51.             

      
  52.               

  53.             

    class

    ="element">  

  54.                 

    class

    ="etitle">商品名称:

      
  55.                 

    class

    ="einput">"text" name="WIDsubject" id="WIDsubject" value="test商品123">

      
  56.                 
      

  57.                 

    class

    ="mark">注意:产品名称(subject),必填(建议中文,英文,数字,不能含有特殊字符)

      
  58.             

      
  59.             

    class

    ="element">  

  60.                 

    class

    ="etitle">付款金额:

      
  61.                 

    class

    ="einput">"text" name="WIDtotal_fee" id="WIDtotal_fee" value="0.01">

      
  62.                 
      

  63.                 

    class

    ="mark">注意:付款金额(total_fee),必填(格式如:1.00,请精确到分)

      
  64.             

      
  65.             

    class

    ="element">  

  66.                 

    class

    ="etitle">商品描述:

      
  67.                 

    class

    ="einput">"text" name="WIDbody" id="WIDbody" value="即时到账测试">

      
  68.                 
      

  69.                 

    class

    ="mark">注意:商品描述(body),选填(建议中文,英文,数字,不能含有特殊字符)

      
  70.             

      
  71.             

    class

    ="element">  

  72.                 "button" class="alisubmit" id="sbumitBtn" value ="确认支付">  

  73.             

      
  74.     

      
  75.     

    "returnAli"

    >

      
  76.     

    class

    ="footer">  

  77.         

    class

    ="footer-sub">  

  78.             "http://ab.alipay.com/i/index.htm" target="_blank">关于支付宝|  

  79.             "https://e.alipay.com/index.htm" target="_blank">商家中心|  

  80.             "https://job.alibaba.com/zhaopin/index.htm" target="_blank">诚征英才|  

  81.             "http://ab.alipay.com/i/lianxi.htm" target="_blank">联系我们|  

  82.             "#" id="international" target="_blank">International Business|  

  83.             "http://ab.alipay.com/i/jieshao.htm#en" target="_blank">About Alipay  

  84.             
      

  85.              支付宝版权所有  

  86.             class="footer-date">2004-2016  

  87.             "http://fun.alipay.com/certificate/jyxkz.htm" target="_blank">ICP证:沪B2-20150087  

  88.         

      
  89.   

  90.              

  91.     

      
  92.   


2、点击确认支付之后,这里通过ajax请求后台,将返回的一段html代码直接放到上面的

中,这个表单会自动提交。

[javascript] view plain copy


  1. $(function (){  

  2.     $("#sbumitBtn").on('click'function(){  

  3.         $.ajax({  

  4.             type : "post",  

  5.             data : {  

  6.                 WIDout_trade_no : $('#out_trade_no').val(),  

  7.                 WIDsubject : $('#WIDsubject').val(),  

  8.                 WIDtotal_fee : $('#WIDtotal_fee').val(),  

  9.                 WIDbody : $('#WIDbody').val()  

  10.             },  

  11.             url : "${ctx}/aliPay/open",  

  12.             success : function(data) {  

  13.                 $('#returnAli').append(data.sHtmlText);  

  14.             },  

  15.             error : function(da){  

  16.             }  

  17.         });  

  18.     })  

  19.       

  20. });  


3、后台controller中,基本是将demo中的alipayapi.jsp直接拿来用了,不同的是,参数的传递是自己定义的,返回方式符合apringmvc要求,并且根据业务需求保存了状态为未支付的订单信息。

[javascript] view plain copy


  1. @RequestMapping("open")  

  2. public ResponseEntity open(Model model, String WIDout_trade_no, String WIDsubject, String WIDtotal_fee,  

  3.         String WIDbody) {  

  4.   

  5.     //////////////////////////////////// 请求参数//////////////////////////////////////  

  6.   

  7.     // 商户订单号,商户网站订单系统中唯一订单号,必填  

  8.     String out_trade_no = WIDout_trade_no;  

  9.     // 订单名称,必填  

  10.     String subject = WIDsubject;  

  11.     // 付款金额,必填  

  12.     String total_fee = WIDtotal_fee;  

  13.     // 商品描述,可空  

  14.     String body = WIDbody;  

  15.   

  16.     // 把请求参数打包成数组  

  17.     Map sParaTemp = new HashMap();  

  18.     sParaTemp.put("service", AlipayConfig.service);  

  19.     sParaTemp.put("partner", AlipayConfig.partner);  

  20.     sParaTemp.put("seller_id", AlipayConfig.seller_id);  

  21.     sParaTemp.put("_input_charset", AlipayConfig.input_charset);  

  22.     sParaTemp.put("payment_type", AlipayConfig.payment_type);  

  23.     sParaTemp.put("notify_url", AlipayConfig.notify_url);  

  24.     sParaTemp.put("return_url", AlipayConfig.return_url);  

  25.     sParaTemp.put("anti_phishing_key", AlipayConfig.anti_phishing_key);  

  26.     sParaTemp.put("exter_invoke_ip", AlipayConfig.exter_invoke_ip);  

  27.     sParaTemp.put("out_trade_no", out_trade_no);  

  28.     sParaTemp.put("subject", subject);  

  29.     sParaTemp.put("total_fee", total_fee);  

  30.     sParaTemp.put("body", body);  

  31.     // 其他业务参数根据在线开发文档,添加参数.文档地址:https://doc.open.alipay.com/doc2/detail.htm?spm=a219a.7629140.0.0.O9yorI&treeId=62&articleId=103740&docType=1  

  32.     // 如sParaTemp.put("参数名","参数值");  

  33.   

  34.     // 建立请求  

  35.     String sHtmlText = AlipaySubmit.buildRequest(sParaTemp, "get""确认");  

  36.     model.addAttribute("sHtmlText", sHtmlText);  

  37.   

  38.     // 保存支付记录  

  39.     hysWebMeetingAliService.insertSelective(sParaTemp);  

  40.     return new ResponseEntity(model, HttpStatus.OK);  

  41. }  


4、回调:也是直接将DEMO中的notify_url.jsp中的java代码拿来稍微做了修改和加上业务代码(修改状态等);

[javascript] view plain copy


  1. @RequestMapping("notify")  

  2. @ResponseBody  

  3. public String notify(HttpServletRequest request){  

  4.     //获取支付宝POST过来反馈信息  

  5.     Map params = new HashMap();  

  6.     Map requestParams = request.getParameterMap();  

  7.     for (Iterator iter = requestParams.keySet().iterator(); iter.hasNext();) {  

  8.         String name = (String) iter.next();  

  9.         String[] values = (String[]) requestParams.get(name);  

  10.         String valueStr = "";  

  11.         for (int i = 0; i 

  12.             valueStr = (i == values.length - 1) ? valueStr + values[i]  

  13.                     : valueStr + values[i] + ",";  

  14.         }  

  15.         //乱码解决,这段代码在出现乱码时使用。如果mysign和sign不相等也可以使用这段代码转化  

  16.         //valueStr = new String(valueStr.getBytes("ISO-8859-1"), "gbk");  

  17.         params.put(name, valueStr);  

  18.     }  

  19.       

  20.     //获取支付宝的通知返回参数,可参考技术文档中页面跳转同步通知参数列表(以下仅供参考)//  

  21.     //商户订单号  

  22.   

  23.     String out_trade_no = request.getParameter("out_trade_no");  

  24.   

  25.     //支付宝交易号  

  26.   

  27.     String trade_no = request.getParameter("trade_no");  

  28.   

  29.     //交易状态  

  30.     String trade_status = request.getParameter("trade_status");  

  31.   

  32.     //获取支付宝的通知返回参数,可参考技术文档中页面跳转同步通知参数列表(以上仅供参考)//  

  33.   

  34.     if(AlipayNotify.verify(params)){//验证成功  

  35.         //////////////////////////////////////////////////////////////////////////////////////////  

  36.         //请在这里加上商户的业务逻辑程序代码  

  37.   

  38.         //——请根据您的业务逻辑来编写程序(以下代码仅作参考)——  

  39.         boolean flg = false;  

  40.         if(trade_status.equals("TRADE_FINISHED")){  

  41.             //判断该笔订单是否在商户网站中已经做过处理  

  42.                 //如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序  

  43.                 //请务必判断请求时的total_fee、seller_id与通知时获取的total_fee、seller_id为一致的  

  44.                 //如果有做过处理,不执行商户的业务程序  

  45.                   

  46.             //注意:  

  47.             //退款日期超过可退款期限后(如三个月可退款),支付宝系统发送该交易状态通知  

  48.         } else if (trade_status.equals("TRADE_SUCCESS")){  

  49.             //判断该笔订单是否在商户网站中已经做过处理  

  50.                 //如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序  

  51.                 //请务必判断请求时的total_fee、seller_id与通知时获取的total_fee、seller_id为一致的  

  52.                 //如果有做过处理,不执行商户的业务程序  

  53.                   

  54.             //注意:  

  55.             //付款完成后,支付宝系统发送该交易状态通知  

  56.               

  57.             //根据订单号将订单状态和支付宝记录表中状态都改为已支付  

  58.             flg = hysWebMeetingAliService.changeOrderAndAliStatusSuccess(out_trade_no);  

  59.               

  60.         }  

  61.   

  62.         //——请根据您的业务逻辑来编写程序(以上代码仅作参考)——  

  63.               

  64.         //out.print("success"); //请不要修改或删除  

  65.         if(flg){  

  66.             return "success";  

  67.         }else{  

  68.             return "fail";  

  69.         }  

  70.   

  71.         //////////////////////////////////////////////////////////////////////////////////////////  

  72.     }else{//验证失败  

  73.         //out.print("fail");  

  74.         return "fail";  

  75.     }  

  76. }  


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


  1.     @RequestMapping("returnUrl")  

  2.     public ModelAndView returnUrl(HttpServletRequest request){  

  3.         ModelAndView mv = new ModelAndView("redirect:/meeting/info");  

  4.           

  5.         //获取支付宝GET过来反馈信息  

  6.         Map params = new HashMap();  

  7.         Map requestParams = request.getParameterMap();  

  8.         for (Iterator iter = requestParams.keySet().iterator(); iter.hasNext();) {  

  9.             String name = (String) iter.next();  

  10.             String[] values = (String[]) requestParams.get(name);  

  11.             String valueStr = "";  

  12.             for (int i = 0; i 

  13.                 valueStr = (i == values.length - 1) ? valueStr + values[i]  

  14.                         : valueStr + values[i] + ",";  

  15.             }  

  16.             //乱码解决,这段代码在出现乱码时使用。如果mysign和sign不相等也可以使用这段代码转化  

  17.             //valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8");  

  18.             params.put(name, valueStr);  

  19.         }  

  20.           

  21.         //获取支付宝的通知返回参数,可参考技术文档中页面跳转同步通知参数列表(以下仅供参考)//  

  22.         //商户订单号  

  23.   

  24.         String out_trade_no = request.getParameter("out_trade_no");  

  25.   

  26.         //支付宝交易号  

  27.   

  28.         String trade_no = request.getParameter("trade_no");  

  29.   

  30.         //交易状态  

  31.         String trade_status = request.getParameter("trade_status");  

  32.           

  33.         "color:#ff0000;">String meetingId = request.getParameter("extra_common_param");  

  34.         mv.addObject("meetingId", meetingId);  

  35.   

  36.         //获取支付宝的通知返回参数,可参考技术文档中页面跳转同步通知参数列表(以上仅供参考)//  

  37.           

  38.         //计算得出通知验证结果  

  39.         boolean verify_result = AlipayNotify.verify(params);  

  40.           

  41.         if(verify_result){//验证成功  

  42.             //////////////////////////////////////////////////////////////////////////////////////////  

  43.             //请在这里加上商户的业务逻辑程序代码  

  44.   

  45.             //——请根据您的业务逻辑来编写程序(以下代码仅作参考)——  

  46.             if(trade_status.equals("TRADE_FINISHED") || trade_status.equals("TRADE_SUCCESS")){  

  47.                 //判断该笔订单是否在商户网站中已经做过处理  

  48.                     //如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序  

  49.                     //如果有做过处理,不执行商户的业务程序  

  50.             }  

  51.               

  52.             //该页面可做页面美工编辑  

  53. //          out.println("验证成功
    ");
      

  54.             //——请根据您的业务逻辑来编写程序(以上代码仅作参考)——  

  55.   

  56.             //////////////////////////////////////////////////////////////////////////////////////////  

  57.         }else{  

  58.             //该页面可做页面美工编辑  

  59. //          out.println("验证失败");  

  60.         }  

  61.           

  62.         return mv;  

  63.     }  

五、总结:

1、支付宝集成比较简答,稍微看下DEMO,跑一下了解了流程就比较容易了。

2、调试的时候,特别是回调,要把项目部署到能够外网访问的服务器上。

3、我没有遇到上面莫名其妙的问题,如果遇到了的话,可以联系我,或者看下Eclipse远程debug这篇文章,进行问题的跟踪。

4、做页面跳转同步通知页面路径时,需要传递参数怎么办,我一开始是自定义了一个参数,可是没有取到,然后我看到DEMO中有一句注释是这么写的:

[javascript] view plain copy


  1. // 其他业务参数根据在线开发文档,添加参数.文档地址: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


  1. 参数body(商品描述)、subject(商品名称)、extra_common_param(公用回传参数)不能包含特殊字符(如:#、%、&、+)、敏感词汇,也不能使用外国文字(旺旺不支持的外文,如:韩文、泰语、藏文、蒙古文、阿拉伯语);  

open方法中设值:

[javascript] view plain copy


  1. sParaTemp.put("extra_common_param", meetingId);  

returnUrl方法中取值,并作为重定向参数:

[javascript] view plain copy


  1. String meetingId = request.getParameter("extra_common_param");  

  2.         mv.addObject("meetingId", meetingId);  

相关推荐:

支付宝支付接口 单笔交易查询接口

支付宝手机网站支付接口 FOR ECShop

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
ajax教程
ajax教程

php中文网为大家带来ajax教程合集,Ajax是一种用于创建快速动态网页的技术。通过在后台与服务器进行少量数据交换,Ajax可以使网页实现异步更新。这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新。php中文网还为大家带来ajax的相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

166

2023.06.14

ajax中文乱码解决方法
ajax中文乱码解决方法

ajax中文乱码解决方法有设置请求头部的字符编码、在服务器端设置响应头部的字符编码和使用encodeURIComponent对中文进行编码。本专题为大家提供ajax中文乱码相关的文章、下载、课程内容,供大家免费下载体验。

170

2023.08.31

ajax传递中文乱码怎么办
ajax传递中文乱码怎么办

ajax传递中文乱码的解决办法:1、设置统一的编码方式;2、服务器端编码;3、客户端解码;4、设置HTTP响应头;5、使用JSON格式。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

124

2023.11.15

ajax网站有哪些
ajax网站有哪些

使用ajax的网站有谷歌、维基百科、脸书、纽约时报、亚马逊、stackoverflow、twitter、hacker news、shopify和basecamp等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

257

2024.09.24

eclipse教程
eclipse教程

php中文网为大家带来eclipse教程合集,eclipse是一个开放源代码的、基于Java的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。php中文网还为大家带来eclipse的相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

194

2023.06.14

eclipse怎么设置中文
eclipse怎么设置中文

eclipse设置中文的方法:除了设置界面为中文外,你还可以为Eclipse添加中文插件,以便更好地支持中文编程。例如,你可以安装EBNF插件来支持中文变量名,或安装Chinese Helper来提供中文帮助文档。本专题为大家提供eclipse设置中文相关的各种文章、以及下载和课程。

807

2023.07.24

c语言编程软件有哪些
c语言编程软件有哪些

c语言编程软件有GCC、Clang、Microsoft Visual Studio、Eclipse、NetBeans、Dev-C++、Code::Blocks、KDevelop、Sublime Text和Atom。更多关于c语言编程软件的问题详情请看本专题的文章。php中文网欢迎大家前来学习。

623

2023.11.02

Eclipse版本号有哪些区别
Eclipse版本号有哪些区别

区别:1、Eclipse 3.x系列:Eclipse的早期版本,包括3.0、3.1、3.2等;2、Eclipse 4.x系列:Eclipse的最新版本,包括4.0、4.1、4.2等;3、Eclipse IDE for Java Developers等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

180

2024.02.23

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

3

2026.03.11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 4.3万人学习

C# 教程
C# 教程

共94课时 | 11.2万人学习

Java 教程
Java 教程

共578课时 | 80.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号