应用场景:

商户出售商品,用户购买支付,商户接入第三方支付平台支付宝

对接要求:

1、先创建网页&移动应用点击打开链接,提交并且通过审核后才能进行对接

2、开发者调用接口前需要先生成RSA2密钥,RSA密钥包含应用私钥(APP_PRIVATE_KEY)、应用公钥(APP_PUBLIC_KEY)。生成密钥后在开放平台管理中心进行密钥配置,配置完成后可以获取支付宝公钥(ALIPAY_PUBLIC_KEY)

3、搭建和配置开发环境

下载服务端SDK:

<!-- https://mvnrepository.com/artifact/com.alipay.sdk/alipay-sdk-java -->
<dependency><groupId>com.alipay.sdk</groupId><artifactId>alipay-sdk-java</artifactId><version>3.0.0</version>
</dependency>

对接流程:

1、封装参数,申请接入支付宝支付,会有APPID,公钥私钥等参数。

2、支付流程

  1. 发起一个支付请求(携带订单号,价格等参数)到支付宝统一下单接口,生成预支付路径,响应给客户端浏览器。
  2. 用户进行扫码或者在页面登录支付宝支付。
  3. 服务端异步接收支付结果。

①:发起支付请求

@RequestMapping("gotoPay")
public void gotoPay(HttpServletRequest httpRequest,HttpServletResponse httpResponse) throws ServletException, IOException {AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipay.com/gateway.do", APP_ID, APP_PRIVATE_KEY, FORMAT, CHARSET, ALIPAY_PUBLIC_KEY, SIGN_TYPE); //获得初始化的AlipayClientAlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest();//创建API对应的requestalipayRequest.setReturnUrl("http://domain.com/CallBack/returnURL.html");//回跳地址alipayRequest.setNotifyUrl("http://domain.com/CallBack/notifyURL.html");//通知地址alipayRequest.setBizContent("{" +" \"out_trade_no\":\"20150320010101001\"," +                                        //订单号(支付宝要求商户订单号必须唯一)" \"product_code\":\"FAST_INSTANT_TRADE_PAY\"," +                                   //销售产品码,与支付宝签约的产品码名称,目前仅支持FAST_INSTANT_TRADE_PAY。" \"total_amount\":88.88," +                                                        //价格" \"subject\":\"Iphone6 16G\"," +                                                   //订单标题" \"body\":\"Iphone6 16G\"," +                                                      //订单描述" \"passback_params\":\"merchantBizType%3d3C%26merchantBizNo%3d2016010101111\"," +  //公用回传参数,如果请求时传递了该参数,则返回给商户时会回传该参数。支付宝只会在异步通知时将该参数原样返回。本参数必须进行UrlEncode之后才可以发送给支付宝" \"extend_params\":{" +                                                            //业务扩展参数" \"sys_service_provider_id\":\"2088511833207846\"" +                                //系统商编号,该参数作为系统商返佣数据提取的依据,请填写系统商签约协议的PID" }"+" }");//填充业务参数String form="";try {form = alipayClient.pageExecute(alipayRequest).getBody(); //调用SDK生成表单} catch (AlipayApiException e) {e.printStackTrace();}httpResponse.setContentType("text/html;charset=" + CHARSET);httpResponse.getWriter().write(form);//直接将完整的表单html输出到页面httpResponse.getWriter().flush();httpResponse.getWriter().close();
}

②、用户确认支付后,支付宝get请求returnUrl(将网页重定向到何处)

@RequestMapping(value = "returnURL", method = RequestMethod.GET)
public String returnURL(Device device) {System.out.println("支付宝处理完毕后返回商户网站");if (device.isNormal()) {return "shop/alipay/payResult";} else {return "mobile/alipay/payResult";}
}

③、交易成功后,支付宝post请求notifyUrl

@RequestMapping(value = "notifyURL", method = RequestMethod.POST)
public void notifyURL(HttpServletRequest httpRequest){//将异步通知中收到的所有参数都存放到map中 ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓Map<String, String> paramsMap = MapUtil.map();Map<String, String[]> requestParams = request.getParameterMap();for (Object element : requestParams.keySet()) {String name = (String) element;String[] values = requestParams.get(name);StringBuilder valueStr = new StringBuilder();for (int i = 0; i < values.length; i++) {valueStr.append((i == values.length - 1) ? values[i] : values[i] + ",");}params.put(name, valueStr.toString());}//将异步通知中收到的所有参数都存放到map中 ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑boolean signVerified = AlipaySignature.rsaCheckV1(paramsMap, ALIPAY_PUBLIC_KEY, CHARSET, SIGN_TYPE) //调用SDK验证签名if(signVerfied){// TODO 验签成功后,按照支付结果异步通知中的描述,对支付结果中的业务内容进行二次校验,校验成功后在response中返回success并继续商户自身业务处理,校验失败返回failure}else{// TODO 验签失败则记录异常日志,并在response中返回failure.}
}

