Java調用支付寶接口


一、環境准備

准備:內網穿透工具以及支付寶沙箱環境

1、內網穿透,申請免費域名(用於支付寶異步通知回調,要求外網可訪問)

申請地址:https://www.ngrok.cc/

 

 

下載Ngrok客戶端

 

解壓,點擊bat文件啟動

 

輸入剛才申請的隧道id,回車

 

端口映射完成

項目啟動可使用http://donleo.free.idcfengye.com 訪問

2、登錄支付寶電腦端

網站地址:https://open.alipay.com/platform/home.htm

沙箱文檔地址:https://opendocs.alipay.com/open/200/105311

首頁-->支付寶掃碼登錄-->進入管理中心-->開發服務-->研發服務

設置秘鑰

下載開發助手:https://opendocs.alipay.com/open/291/introduce

下載解壓-->安裝-->打開工具-->生成密匙(安裝路徑不要有空格)

將剛才通過工具生成的應用公鑰復制到沙箱應用中,自動生成對應的支付寶公鑰

 

 

沙箱賬號,提供了賣家和買家兩個測試賬號,用於開發時方便測試

二、搭建項目

以電腦網站支付為例

支付寶接口文檔:https://opendocs.alipay.com/open/270/105900

接口英文名

接口中文名

alipay.trade.page.pay

統一收單下單並支付頁面接口

alipay.trade.refund

統一收單交易退款接口

alipay.trade.fastpay.refund.query

統一收單交易退款查詢接口

alipay.trade.query

統一收單線下交易查詢接口

alipay.trade.close

統一收單交易關閉接口

alipay.data.dataservice.bill.downloadurl.query

查詢對賬單下載地址

alipay.trade.refund.depositback.completed

收單退款沖退完成通知

 

參考官方demohttps://opendocs.alipay.com/open/270/106291

下載demo參考

1、新建SpringBoot項目,向pom文件添加alipay-sdk-java依賴

<dependency>
    <groupId>com.alipay.sdk</groupId>
    <artifactId>alipay-sdk-java</artifactId>
    <version>4.11.54.ALL</version>
</dependency>

2、在官方給的demo例子,拷貝AlipayConfig配置文件到項目中

import java.io.FileWriter;
import java.io.IOException;

/**
 * 類名:AlipayConfig
 * 功能:基礎配置類
 * 詳細:設置帳戶有關信息及返回路徑
 * 修改日期:2017-04-05
 * 說明:
 * 以下代碼只是為了方便商戶測試而提供的樣例代碼,商戶可以根據自己網站的需要,按照技術文檔編寫,並非一定要使用該代碼。
 * 該代碼僅供學習和研究支付寶接口使用,只是提供一個參考。
 */
public class AlipayConfig {

//↓↓↓↓↓↓↓↓↓↓請在這里配置您的基本信息↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

    // 應用ID,您的APPID,收款賬號既是您的APPID對應支付寶賬號
    public static String app_id = "";

    // 商戶私鑰,您的PKCS8格式RSA2私鑰
    public static String merchant_private_key = "";

    // 支付寶公鑰,查看地址:https://openhome.alipay.com/platform/keyManage.htm 對應APPID下的支付寶公鑰。
    public static String alipay_public_key = "";

    // 服務器異步通知頁面路徑  需http://格式的完整路徑,不能加?id=123這類自定義參數,必須外網可以正常訪問
    public static String notify_url = "http://工程公網訪問地址/alipay.trade.page.pay-JAVA-UTF-8/notify_url.jsp";

    // 頁面跳轉同步通知頁面路徑 需http://格式的完整路徑,不能加?id=123這類自定義參數,必須外網可以正常訪問
    public static String return_url = "http://工程公網訪問地址/alipay.trade.page.pay-JAVA-UTF-8/return_url.jsp";

    // 簽名方式
    public static String sign_type = "RSA2";

