0

0

Java如何调用支付宝支付接口?调用支付宝支付接口的方法

青灯夜游

青灯夜游

发布时间:2018-10-22 16:50:36

|

3786人浏览过

|

来源于CSDN

转载

本篇文章给大家带来的内容是介绍Java如何调用支付宝支付接口?调用支付宝支付接口的方法。有一定的参考价值,有需要的朋友可以参考一下,希望对你们有所帮助。

一、场景:公司需要在网站上进行支付宝支付。

二、API:使用支付宝开放平台的支付能力-即时到账接口。支付宝开放平台链接

三、分析:

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

1.png

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

2.png

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

四、实现:

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

  
    
@@##@@
@@##@@
请扫码关注
接收重要信息
支付宝即时到账(create_direct_pay_by_user)
<%--
--%>
支付宝即时到账交易接口快速通道
商户订单号:

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

注意:产品名称(subject),必填(建议中文,英文,数字,不能含有特殊字符)
付款金额:

注意:付款金额(total_fee),必填(格式如:1.00,请精确到分)
商品描述:

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

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

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

$(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要求,并且根据业务需求保存了状态为未支付的订单信息。

@RequestMapping("open")  
public ResponseEntity 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 sParaTemp = new HashMap();  
    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代码拿来稍微做了修改和加上业务代码(修改状态等);

@RequestMapping("notify")  
@ResponseBody  
public String notify(HttpServletRequest request){  
    //获取支付宝POST过来反馈信息  
    Map params = new HashMap();  
    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点吧)。

@RequestMapping("returnUrl")  
    public ModelAndView returnUrl(HttpServletRequest request){  
        ModelAndView mv = new ModelAndView("redirect:/meeting/info");  
          
        //获取支付宝GET过来反馈信息  
        Map params = new HashMap();  
        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");  
          
        String meetingId = request.getParameter("extra_common_param");  
        mv.addObject("meetingId", meetingId);  
  
        //获取支付宝的通知返回参数,可参考技术文档中页面跳转同步通知参数列表(以上仅供参考)//  
          
        //计算得出通知验证结果  
        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("验证成功
"); //——请根据您的业务逻辑来编写程序(以上代码仅作参考)—— ////////////////////////////////////////////////////////////////////////////////////////// }else{ //该页面可做页面美工编辑 // out.println("验证失败"); } return mv; }

五、总结:

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

网趣购物系统加强升级版
网趣购物系统加强升级版

新版本程序更新主要体现在:完美整合BBS论坛程序,用户只须注册一个帐号,即可全站通用!采用目前流行的Flash滚动切换广告 变换形式多样,受人喜爱!在原有提供的5种在线支付基础上增加北京云网支付!对留言本重新进行编排,加入留言验证码,后台有留言审核开关对购物系统的前台进行了一处安全更新。在原有文字友情链接基础上,增加LOGO友情链接功能强大的6种在线支付方式可选,自由切换。对新闻列表进行了调整,

下载

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

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

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

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

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

所以我打开看了之后,选择了公用回传参数extra_common_param,我自己知道这个字段对于我来说是什么含义。不过也要注意,人家说明了:

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

open方法中设值:

sParaTemp.put("extra_common_param", meetingId);

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

String meetingId = request.getParameter("extra_common_param");  
mv.addObject("meetingId", meetingId);

总结:以上就是本篇文的全部内容,希望能对大家的学习有所帮助。更多相关教程请访问Java视频教程java开发图文教程bootstrap视频教程

Java如何调用支付宝支付接口?调用支付宝支付接口的方法Java如何调用支付宝支付接口?调用支付宝支付接口的方法Java如何调用支付宝支付接口?调用支付宝支付接口的方法

相关文章

支付宝
支付宝

支付宝,全球领先的独立第三方支付平台,致力于为广大用户提供安全快速的电子支付/网上支付服务,有需要的小伙伴快来保存下载体验吧!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
Java 桌面应用开发(JavaFX 实战)
Java 桌面应用开发(JavaFX 实战)

本专题系统讲解 Java 在桌面应用开发领域的实战应用,重点围绕 JavaFX 框架,涵盖界面布局、控件使用、事件处理、FXML、样式美化(CSS)、多线程与UI响应优化,以及桌面应用的打包与发布。通过完整示例项目,帮助学习者掌握 使用 Java 构建现代化、跨平台桌面应用程序的核心能力。

37

2026.01.14

php与html混编教程大全
php与html混编教程大全

本专题整合了php和html混编相关教程,阅读专题下面的文章了解更多详细内容。

19

2026.01.13

PHP 高性能
PHP 高性能

本专题整合了PHP高性能相关教程大全,阅读专题下面的文章了解更多详细内容。

37

2026.01.13

MySQL数据库报错常见问题及解决方法大全
MySQL数据库报错常见问题及解决方法大全

本专题整合了MySQL数据库报错常见问题及解决方法,阅读专题下面的文章了解更多详细内容。

19

2026.01.13

PHP 文件上传
PHP 文件上传

本专题整合了PHP实现文件上传相关教程,阅读专题下面的文章了解更多详细内容。

16

2026.01.13

PHP缓存策略教程大全
PHP缓存策略教程大全

本专题整合了PHP缓存相关教程,阅读专题下面的文章了解更多详细内容。

6

2026.01.13

jQuery 正则表达式相关教程
jQuery 正则表达式相关教程

本专题整合了jQuery正则表达式相关教程大全,阅读专题下面的文章了解更多详细内容。

3

2026.01.13

交互式图表和动态图表教程汇总
交互式图表和动态图表教程汇总

本专题整合了交互式图表和动态图表的相关内容,阅读专题下面的文章了解更多详细内容。

45

2026.01.13

nginx配置文件详细教程
nginx配置文件详细教程

本专题整合了nginx配置文件相关教程详细汇总,阅读专题下面的文章了解更多详细内容。

9

2026.01.13

热门下载

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

精品课程

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

共23课时 | 2.5万人学习

C# 教程
C# 教程

共94课时 | 6.7万人学习

Java 教程
Java 教程

共578课时 | 46.1万人学习

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

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