④、若由于网络等问题异步通知没有到达,商户可自行调用alipay.trade.query接口进行查询,根据查询接口获取交易以及支付信息(商户也可以直接调用查询接口,不需要依赖异步通知)。

public void query(){AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipay.com/gateway.do","app_id","your private_key","json","GBK","alipay_public_key","RSA2");AlipayTradeQueryRequest request = new AlipayTradeQueryRequest();request.setBizContent("{" +"\"out_trade_no\":\"20150320010101001\"," +                        //订单支付时传入的商户订单号,和支付宝交易号不能同时为空。 "\"trade_no\":\"2014112611001004680 073956707\"" +                 //支付宝交易号,和商户订单号不能同时为空"  }");AlipayTradeQueryResponse response = alipayClient.execute(request);if(response.isSuccess()){//获取支付信息System.out.println("调用成功");} else {System.out.println("调用失败");}
}

⑤、交易发生后一段时间内,如果用户想退款,买家可以通过退款接口将支付款退给买家。

public void refund() throws AlipayApiException {AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipay.com/gateway.do","app_id","your private_key","json","GBK","alipay_public_key","RSA2");AlipayTradeRefundRequest request = new AlipayTradeRefundRequest();request.setBizContent("{" +"\"out_trade_no\":\"20150320010101001\"," + "\"trade_no\":\"2014112611001004680073956707\"," +"\"refund_amount\":200.12," +"\"refund_currency\":\"USD\"," +"\"refund_reason\":\"正常退款\"," +"\"out_request_no\":\"HZ01RF001\"," +"\"operator_id\":\"OP001\"," +"\"store_id\":\"NJ_S_001\"," +"\"terminal_id\":\"NJ_T_001\"," +"      \"goods_detail\":[{" +"        \"goods_id\":\"apple-01\"," +"\"alipay_goods_id\":\"20010001\"," +"\"goods_name\":\"ipad\"," +"\"quantity\":1," +"\"price\":2000," +"\"goods_category\":\"34543238\"," +"\"body\":\"特价手机\"," +"\"show_url\":\"http://www.alipay.com/xxx.jpg\"" +"        }]" +"  }");AlipayTradeRefundResponse response = alipayClient.execute(request);if(response.isSuccess()){System.out.println("调用成功");} else {System.out.println("调用失败");}
}

⑥、统一收单交易退款查询

public void queryRefund(){AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipay.com/gateway.do","app_id","your private_key","json","GBK","alipay_public_key","RSA2");AlipayTradeFastpayRefundQueryRequest request = new AlipayTradeFastpayRefundQueryRequest();request.setBizContent("{" +"\"trade_no\":\"20150320010101001\"," +"\"out_trade_no\":\"2014112611001004680073956707\"," +"\"out_request_no\":\"2014112611001004680073956707\"" +"  }");AlipayTradeFastpayRefundQueryResponse response = alipayClient.execute(request);if(response.isSuccess()){System.out.println("调用成功");} else {System.out.println("调用失败");}
}

⑦、统一收单交易关闭接口(用于交易创建后,用户在一定时间内未进行支付,可调用该接口直接将未付款的交易进行关闭。)

public void tradeClose(){AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipay.com/gateway.do","app_id","your private_key","json","GBK","alipay_public_key","RSA2");AlipayTradeRefundRequest request = new AlipayTradeRefundRequest();request.setBizContent("{" +"\"out_trade_no\":\"20150320010101001\"," +"\"trade_no\":\"2014112611001004680073956707\"," +"\"refund_amount\":200.12," +"\"refund_currency\":\"USD\"," +"\"refund_reason\":\"正常退款\"," +"\"out_request_no\":\"HZ01RF001\"," +"\"operator_id\":\"OP001\"," +"\"store_id\":\"NJ_S_001\"," +"\"terminal_id\":\"NJ_T_001\"," +"      \"goods_detail\":[{" +"        \"goods_id\":\"apple-01\"," +"\"alipay_goods_id\":\"20010001\"," +"\"goods_name\":\"ipad\"," +"\"quantity\":1," +"\"price\":2000," +"\"goods_category\":\"34543238\"," +"\"body\":\"特价手机\"," +"\"show_url\":\"http://www.alipay.com/xxx.jpg\"" +"        }]" +"  }");AlipayTradeRefundResponse response = alipayClient.execute(request);if(response.isSuccess()){System.out.println("调用成功");} else {System.out.println("调用失败");}
}

真心话,支付宝对接的API比微信写的强太多了 支付宝官方API

第三方对接-支付宝支付相关推荐

  1. java 对接支付宝支付

    2019独角兽企业重金招聘Python工程师标准>>> 对接支付宝支付的前提: 1,商户开通支付能力 登录蚂蚁金服 开放平台:https://open.alipay.com/plat ...

  2. JAVA对接支付宝支付(超详细,一看就懂)

    Java对接支付宝支付 更多内容 冷文博客: 传送门 引入 为什么要发这篇帖子呢?原因很简单,就是因为在一个稍稍正规一点的应用上都会有支付这个环节,我们日常的在线支付如今包括支付宝,微信钱包,QQ钱包 ...

  3. java对接支付宝支付

    java对接支付宝支付演示 现在有不少的项目都需要对接支付,这里主要是进行讲解对接支付宝H5支付 废话不多说 上代码 引入支付宝官方的sdk <!-- https://mvnrepository ...

  4. java对接支付宝支付(手机网站支付)

    记录一下对接支付宝支付的过程,既是对这段时间工作的总结,也希望能对之后需要对接支付宝手机网站支付的小伙伴一点帮助. 1.查看官方文档,具体对接流程(https://docs.open.alipay.c ...

  5. SpringBoot+vue3对接支付宝支付详细教程

    SpringBoot+vue3对接支付宝支付详细教程 本人也是第一次做这个,是一个刚刚学习自学支付的萌新,目的是在于学习,只是为了记录自己的学习过程,怕以后会忘记,因为我没有企业账号,所以用的是自己的 ...

  6. 项目场景:对接支付宝支付,沙箱环境提示:支付存在钓鱼风险!防钓鱼网站的方法

    项目场景:对接支付宝支付,沙箱环境提示:支付存在钓鱼风险!防钓鱼网站的方法 问题描述: 对接中遇到的问题: 原因分析: 提示:浏览器的锅 解决方案: 关闭所有窗口,只打开那个支付页面窗口就可以 转载h ...

  7. 对接支付宝支付,沙箱环境提示:支付存在钓鱼风险!防钓鱼网站的方法

    项目场景:对接支付宝支付,沙箱环境提示:支付存在钓鱼风险!防钓鱼网站的方法 问题描述: 对接中遇到的问题: 原因分析: 提示:浏览器的锅 解决方案:   关闭所有窗口,只打开那个支付页面窗口就可以

  8. PHP版本对接支付宝支付接口 电脑网站 详细介绍 沙箱环境 超简单易懂

    PHP版本对接支付宝支付接口 其实理顺了思路后,按照我接下来的步骤来,真的超级简单啊,为啥有那么多的朋友们折腾了那么久呢,嘿嘿,接下来跟我走吧~ 我是昨天晚上洗完澡之后,大概八九点,才开始正式开工尝试 ...

  9. android支付功能开发,对接支付宝支付接口开发详细步骤

    对接支付宝支付接口,官方文档已经写的很清楚了,但是也有很多像我一样的小白,第一次对接支付宝支付接口,会有些迷茫,所以我在此写下这篇文章,给我和我一样的同学,一点思路吧. 第一步:(先要在支付宝进行操做 ...

最新文章

  1. LeetCode 1024. 视频拼接
  2. 路径规划Github库推荐
  3. golang操作mysql用例
  4. C#获取数据库表信息,列信息
  5. 漫步线性代数二十三——行列式公式
  6. 安卓发布应用、更新的细节
  7. 数据库lib7第2, 3题(创建索引和触发器)
  8. 关于安装 rst2pdf 时遇到的 setuptools过老的问题
  9. 线性代数笔记 -- A = LU的应用
  10. hdfs java操作_hdfs java操作
  11. adb如何使用javac编译java程序并且运行
  12. Figma插件开发-生成Gif
  13. 2022大众点评商家数据
  14. Java项目:SSM高校教职工差旅报销管理系统
  15. python opencv批量修改图片分辨率
  16. html图片格式有什么,jpeg是一种什么格式?
  17. 微信公众号菜单外链怎么做
  18. 手机html input打开数字,html5 input的type属性启动数字输入法
  19. python名片管理系统的总结_名片管理系统(Python)
  20. 英语软件那些好玩的功能你知道吗

热门文章

  1. 夜读 | 比管理时间更重要的,是管理精力
  2. 软件测试————第二章
  3. kettle使用 - 开启Carte服务
  4. SIM7600CE-CNSE 4G模块 树莓派/Windows连网指南
  5. (转)A SQL query walks into a bar and sees two tables. He walks up to them and says 'Can I join you?'
  6. 探究正雅S8-SGTB与S8-SGHB
  7. Endnote Reference styles参考文献引用模版制作——附毕设大论文引用模版
  8. ERR invalid expire time in setex
  9. 简单版捕鱼达人的制做
  10. 16个优秀网站设计网站