    // 字符編碼格式
    public static String charset = "utf-8";

    // 支付寶網關
    public static String gatewayUrl = "https://openapi.alipaydev.com/gateway.do";

    // 支付寶網關
    public static String log_path = "C:\\";


//↑↑↑↑↑↑↑↑↑↑請在這里配置您的基本信息↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑

    /**
     * 寫日志,方便測試(看網站需求,也可以改成把記錄存入數據庫)
     *
     * @param sWord 要寫入日志里的文本內容
     */
    public static void logResult(String sWord) {
        FileWriter writer = null;
        try {
            writer = new FileWriter(log_path + "alipay_log_" + System.currentTimeMillis() + ".txt");
            writer.write(sWord);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (writer != null) {
                try {
                    writer.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

應用id(自己的應用id):

商戶私鑰(剛才支付寶開發助手生成的):

支付寶公鑰:

更改支付寶網關地址為開發環境地址:https://openapi.alipaydev.com/gateway.do

notify_url異步通知接口地址,例如:http://donleo.free.idcfengye.com/alipay/notifyPay

return_url頁面跳轉同步通知路徑

三、測試接口

1、支付接口測試

接口文檔地址:https://opendocs.alipay.com/apis/api_1/alipay.trade.page.pay/

調用流程

公共請求參數,每次請求都會包含的參數

查看支付請求參數,這四個參數必選

創建支付記錄和退款記錄兩個實體類,用於將交易信息保存到本地數據庫

Base:基礎類

class Base implements Serializable {
    /**
     * id 主鍵,自增
     */
    @TableId(value = "id", type = IdType.AUTO)
    private Integer id;
    /**
     * 創建時間
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private Date createTime;
    /**
     * 更新時間
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private Date updateTime;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public Date getCreateTime() {
        return createTime;
    }

    public void setCreateTime(Date createTime) {
        this.createTime = createTime;
    }

    public Date getUpdateTime() {
        return updateTime;
    }

    public void setUpdateTime(Date updateTime) {
        this.updateTime = updateTime;
    }

PayLog:交易記錄

@Data
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(callSuper = true)
public class PayLog extends Base {

    /**
     * 商戶訂單號
     */
    private String outTradeNo;
    /**
     * 支付寶交易號
     */
    private String tradeNo;
    /**
     * 支付金額
     */
    private Double totalAmount;
    /**
     * 支付訂單名稱
     */
    private String subject;
    /**
     * 支付訂單詳情
     */
    private String subjectInfo;
    /**
     * 支付時間
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private Date payTime;
    /**
     * 支付狀態
     */
    private Integer status;
    /**
     * 退款總金額
     */
    private Double refundTotalAmount;
}

RefundLog:退款記錄

@Data
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(callSuper = true)
public class RefundLog extends Base {
    /**
     * 商戶訂單號
     */
    private String outTradeNo;
    /**
     * 退款編號
     */
    private String refundNo;
    /**
     * 退款金額
     */
    private Double refundAmount;
    /**
     * 退款原因
     */
    private String refundInfo;
    /**
     * 退款時間
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private Date refundTime;

這些只是部分部分,具體參數可參考支付寶接口文檔

交易支付狀態常量類

public class Constant {
    //待支付
    public static final int PAY_STATUS_WAITING=0;
    //已支付
    public static final int PAY_STATUS_PAID=1;
    //已關閉
    public static final int ABLE_PRAISE_CLOSED=2;
    //已部分退款
    public static final int PAY_STATUS_REFUNDED=3;
    //已全額退款
    public static final int PAY_STATUS_ALL_REFUNDED=4;
}

支付代碼請求示例:

   @Override
    public void pay(String price, String name, HttpServletResponse response) {
        try {
            //獲得初始化的AlipayClient
            DefaultAlipayClient client = new DefaultAlipayClient(AlipayConfig.gatewayUrl, AlipayConfig.app_id, AlipayConfig.merchant_private_key,
       "json",AlipayConfig.charset, AlipayConfig.alipay_public_key, AlipayConfig.sign_type); //電腦網頁支付 AlipayTradePagePayRequest request = new AlipayTradePagePayRequest(); //手機網頁支付 // AlipayTradeWapPayRequest request=new AlipayTradeWapPayRequest(); Map<Object, Object> map = new HashMap<>(); //商戶訂單號,商戶網站訂單系統中唯一訂單號,必填 String outTradeNo = UUIDUtil.getUUID(); map.put("out_trade_no", outTradeNo); //銷售產品碼,目前僅支持FAST_INSTANT_TRADE_PAY,必填 map.put("product_code", "FAST_INSTANT_TRADE_PAY"); //付款金額,必填 map.put("total_amount", price); //訂單名稱,必填 map.put("subject", name); String string = JSONObject.toJSONString(map); log.info("--------" + string); request.setBizContent(string); //創建訂單 createPayLog(outTradeNo, name, price); //異步通知 request.setNotifyUrl(AlipayConfig.notify_url); //頁面跳轉 request.setReturnUrl(AlipayConfig.return_url); String body = client.pageExecute(request).getBody(); response.setContentType("text/html;charset=utf-8"); response.getWriter().write(body); response.getWriter().flush(); response.getWriter().close(); } catch (Exception e) { log.error(e.getMessage()); } } /** * 創建訂單,保存到本地數據庫 * * @param outTradeNo 商戶訂單號 * @param name 訂單名稱 * @param price 付款金額 */ private void createPayLog(String outTradeNo, String name, String price) { PayLog payLog = new PayLog(); payLog.setOutTradeNo(outTradeNo); payLog.setSubject(name); payLog.setTotalAmount(parseDouble(price)); payLog.setStatus(Constant.PAY_STATUS_WAITING); payLog.setCreateTime(new Date()); payLogDao.insert(payLog); }

異步通知回調,post請求

    @Override
    public String notifyPay(HttpServletRequest request) {
        try {
            log.info("進入異步通知接口");
            //獲取支付寶POST過來反饋信息
            Map<String, String> params = new HashMap<>();
            Map<String, String[]> requestParams = request.getParameterMap();
            for (String name : requestParams.keySet()) {
                String[] values = requestParams.get(name);
                String valueStr = "";
                for (int i = 0; i < values.length; i++) {
                    valueStr = (i == values.length - 1) ? valueStr + values[i]
                            : valueStr + values[i] + ",";
                }
                params.put(name, valueStr);
            }
            //調用SDK驗證簽名
            boolean signVerified = AlipaySignature.rsaCheckV1(params, AlipayConfig.alipay_public_key, AlipayConfig.charset, AlipayConfig.sign_type);

            /* 實際驗證過程建議商戶務必添加以下校驗:
               1、需要驗證該通知數據中的out_trade_no是否為商戶系統中創建的訂單號,
               2、判斷total_amount是否確實為該訂單的實際金額(即商戶訂單創建時的金額),
               3、校驗通知中的seller_id(或者seller_email) 是否為out_trade_no這筆單據的對應的操作方(有的時候,一個商戶可能有多個seller_id/seller_email)
               4、驗證app_id是否為該商戶本身。
           */
            if (signVerified) {//驗證成功
                //商戶訂單號
                String out_trade_no = request.getParameter("out_trade_no");
                //支付寶交易號
                String trade_no = request.getParameter("trade_no");
                //交易狀態
                String trade_status = request.getParameter("trade_status");
                //支付金額
                String total_amount = request.getParameter("total_amount");

                if (StringUtils.isEmpty(out_trade_no)) {
                    log.error("商戶訂單號為空");
                    return "fail";
                }
                if (StringUtils.isEmpty(trade_no)) {
                    log.error("支付寶交易號為空");
                    return "fail";
                }
                if (StringUtils.isEmpty(total_amount)) {
                    log.error("支付金額為空");
                    return "fail";
                }
                if (StringUtils.isEmpty(trade_status)) {
                    log.error("交易狀態為空");
                    return "fail";
                }

                //比對金額和交易號是否一致
                PayLog payLog = new LambdaQueryChainWrapper<>(payLogDao).eq(PayLog::getOutTradeNo, out_trade_no).one();
                if (payLog == null) {
                    log.error("訂單編號不存在!【" + out_trade_no + "】");
                    return "fail";
                } else {
                    if (payLog.getTotalAmount().compareTo(new Double(total_amount)) != 0) {
                        log.error("支付金額不同!【" + total_amount + "】" + "【" + payLog.getTotalAmount() + "】");
                        return "fail";
                    }
                }
                //參數驗證合法,將交易號與狀態更新到本地數據庫
                payLog.setTradeNo(trade_no);
                payLog.setStatus(Constant.PAY_STATUS_PAID);
                payLog.setPayTime(new Date());
                payLogDao.updateById(payLog);
                return "success";

            } else {//驗證失敗
                //調試用,寫文本函數記錄程序運行情況是否正常
//                String sWord = AlipaySignature.getSignCheckContentV1(params);
//                AlipayConfig.logResult(sWord);
                return "fail";
            }
        } catch (Exception e) {
            log.error(e.getMessage());
        }
        return "fail";
    }

請求示例:

http://donleo.free.idcfengye.com/alipay/pay?price=9000&name=華為Pro40

可以下載支付寶App沙箱版掃碼支付,也可以輸入賬號密碼支付

方便測試,直接輸入賬號密碼

 

輸入密碼可支付成功后會進入異步通知接口,是否真正支付成功是以異步通知為准,可在異步通知接口中進行一系列的邏輯驗證

2、交易查詢測試

接口文檔地址:https://opendocs.alipay.com/apis/api_1/alipay.trade.query

代碼示例:

@Override
public String queryPayLog(HttpServletRequest request) {
    try {
        //獲得初始化的AlipayClient
        AlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.gatewayUrl, AlipayConfig.app_id, AlipayConfig.merchant_private_key,
     "json", AlipayConfig.charset, AlipayConfig.alipay_public_key, AlipayConfig.sign_type); //設置請求參數 AlipayTradeQueryRequest alipayRequest = new AlipayTradeQueryRequest(); //商戶訂單號,商戶網站訂單系統中唯一訂單號 String out_trade_no = request.getParameter("out_trade_no"); //支付寶交易號 String trade_no = request.getParameter("trade_no"); //請二選一設置,兩者都存在優先取trade_no Map<String, Object> map = new HashMap<>(); map.put("out_trade_no", out_trade_no); map.put("trade_no", trade_no); alipayRequest.setBizContent(JSONObject.toJSONString(map)); //請求 String result = alipayClient.execute(alipayRequest).getBody(); log.info("交易查詢:【" + result + "】"); return result; } catch (Exception e) { log.error(e.getMessage()); return e.getMessage(); }

返回結果示例:

{
    "alipay_trade_query_response": {
        "code": "10000",
        "msg": "Success",
        "buyer_logon_id": "stb***@sandbox.com",
        "buyer_pay_amount": "0.00",
        "buyer_user_id": "2088622955538298",
        "buyer_user_type": "PRIVATE",
        "invoice_amount": "0.00",
        "out_trade_no": "39d1a795c14d4078bbb26665a6f9fe69",
        "point_amount": "0.00",
        "receipt_amount": "0.00",
        "send_pay_date": "2021-03-08 16:36:35",
        "total_amount": "99.90",
        "trade_no": "2021030822001438290501186947",
        "trade_status": "TRADE_SUCCESS"
    },
    "sign": "ceDc9LR7Co8kh/oJbWpzdCQhylR6JEG6pxQnh89WQLUal0+t5Sds493XHET8QdZONb2tbRNAxwhbgbgLRiQjMCNQLRg+Hxu8uGjH2dpwEIlCWwc3LfFOZo5bCmofKV03sl+ABa4HhMVhVYIwEjCUlEofMoeC2n/PNA8HeQ8h7uPHAv/A9yIxMnzXraoBTYcXiXGtV/IdTWLepq9vmrmMRDVxjFqAzRH/p1dtq+D5fTb45jSUFUYU1UC1MDsVqkS6iM9oVGtqRS8JrZun9HVUFiMPm9Bi17HDnCfQBjo63olPk2620N9W5HwV3W9xUD2Yp6ncndCB99rhOuDf8BwQ=="
}

3、交易關閉測試

接口文檔地址:https://opendocs.alipay.com/apis/api_1/alipay.trade.close

請求流程

 

代碼示例:

    @Override
    public String closePayLog(HttpServletRequest request) {
        try {
            //獲得初始化的AlipayClient
            AlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.gatewayUrl, AlipayConfig.app_id, AlipayConfig.merchant_private_key,
       "json", AlipayConfig.charset, AlipayConfig.alipay_public_key, AlipayConfig.sign_type); //設置請求參數 AlipayTradeCloseRequest alipayRequest = new AlipayTradeCloseRequest(); //商戶訂單號,商戶網站訂單系統中唯一訂單號 String out_trade_no = request.getParameter("out_trade_no"); //支付寶交易號 // String trade_no = request.getParameter("trade_no"); //請二選一設置 alipayRequest.setBizContent("{\"out_trade_no\":\"" + out_trade_no + "\"}"); //請求 String result = alipayClient.execute(alipayRequest).getBody(); log.info("返回數據------>" + result); JSONObject jsonObject = JSONObject.parseObject(result).getJSONObject("alipay_trade_close_response"); Long code = Long.valueOf(jsonObject.get("code").toString()); //關閉成功,同步數據狀態 if (code.compareTo(10000L) == 0) { PayLog payLog = new LambdaQueryChainWrapper<>(payLogDao).eq(PayLog::getOutTradeNo, out_trade_no).one(); payLog.setStatus(Constant.ABLE_PRAISE_CLOSED); payLog.setUpdateTime(new Date()); payLogDao.updateById(payLog); } return result; } catch (Exception e) { log.error(e.getMessage()); return e.getMessage(); } }

4、退款接口測試

接口文檔地址:https://opendocs.alipay.com/apis/api_1/alipay.trade.refund

調用流程

 

如果可以多次退款,out_request_no必傳,且保證唯一

代碼示例(支持一個訂單多次退款)

@Override
    public String refundPay(HttpServletRequest request) {
        try {
            //獲得初始化的AlipayClient
            AlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.gatewayUrl, AlipayConfig.app_id, AlipayConfig.merchant_private_key,
       "json", AlipayConfig.charset, AlipayConfig.alipay_public_key, AlipayConfig.sign_type); //設置請求參數 AlipayTradeRefundRequest alipayRequest = new AlipayTradeRefundRequest(); //商戶訂單號,商戶網站訂單系統中唯一訂單號 String out_trade_no = request.getParameter("out_trade_no"); //支付寶交易號 // String trade_no = request.getParameter("trade_no"); //請二選一設置 //需要退款的金額,該金額不能大於訂單金額,必填 String refund_amount = request.getParameter("refund_amount"); //退款的原因說明 String refund_reason = request.getParameter("refund_reason"); //標識一次退款請求,同一筆交易多次退款需要保證唯一,如需部分退款,則此參數必傳 String out_request_no = UUIDUtil.getUUID(); //判斷是否可以退款 int payCode = refundAliPay(out_trade_no, refund_amount); if (payCode == 1) { return "退款金額不能大於可退款金額"; } else if (payCode == 2) { return "訂單已關閉,不能退款"; } else if (payCode == 3) { return "訂單未支付,不能退款"; } else if (payCode == 4) { return "訂單已全部退款"; } else { alipayRequest.setBizContent("{\"out_trade_no\":\"" + out_trade_no + "\"," + "\"refund_amount\":\"" + refund_amount + "\"," + "\"refund_reason\":\"" + refund_reason + "\"," + "\"out_request_no\":\"" + out_request_no + "\"}"); //請求 String result = alipayClient.execute(alipayRequest).getBody(); log.info("退款信息------>" + result); JSONObject jsonObject = JSONObject.parseObject(result).getJSONObject("alipay_trade_refund_response"); Long code = Long.valueOf(jsonObject.get("code").toString()); //退款成功,更新數據庫並保存退款記錄 if (code.compareTo(10000L) == 0) { //查詢退款記錄 List<RefundLog> refundLogList = new LambdaQueryChainWrapper<>(refundLogDao).eq(RefundLog::getOutTradeNo, out_trade_no).list(); double refundTotalAmount = 0.00; BigDecimal d1 = new BigDecimal(refundTotalAmount); if (refundLogList.size() > 0) { for (RefundLog aRefundLogList : refundLogList) { BigDecimal d2 = new BigDecimal(aRefundLogList.getRefundAmount()); refundTotalAmount += d1.add(d2).doubleValue(); } } //插入退款記錄 RefundLog refundLog = new RefundLog(); refundLog.setOutTradeNo(out_trade_no); refundLog.setRefundNo(out_request_no); refundLog.setRefundAmount(parseDouble(refund_amount)); refundLog.setRefundInfo(refund_reason); refundLog.setRefundTime(new Date()); refundLogDao.insert(refundLog); //更新支付記錄 refundTotalAmount += parseDouble(refund_amount); PayLog payLog = new LambdaQueryChainWrapper<>(payLogDao).eq(PayLog::getOutTradeNo, out_trade_no).one(); payLog.setUpdateTime(new Date()); if (refundTotalAmount == payLog.getTotalAmount()) { payLog.setStatus(Constant.PAY_STATUS_ALL_REFUNDED); } else { payLog.setStatus(Constant.PAY_STATUS_REFUNDED); } payLog.setRefundTotalAmount(refundTotalAmount); payLogDao.updateById(payLog); } return result; } } catch (Exception e) { log.error(e.getMessage()); return e.getMessage(); } } /** * 判斷是否可以退款 * * @param out_trade_no 訂單號 * @param refund_amount 退款金額 * @return int */ private int refundAliPay(String out_trade_no, String refund_amount) { List<RefundLog> refundLogList = new LambdaQueryChainWrapper<>(refundLogDao).eq(RefundLog::getOutTradeNo, out_trade_no).list(); double refundTotalAmount = 0.00; BigDecimal d1 = new BigDecimal(refundTotalAmount); if (refundLogList.size() > 0) { for (RefundLog aRefundLogList : refundLogList) { BigDecimal d2 = new BigDecimal(aRefundLogList.getRefundAmount()); refundTotalAmount += d1.add(d2).doubleValue(); } } //查詢支付記錄 PayLog payLog = new LambdaQueryChainWrapper<>(payLogDao).eq(PayLog::getOutTradeNo, out_trade_no).one(); //退款金額 double refundAmount = parseDouble(refund_amount); //支付總金額 double totalAmount = payLog.getTotalAmount(); //可退款金額 BigDecimal b1 = new BigDecimal(totalAmount); BigDecimal b2 = new BigDecimal(refundTotalAmount); double enableAmount = b1.subtract(b2).doubleValue(); if (payLog.getStatus().equals(Constant.ABLE_PRAISE_CLOSED)) { //訂單已關閉,不能退款 return 2; } else if (payLog.getStatus().equals(Constant.PAY_STATUS_WAITING)) { //訂單未支付,不能退款 return 3; } else if (payLog.getStatus().equals(Constant.PAY_STATUS_ALL_REFUNDED)) { //訂單已全部退款 return 4; } else { //表示可以退款 if (refundAmount > enableAmount) { //退款金額不能大於可退款金額 return 1; } return 0; } }

請求示例:

  http://donleo.free.idcfengye.com/alipay/refundPay?out_trade_no=15baf0eb282844c9a7bbcf491a3ab214&refund_amount=100&refund_reason=好評返現

響應示例:

{
    "alipay_trade_refund_response": {
        "code": "10000",
        "msg": "Success",
        "buyer_logon_id": "stb***@sandbox.com",
        "buyer_user_id": "2088622955538298",
        "fund_change": "Y",
        "gmt_refund_pay": "2021-03-09 10:36:00",
        "out_trade_no": "15baf0eb282844c9a7bbcf491a3ab214",
        "refund_fee": "322.20",
        "send_back_fee": "0.00",
        "trade_no": "2021030622001438290501185818"
    },
    "sign": "h6k02XohrwCg4HhEFjHXdER+AkOc4jbt5c06nuEYAI/RjCfnX9Km3LO0+Z2Xz+0RJTGgAtWJcp94Te4/Uomdnug9m+LA3bX1O1HSi/wlThUXT7QGwN/EyYxxZV5uAJzd5Q49bZZIsh8n39NXnShzRcZ2FP8sSp02kECCyiKjYVDrMLyOPoR4gcJiGUmwE2jKNIHZ2dxJ6D75XBtQkg9YsaOfbX47bDqAEEIxAcySBVfF0WkNha0rpTXWtriqZHrLzJZsNSwwqdM2W+EezLnxmpfzIdSE35fCJHXehVXm5veJ9czgkiDpuToaD+o0qUo6ex+1pnxu8nqmSMFraaTA=="
}

查看本地數據庫中的退款記錄

5、退款查詢測試

接口文檔地址:https://opendocs.alipay.com/apis/api_1/alipay.trade.fastpay.refund.query

代碼示例:

@Override
public String refundQuery(HttpServletRequest request) {
    try {
        //獲得初始化的AlipayClient
        AlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.gatewayUrl, AlipayConfig.app_id, AlipayConfig.merchant_private_key, "json", AlipayConfig.charset, AlipayConfig.alipay_public_key, AlipayConfig.sign_type);
        //設置請求參數
        AlipayTradeFastpayRefundQueryRequest alipayRequest = new AlipayTradeFastpayRefundQueryRequest();
        //商戶訂單號,商戶網站訂單系統中唯一訂單號
        String out_trade_no = request.getParameter("out_trade_no");
        //請求退款接口時,傳入的退款請求號,如果在退款請求時未傳入,則該值為創建交易時的外部交易號,必填
        //此處為退款記錄編號
        String out_request_no = request.getParameter("refund_no");

        alipayRequest.setBizContent("{\"out_trade_no\":\"" + out_trade_no + "\","
                + "\"out_request_no\":\"" + out_request_no + "\"}");
        //請求
        String result = alipayClient.execute(alipayRequest).getBody();
        log.info("退款記錄------>" + result);
        return result;
    } catch (Exception e) {
        log.error(e.getMessage());
        return e.getMessage();
    }
}

請求示例:

  http://localhost:9000/alipay/refundQuery?out_trade_no=15baf0eb282844c9a7bbcf491a3ab214&refund_no=65bdc5dc0afa457688be38b7d5042e4b

響應示例:

{
    "alipay_trade_fastpay_refund_query_response": {
        "code": "10000",
        "msg": "Success",
        "out_request_no": "65bdc5dc0afa457688be38b7d5042e4b",
        "out_trade_no": "15baf0eb282844c9a7bbcf491a3ab214",
        "refund_amount": "100.00",
        "total_amount": "9000.00",
        "trade_no": "2021030622001438290501185818"
    },
    "sign": "TOIvyxk+FGQPuTgX9s6rWyxRSEaEA0AgqlJj7dmwU6IPfjgLIBDMw6NXsax0nQQTaYFOfLaZ56c0ap7+I/t31WQbF5/6DczWKoxK7ijenXvtQ9IcYx17e272xdUDrwLMe/w3q5b30py0WBqTLfBRUkV9tqystI7yeF9QAx90wMp9oe8spxeYXKcfuJ3fVpjEpCA0RbL6SvO69Vawh400adcVu2PIG5W1/gkKTOCgE6cXsJ1MGL7GvYnXgfFwMFwnhZP+JZFmktdfTNsIV8eakp+oyVNJJvobIKjjcr5Bfvrzt3BIqN2M6XOAxfkaZ9nxE0hcmRY/LTZ5FFvo2b2A=="
}

6、賬單下載測試

接口文檔地址:https://opendocs.alipay.com/apis/api_15/alipay.data.dataservice.bill.downloadurl.query

調用流程

 

代碼示例:

@Override
public String downloadPayLog(HttpServletRequest request) {
    try {
        //獲得初始化的AlipayClient
        AlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.gatewayUrl, AlipayConfig.app_id, AlipayConfig.merchant_private_key, "json", AlipayConfig.charset, AlipayConfig.alipay_public_key, AlipayConfig.sign_type);
        AlipayDataDataserviceBillDownloadurlQueryRequest alipayRequest = new AlipayDataDataserviceBillDownloadurlQueryRequest();
        //賬單類型 trade:商戶基於支付寶交易收單的業務賬單;signcustomer:基於商戶支付寶余額收入及支出等資金變動的帳務賬單。
        String bill_type = request.getParameter("bill_type");
        //賬單時間,必填
        String bill_date = request.getParameter("bill_date");
        alipayRequest.setBizContent("{\"bill_type\":\"" + bill_type + "\","
                + "\"bill_date\":\"" + bill_date + "\"}");
        //請求
        String result = alipayClient.execute(alipayRequest).getBody();
        log.info("賬單記錄------>" + result);
        return result;
    } catch (Exception e) {
        log.error(e.getMessage());
        return e.getMessage();
    }
}

請求示例:

http://localhost:9000/alipay/downloadPayLog?bill_type=trade&bill_date=2020-03-08

響應示例:

{
    "alipay_data_dataservice_bill_downloadurl_query_response": {
        "code": "10000",
        "msg": "Success",
        "bill_download_url": "http://dwbillcenter-2-1-2.daily.alipay.net/downloadBillFile.resource?bizType=trade&userId=20886219553637780156&fileType=csv.zip&bizDates=20200308&downloadFileName=2088621955363770156_20200308.csv.zip&fileId=%2Ftrade%2F20886219553637780156%2F20200308.csv.zip&timestamp=1615257961&token=515b244e8b28fe10e0b0fcd3923c6b6"
    },
    "sign": "q1vX2Pt+Sm4iThIiGeMb9JwAOlew1zCcPUhotuE3iPsyE4c6m35TgpiqyYNZwTMse59fovogCUfiw1XwbG/7d5p7z6LWfgWws88Mh1v1nWYb7HNyNfh0KMd5CWf3KLJ0tE2hWeUpWAoOVruDQ8NVyWM1it/iDQa+Mh9Nr7KwWpMxOhNK2vH7MzRt5lKECQOLPXc5ko6IgYI4ddF62nMtLdKkJQeLyP7ByWGpWcBpLLca5pYTVvnMwo1dfobgNi05jYE5id+n6J2/q81gTPbJaP9UMv99qmURX37SJKwdekICRXMdfHRaEnTztM6BqCw0EvrnUMf/0BAt4RhvKw=="
}

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM