支付宝支付-常用支付API详解(查询、退款、提现等)-转
所有的接口支持沙盒环境的测试
1、前言
前面几篇文件详细介绍了 支付宝提现、扫码支付、条码支付、Wap支付、App支付
支付宝支付-提现到个人支付宝
支付宝支付-扫码支付
支付宝支付-刷卡支付(条码支付)
支付宝Wap支付你了解多少?
Android版-支付宝APP支付
一张二维码集成微信、支付宝支付
其中也断断续续的提到了一些接口。本片文章主要是总结支付宝支付中常用的一些接口
2、常用的接口总结
这里使用表格的方式列出 官方接口列表以及详细的参数说明
API列表 | 类型 | 描述 | 使用场景 |
---|---|---|---|
alipay.trade.query | 免费 | 统一收单线下交易查询 | 提供所有支付宝支付订单的查询 |
alipay.trade.refund | 免费 | 统一收单交易退款接口 | 买家或者卖家的原因需要退款时 |
alipay.trade.fastpay.refund.query | 免费 | 统一收单交易退款查询 | 查看退款请求是否执行成功 |
alipay.trade.pay | 免费 | 统一收单交易支付接口 | 将二维码或条码信息/声波信息通过本接口上送至支付宝发起支付。 |
alipay.trade.precreate | 免费 | 统一收单线下交易预创建 | 二维码支付 |
alipay.trade.cancel | 免费 | 统一收单交易撤销接口 | 撤销交易 |
alipay.trade.create | 免费 | 统一收单交易创建接口 | 创建下单 |
alipay.trade.close | 免费 | 统一收单交易关闭接口 | 用于交易创建后,用户在一定时间内未进行支付时可以通过此接口关闭订单 |
alipay.trade.order.settle | 免费 | 统一收单交易结算接口 | 用于在线下场景交易支付后,进行结算 |
alipay.fund.trans.toaccount.transfer | 免费 | 单笔转账到支付宝账户接口 | 支付宝提现 |
alipay.fund.trans.order.query | 免费 | 查询转账订单接口 | 提现结果查询 |
alipay.data.dataservice.bill.downloadurl.query | 免费 | 查询对账单下载地址 | 为方便商户快速查账 |
3、使用服务端SDK封装接口
3.1 服务端SDK下载及其使用方法
参考 开放平台服务端SDK
Maven项目引用JAR包可以参考 支付宝Wap支付你了解多少? 里面有详细的介绍
重要说明
1、接口使用的编码格式为 UTF-8
2、接口数据交互使用的是 json
3、接口加密的模式使用官方推荐的 RSA2
4、本片文章主要是介绍Java的使用方法与封装
3.2 初始化SDK
在SDK调用前需要进行初始化
AlipayClient alipayClient = new DefaultAlipayClient(URL, APP_ID, APP_PRIVATE_KEY, FORMAT, CHARSET, ALIPAY_PUBLIC_KEY, SIGN_TYPE);
关键参数说明:
配置参数 | 示例值解释 | 获取方式/示例值 |
---|---|---|
URL | 支付网关(固定) | 正式环境:https://openapi.alipay.com/gateway.do 沙箱环境:https://openapi.alipaydev.com/gateway.do |
APP_ID | APPID即创建应用后生成 | 获取见上面创建应用并获取APPID |
APP_PRIVATE_KEY | 开发者应用私钥,由开发者自己生成 | 获取详见上面配置密钥 |
FORMAT | 参数返回格式,只支持json | json(固定) |
CHARSET | 请求和签名使用的字符编码格式,支持GBK和UTF-8 | 开发者根据实际工程编码配置 |
ALIPAY_PUBLIC_KEY | 支付宝公钥,由支付宝生成 | 获取详见上面配置密钥 |
SIGN_TYPE | 商户生成签名字符串所使用的签名算法类型,目前支持RSA2和RSA,推荐使用RSA2 | RSA2 |
3.3 API接口封装
3.3.1 alipay.trade.query接口封装
该接口提供所有支付宝支付订单的查询,商户可以通过该接口主动查询订单状态,完成下一步的业务逻辑。 需要调用查询接口的情况: 当商户后台、网络、服务器等出现异常,商户系统最终未接收到支付通知; 调用支付接口后,返回系统错误或未知交易状态情况; 调用alipay.trade.pay,返回INPROCESS的状态; 调用alipay.trade.cancel之前,需确认支付状态;
/*** 交易查询接口* https://doc.open.alipay.com/docs/api.htm?spm=a219a.7395905.0.0.8H2JzG&docType=4&apiId=757* @param bizContent* @return* @throws AlipayApiException*/public static boolean isTradeQuery(AlipayTradeQueryModel model) throws AlipayApiException{AlipayTradeQueryResponse response = tradeQuery(model);if(response.isSuccess()){return true;}return false;}public static AlipayTradeQueryResponse tradeQuery(AlipayTradeQueryModel model) throws AlipayApiException{AlipayTradeQueryRequest request = new AlipayTradeQueryRequest();request.setBizModel(model);return alipayClient.execute(request);}
3.3.2 alipay.trade.refund 接口封装
当交易发生之后一段时间内,由于买家或者卖家的原因需要退款时,卖家可以通过退款接口将支付款退还给买家,支付宝将在收到退款请求并且验证成功之后,按照退款规则将支付款按原路退到买家帐号上。 交易超过约定时间(签约时设置的可退款时间)的订单无法进行退款 支付宝退款支持单笔交易分多次退款,多次退款需要提交原支付订单的商户订单号和设置不同的退款单号。一笔退款失败后重新提交,要采用原来的退款单号。总退款金额不能超过用户实际支付金额
/*** 退款* https://doc.open.alipay.com/docs/api.htm?spm=a219a.7395905.0.0.SAyEeI&docType=4&apiId=759* @param content* @return* @throws AlipayApiException*/public static String tradeRefund(AlipayTradeRefundModel model) throws AlipayApiException{AlipayTradeRefundResponse response = tradeRefundToResponse(model);return response.getBody();}public static AlipayTradeRefundResponse tradeRefundToResponse(AlipayTradeRefundModel model) throws AlipayApiException{AlipayTradeRefundRequest request = new AlipayTradeRefundRequest();request.setBizModel(model);return alipayClient.execute(request);}
3.3.3 alipay.trade.fastpay.refund.query接口封装
商户可使用该接口查询自已通过alipay.trade.refund提交的退款请求是否执行成功。 该接口的返回码10000,仅代表本次查询操作成功,不代表退款成功。如果该接口返回了查询数据,则代表退款成功,如果没有查询到则代表未退款成功,可以调用退款接口进行重试。重试时请务必保证退款请求号一致。
/*** 退款查询* https://doc.open.alipay.com/docs/api.htm?spm=a219a.7629065.0.0.KQeTSa&apiId=1049&docType=4* @param model* @return* @throws AlipayApiException*/public static String tradeRefundQuery(AlipayTradeFastpayRefundQueryModel model) throws AlipayApiException{AlipayTradeFastpayRefundQueryResponse response = tradeRefundQueryToResponse(model);return response.getBody();}public static AlipayTradeFastpayRefundQueryResponse tradeRefundQueryToResponse(AlipayTradeFastpayRefundQueryModel model) throws AlipayApiException{AlipayTradeFastpayRefundQueryRequest request = new AlipayTradeFastpayRefundQueryRequest();request.setBizModel(model);return alipayClient.execute(request);}
3.3.4 alipay.trade.pay接口封装
收银员使用扫码设备读取用户手机支付宝“付款码”/声波获取设备(如麦克风)读取用户手机支付宝的声波信息后,将二维码或条码信息/声波信息通过本接口上送至支付宝发起支付。
/*** 条形码支付、声波支付* https://doc.open.alipay.com/docs/api.htm?spm=a219a.7629065.0.0.XVqALk&apiId=850&docType=4* @param notifyUrl * @throws AlipayApiException*/public static String tradePay(AlipayTradePayModel model, String notifyUrl) throws AlipayApiException {AlipayTradePayResponse response = tradePayToResponse(model,notifyUrl);return response.getBody();}public static AlipayTradePayResponse tradePayToResponse(AlipayTradePayModel model, String notifyUrl) throws AlipayApiException{AlipayTradePayRequest request = new AlipayTradePayRequest();request.setBizModel(model);// 填充业务参数request.setNotifyUrl(notifyUrl);return alipayClient.execute(request); // 通过alipayClient调用API,获得对应的response类}
3.3.5 alipay.trade.precreate 接口封装
收银员通过收银台或商户后台调用支付宝接口,生成二维码后,展示给用户,由用户扫描二维码完成订单支付。
/*** 扫码支付* https://doc.open.alipay.com/docs/doc.htm?spm=a219a.7629140.0.0.i0UVZn&treeId=193&articleId=105170&docType=1#s4* @param notifyUrl * @return* @throws AlipayApiException */public static String tradePrecreatePay(AlipayTradePrecreateModel model, String notifyUrl) throws AlipayApiException{AlipayTradePrecreateResponse response = tradePrecreatePayToResponse(model,notifyUrl);return response.getBody();}public static AlipayTradePrecreateResponse tradePrecreatePayToResponse(AlipayTradePrecreateModel model, String notifyUrl) throws AlipayApiException{AlipayTradePrecreateRequest request = new AlipayTradePrecreateRequest();request.setBizModel(model);request.setNotifyUrl(notifyUrl);return alipayClient.execute(request);}
3.3.6 alipay.trade.cancel 接口封装
支付交易返回失败或支付系统超时,调用该接口撤销交易。如果此订单用户支付失败,支付宝系统会将此订单关闭;如果用户支付成功,支付宝系统会将此订单资金退还给用户。 注意:只有发生支付系统超时或者支付结果未知时可调用撤销,其他正常支付的单如需实现相同功能请调用申请退款API。提交支付交易后调用【查询订单API】,没有明确的支付结果再调用【撤销订单API】。
/*** 交易撤销接口* https://doc.open.alipay.com/docs/api.htm?spm=a219a.7395905.0.0.XInh6e&docType=4&apiId=866* @param bizContent* @return* @throws AlipayApiException*/public static boolean isTradeCancel(AlipayTradeCancelModel model) throws AlipayApiException{AlipayTradeCancelResponse response = tradeCancel(model);if(response.isSuccess()){return true;}return false;}public static AlipayTradeCancelResponse tradeCancel(AlipayTradeCancelModel model) throws AlipayApiException{AlipayTradeCancelRequest request = new AlipayTradeCancelRequest();request.setBizModel(model);AlipayTradeCancelResponse response = alipayClient.execute(request);return response;}
3.3.7 alipay.trade.create 接口封装
商户通过该接口进行交易的创建下单
/*** 统一收单交易创建接口* https://doc.open.alipay.com/docs/api.htm?spm=a219a.7629065.0.0.21yRUe&apiId=1046&docType=4* @param model* @param notifyUrl * @return* @throws AlipayApiException*/public static AlipayTradeCreateResponse tradeCreate(AlipayTradeCreateModel model, String notifyUrl) throws AlipayApiException{AlipayTradeCreateRequest request = new AlipayTradeCreateRequest();request.setBizModel(model);request.setNotifyUrl(notifyUrl);return alipayClient.execute(request);}
3.3.8 alipay.trade.close 接口封装
用于交易创建后,用户在一定时间内未进行支付,可调用该接口直接将未付款的交易进行关闭。
/*** 关闭订单* https://doc.open.alipay.com/docs/api.htm?spm=a219a.7629065.0.0.21yRUe&apiId=1058&docType=4* @param model* @return* @throws AlipayApiException*/public static boolean isTradeClose(AlipayTradeCloseModel model) throws AlipayApiException{AlipayTradeCloseResponse response = tradeClose(model);if(response.isSuccess()){return true;}return false;}public static AlipayTradeCloseResponse tradeClose(AlipayTradeCloseModel model) throws AlipayApiException{AlipayTradeCloseRequest request = new AlipayTradeCloseRequest();request.setBizModel(model);return alipayClient.execute(request);}
3.3.9 alipay.trade.order.settle接口封装
用于在线下场景交易支付后,进行结算
/*** 交易结算接口* https://doc.open.alipay.com/docs/api.htm?spm=a219a.7395905.0.0.nl0RS3&docType=4&apiId=1147* @param bizContent* @return* @throws AlipayApiException*/public static boolean isTradeOrderSettle(AlipayTradeOrderSettleModel model) throws AlipayApiException{AlipayTradeOrderSettleResponse response = tradeOrderSettle(model);if(response.isSuccess()){return true;}return false;}public static AlipayTradeOrderSettleResponse tradeOrderSettle(AlipayTradeOrderSettleModel model) throws AlipayApiException{AlipayTradeOrderSettleRequest request = new AlipayTradeOrderSettleRequest();request.setBizModel(model);return alipayClient.execute(request);}
3.3.10 alipay.fund.trans.toaccount.transfer接口封装
可以参考 支付宝支付-提现到个人支付宝
3.3.11 alipay.fund.trans.order.query接口封装
可以参考 支付宝支付-提现到个人支付宝
3.3.12 alipay.data.dataservice.bill.downloadurl.query 接口封装
为方便商户快速查账,支持商户通过本接口获取商户离线账单下载地址
/*** 查询对账单下载地址* @param bizContent* @return* @throws AlipayApiException*/public static String billDownloadurlQuery(AlipayDataDataserviceBillDownloadurlQueryModel model) throws AlipayApiException{AlipayDataDataserviceBillDownloadurlQueryResponse response = billDownloadurlQueryToResponse(model);return response.getBillDownloadUrl();}public static AlipayDataDataserviceBillDownloadurlQueryResponse billDownloadurlQueryToResponse (AlipayDataDataserviceBillDownloadurlQueryModel model) throws AlipayApiException{AlipayDataDataserviceBillDownloadurlQueryRequest request = new AlipayDataDataserviceBillDownloadurlQueryRequest();request.setBizModel(model);return alipayClient.execute(request);}
4、异步通知封装
将异步通知的参数转化为Map为验签做准备
/*** 将异步通知的参数转化为Map* @param request* @return*/public static Map<String, String> toMap(HttpServletRequest request) {System.out.println(">>>>" + request.getQueryString());Map<String, String> params = new HashMap<String, String>();Map<String, String[]> requestParams = request.getParameterMap();for (Iterator<String> 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] + ",";}// 乱码解决,这段代码在出现乱码时使用。// valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8");params.put(name, valueStr);}return params;}
使用
AlipaySignature.rsaCheckV1(....)
接口进行验证签名
public void notify_url() {try {// 获取支付宝POST过来反馈信息Map<String, String> params = AliPayApi.toMap(getRequest());for (Map.Entry<String, String> entry : params.entrySet()) {System.out.println(entry.getKey() + " = " + entry.getValue());}boolean verify_result = AlipaySignature.rsaCheckV1(params, AliPayApi.ALIPAY_PUBLIC_KEY, AliPayApi.CHARSET,AliPayApi.SIGN_TYPE);if (verify_result) {// 验证成功// TODO 请在这里加上商户的业务逻辑程序代码 异步通知可能出现订单重复通知 需要做去重处理System.out.println("notify_url 验证成功succcess");renderText("success");return;} else {System.out.println("notify_url 验证失败");// TODOrenderText("failure");return;}} catch (AlipayApiException e) {e.printStackTrace();renderText("failure");}}
此项目已开源欢迎Start、PR、发起Issues一起讨论交流共同进步
https://github.com/Javen205/IJPayhttp://git.oschina.net/javen205/IJPay
http://www.cnblogs.com/zyw-205520/p/6920568.html
支付宝支付-常用支付API详解(查询、退款、提现等)-转相关推荐
- 支付宝支付-常用支付API详解(查询、退款、提现等)(转)
所有的接口支持沙盒环境的测试 1.前言前面几篇文件详细介绍了 支付宝提现.扫码支付.条码支付.Wap支付.App支付支付宝支付-提现到个人支付宝支付宝支付-扫码支付支付宝支付-刷卡支付(条码支付)支付 ...
- 支付接口教程,详解支付宝接口(二)
支付宝的接口向来集成过程都让人觉得比较舒服,只有APP支付相对复杂,但也只是配置上复杂一些,只要清楚原理相信也不是什么难事.下面是以前介绍双钥加密原理的传送门: 支付接口教程特别篇,公钥与私钥,双钥加 ...
- Spring MVC+Spring+Mybatis实现支付宝支付功能(图文详解)(转载)
Spring MVC+Spring+Mybatis实现支付宝支付功能(图文详解) 前言 本教程详细介绍了如何使用ssm框架实现支付宝支付功能.本文章分为两大部分,分别是「支付宝测试环境代码测试」和「将 ...
- PHP支付接口教程,详解微信支付(二)
PC扫码支付 扫码支付首先是要分清楚两种模式: [模式一]:商户后台系统根据微信支付规则链接生成二维码,链接中带固定参数productid(可定义为产品标识或订单号).[模式二]:商户后台系统调用微信 ...
- 支付系统整体架构详解
2019独角兽企业重金招聘Python工程师标准>>> 支付系统整体架构详解 http://www.dataguru.cn/article-11263-1.html http://w ...
- 农行网上在线支付平台接口安装详解
农行网上在线支付平台接口安装详解 2017年05月07日 16:02:53 白云下载站 阅读数:3426 中国农业银行的网上支付平台接口的安装还是有点复杂的,摸索了很久才搞定,总结了一下与大家共享. ...
- android常用api大全,Android API详解大全.pdf
Android API详解大全 Android -- TextView 一.TextView的API 1.1 结构 java.lang.Object ↳ android.view.View ↳ and ...
- Javascript常用的设计模式详解
Javascript常用的设计模式详解 阅读目录 一:理解工厂模式 二:理解单体模式 三:理解模块模式 四:理解代理模式 五:理解职责链模式 六:命令模式的理解: 七:模板方法模式 八:理解javas ...
- ext核心API详解
http://hi.baidu.com/j2me/profile 1 EXT核心API详解(一)-Ext 1 EXT核心API详解(二)-Array/Date/Function/Number/Stri ...
最新文章
- java倒计时自动关闭弹窗,打开页面弹出窗口子窗口定时自动关闭
- java基础知识之初识java
- 面向云原生的混沌工程工具-ChaosBlade
- android插件框架机制的选择,Android插件开发初探——基础篇
- git checkout 命令详解
- ajax跨域问题(php)
- C++类指针类型的成员变量的浅复制与深复制
- 玩转git-flow工作流-分支解析
- 梁迪:源于热爱乐于分享,MVP代表圆桌会议
- (转)SQL Server:在 SQL Server 2005 中配置数据库邮件,发送邮件
- [1.1]用WebService返回歌曲的曲目信息.借鉴[星集工作室 张麟 Dephi版]
- 拓扑排序 java_[Java]聊聊拓扑排序算法
- 小卡机器人积木教程_这个会动的智能积木机器人分分钟让孩子爱不释手!秒杀家中99%的益智玩具!| 团...
- 手机怎么解除root权限?华为手机root教程
- 微信小程序官方bug
- docker下运行分布式代码报nccl错误:connect returned Connection timed out,成功解决
- 企业要如何快速进入直播带货赛道呢?
- 为什么祖传代码被称为“屎山”?
- 收发一体超声波测距离传感器模块_西门子7ML超声波液位计常见问题总结如下(珍藏版)...
- 计算机专业讲座题目有哪些,计算机知识讲座策划书
热门文章
- C语言实现基数排序Radix sort算法之一(附完整源码)
- C语言快速排序 quick sort 算法(附完整源码)
- QT的QCategoryAxis类的使用
- Elasticsearch概述、ES概念、什么是搜索、全文检索、Elasticsearch功能,什么是distributed document store(来自网络+学习资料)
- JS正则表达式验证数字非常全
- 1.cocos2dx内存管理和CCArray,CCMenuItem
- WebService入门篇
- Hbase复制(Replication )
- lisp 批量文字求差值_Python 超简单 提取音乐高潮(附批量提取)
- 基于深度学习的目标检测算法综述(一)