支付宝支付-常用支付API详解(查询、退款、提现等)

简介: 本文章已同步发布到简书 http://www.jianshu.com/p/b6e6291709c71、前言此项目已开源欢迎Start、PR、发起Issues一起讨论交流共同进步https://github.

本文章已同步发布到简书 http://www.jianshu.com/p/b6e6291709c7

1、前言

此项目已开源欢迎Start、PR、发起Issues一起讨论交流共同进步

https://github.com/Javen205/IJPay
http://git.oschina.net/javen205/IJPay

前面几篇文件详细介绍了 支付宝提现扫码支付条码支付Wap支付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 验证失败");
                // TODO
                renderText("failure");
                return;
            }
        } catch (AlipayApiException e) {
            e.printStackTrace();
            renderText("failure");
        }
    }

此项目已开源欢迎Start、PR、发起Issues一起讨论交流共同进步

https://github.com/Javen205/IJPay
http://git.oschina.net/javen205/IJPay

目录
相关文章
|
3月前
|
Java API Spring
打造未来电商新引擎:揭秘Java可扩展API设计,让支付与物流灵活如丝,引领电商时代潮流!
【8月更文挑战第30天】本文通过电商平台案例,探讨了如何设计可扩展的Java API。首先定义支付和物流服务的接口与抽象类,然后实现具体服务,接着引入工厂模式或依赖注入管理服务实例,最后通过配置实现灵活扩展。这种设计确保了应用架构的灵活性和长期稳定性。
52 3
|
9天前
|
API
淘宝API接口( item_detail - 淘宝商品详情查询)
淘宝商品详情查询 API(item_detail)用于获取淘宝商品的详细信息。请求参数包括商品唯一 ID(num_iid)和是否获取促销价(is_promotion)。响应参数包含商品标题、价格、库存、图片链接、品牌等详细信息。
|
5月前
|
SQL Java API
Java一分钟之-JPA查询:JPQL与Criteria API
【6月更文挑战第14天】本文探讨了Java Persistence API (JPA)中的两种查询方式:JPQL和Criteria API。JPQL是面向对象的SQL,适用于简单查询,而Criteria API则提供类型安全的动态查询构造。文章指出了每种方法的常见问题和避免策略,如混淆实体属性与数据库字段、参数绑定错误、过度复杂化和性能问题。建议开发者根据需求选择适当的方法,并关注查询的可读性、可维护性和性能优化。
61 2
|
25天前
|
数据采集 人工智能 自然语言处理
Python实时查询股票API的FinanceAgent框架构建股票(美股/A股/港股)AI Agent
金融领域Finance AI Agents方面的工作,发现很多行业需求和用户输入的 query都是和查询股价/行情/指数/财报汇总/金融理财建议相关。如果需要准确的 金融实时数据就不能只依赖LLM 来生成了。常规的方案包括 RAG (包括调用API )再把对应数据和prompt 一起拼接送给大模型来做文本生成。稳定的一些商业机构的金融数据API基本都是收费的,如果是以科研和demo性质有一些开放爬虫API可以使用。这里主要介绍一下 FinanceAgent,github地址 https://github.com/AI-Hub-Admin/FinanceAgent
|
5月前
|
敏捷开发 测试技术 API
阿里云云效产品使用问题之如何通过API查询指定人在指定时间内提交了多少行代码
云效作为一款全面覆盖研发全生命周期管理的云端效能平台,致力于帮助企业实现高效协同、敏捷研发和持续交付。本合集收集整理了用户在使用云效过程中遇到的常见问题,问题涉及项目创建与管理、需求规划与迭代、代码托管与版本控制、自动化测试、持续集成与发布等方面。
|
2月前
|
API 搜索推荐
|
2月前
|
SQL 分布式计算 BI
Dataphin中集成SelectDB以支持报表分析和API查询
本文介绍了一家零售企业如何利用SelectDB进行BI分析及数据服务API的查询。通过Dataphin的数据集成、SQL研发等功能,将CRM、ERP等系统数据汇聚加工,并推送至SelectDB构建销售数据集市层,以支持报表分析及API查询。SelectDB具备实时、统一、弹性及开放特性,适用于多种实时分析场景。文章详细描述了在Dataphin中集成SelectDB的整体方案、数据源配置、数据集成、数据开发及数据服务流程。
|
3月前
|
Java 数据库连接 缓存
Hibernate性能调优:五大秘籍,让应用效能飙升,告别慢如蜗牛的加载,体验丝滑般流畅!
【8月更文挑战第31天】本文深入探讨了提升Hibernate应用性能的五大技巧,包括选择合适的缓存策略、优化查询语句、合理使用Eager与Lazy加载、批量操作与事务管理以及利用索引和数据库优化。通过正确配置多级缓存、分页查询、延迟加载、批量处理及合理创建索引,能够显著提高应用响应速度与吞吐量,改善用户体验。这些技巧需根据具体应用场景灵活调整,以实现最佳性能优化效果。
134 0
|
3月前
|
API Java 数据库连接
从平凡到卓越:Hibernate Criteria API 让你的数据库查询瞬间高大上,彻底告别复杂SQL!
【8月更文挑战第31天】构建复杂查询是数据库应用开发中的常见需求。Hibernate 的 Criteria API 以其强大和灵活的特点,允许开发者以面向对象的方式构建查询逻辑,同时具备 SQL 的表达力。本文将介绍 Criteria API 的基本用法并通过示例展示其实际应用。此 API 通过 API 构建查询条件而非直接编写查询语句,提高了代码的可读性和安全性。无论是简单的条件过滤还是复杂的分页和连接查询,Criteria API 均能胜任,有助于提升开发效率和应用的健壮性。
95 0
|
4月前
|
开发框架 JSON 前端开发
利用查询条件对象,在Asp.net Web API中实现对业务数据的分页查询处理
利用查询条件对象,在Asp.net Web API中实现对业务数据的分页查询处理