淺析微信支付:申請退款而钞、退款回調接口、查詢退款

本文是【淺析微信支付】系列文章的第八篇拘荡,主要講解商戶如何處理微信申請退款臼节、退款回調、查詢退款接口珊皿,其中有一些坑的地方网缝,會著重強調。


淺析微信支付系列已經更新七篇了喲~蟋定,沒有看過的朋友們可以看一下哦粉臊。

淺析微信支付:查詢訂單和關閉訂單

淺析微信支付:支付結果通知

淺析微信支付:統(tǒng)一下單接口

在實際場景中,申請退款和退款回調接口是比較常用到的微信支付接口驶兜,這里我們會講原路返回方式的退款扼仲,還有的是使用直接為用戶付款到零錢現金紅包等方式來退款抄淑,此種情況主要會出現在客服退款時屠凶,不是全部退款的情況,也有的會出現在使用了微信代金券-單品券的時候肆资,因為單品券不能部分退款矗愧,所以只能走企業(yè)付款用戶的方式,以下我們主要講原路返回退款郑原。

PS:原路返回的意思就是唉韭,從你支付時的關聯支付單中扣款夜涕,微信會記錄相關數據,可以在客戶端通知中展示属愤。

1钠乏、申請退款接口

以下為微信官方的申請退款文檔:

https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_4

1.1. 應用場景

當交易發(fā)生之后一段時間內,由于買家或者賣家的原因需要退款時春塌,賣家可以通過退款接口將支付款退還給買家,微信支付將在收到退款請求并且驗證成功之后簇捍,按照退款規(guī)則將支付款按原路退到買家?guī)ぬ柹稀?/p>

注意:
1只壳、交易時間超過一年的訂單無法提交退款
2、微信支付退款支持單筆交易分多次退款暑塑,多次退款需要提交原支付訂單的商戶訂單號和設置不同的退款單號吼句。申請退款總金額不能超過訂單金額。 一筆退款失敗后重新提交事格,請不要更換退款單號惕艳,請使用原商戶退款單號
3、請求頻率限制:150qps驹愚,即每秒鐘正常的申請退款請求次數不超過150次
錯誤或無效請求頻率限制:6qps远搪,即每秒鐘異常或錯誤的退款申請請求不超過6次
4逢捺、每個支付訂單的部分退款次數不能超過50次

PS:以上限制一般情況下不會出現谁鳍,但我們也必須寫入系統(tǒng)異常場景處理中,請求頻率可以使用隊列或增加延遲等方式來處理劫瞳,部分退款此時不要超過微信的限制倘潜。

1.2. 接口鏈接

https://api.mch.weixin.qq.com/secapi/pay/refund

1.3. 是否需要證書

請求需要雙向證書。

PS:關于微信證書志于,可以在 [商戶平臺-賬戶中心-API安全] 去下載涮因,此證書很多支付接口均需要使用,請將證書地址配置為常量伺绽,具體實現可以參考作者github源碼养泡。

1.4. 調用接口

先看源碼,如下:

/**
 * [微信退款接口] - 保存調用的相關記錄
 * @param refundPayment 退款訂單的支付記錄
 * @param tradePayment 歷史付款單
 * @return map
 * @throws Exception e
 *
 * @author yclimb
 * @date 2018/6/21
 */
public Map<String,String> saveWxPayRefund(Payment refundPayment, Payment tradePayment) throws Exception {
    if (refundPayment == null || tradePayment == null) {
        return null;
    }

    // 微信訂單號/商戶訂單號奈应,必須傳入其中一個瓤荔,此處默認傳入商戶訂單號
    // 微信訂單號,微信生成的訂單號钥组,在支付通知中有返回
    // String transaction_id = null;
    // 商戶訂單號输硝,商戶系統(tǒng)內部訂單號,要求32個字符內程梦,只能是數字点把、大小寫字母_-|*@ 橘荠,且在同一個商戶號下唯一。
    String out_trade_no = tradePayment.getFlowNumer();
    // 商戶退款單號郎逃,商戶系統(tǒng)內部的退款單號哥童,商戶系統(tǒng)內部唯一,只能是數字褒翰、大小寫字母_-|*@ 贮懈,同一退款單號多次請求只退一筆。
    String out_refund_no = refundPayment.getFlowNumer();
    // 訂單總金額优训,傳入參數單位為:元
    String total_fee = String.valueOf(tradePayment.getAmount());
    // 退款總金額朵你,訂單總金額,傳入參數單位為:元
    String refund_fee = String.valueOf(refundPayment.getAmount());
    // 退款原因揣非,若商戶傳入抡医,會在下發(fā)給用戶的退款消息中體現退款原因
    String refund_desc = refundPayment.getBody();

    // 微信支付對象
    WXPay wxPay = new WXPay(WXPayConfigImpl.getInstance());

    // 微信退款接口
    Map<String, String> resultMap = wxPay.refund(refundUrl, null, out_trade_no, out_refund_no, total_fee, refund_fee, refund_desc);
    logger.info("saveWxPayRefund:resultMap:" + resultMap.toString());

    // 記錄付款流水


    // 下單失敗,進行處理
    if (WXPayConstants.FAIL.equals(resultMap.get(WXPayConstants.RETURN_CODE)) ||
            WXPayConstants.FAIL.equals(resultMap.get(WXPayConstants.RESULT_CODE))) {

        // 處理結果返回早敬,無需繼續(xù)執(zhí)行
        resultMap.put(WXPayConstants.RESULT_CODE, WXPayConstants.FAIL);
        resultMap.put(WXPayConstants.ERR_CODE_DES, resultMap.get(WXPayConstants.RETURN_MSG));
        return resultMap;
    }

    return resultMap;
}

以上為sdk退款調用示例代碼忌傻,有幾個參數需要我們注意:

字段名 變量名 必填 類型 描述
微信訂單號 transaction_id String(32) 微信生成的訂單號,在支付通知中有返回
商戶訂單號 out_trade_no String(32) 商戶系統(tǒng)內部訂單號搞监,要求32個字符內水孩,只能是數字、大小寫字母_- *@ 琐驴,且在同一個商戶號下唯一荷愕。
商戶退款單號 out_refund_no String(64) 商戶系統(tǒng)內部的退款單號,商戶系統(tǒng)內部唯一棍矛,只能是數字安疗、大小寫字母_- *@ ,同一退款單號多次請求只退一筆够委。
退款金額 refund_fee Int 退款總金額荐类,訂單總金額,單位為分茁帽,只能為整數
退款結果通知url notify_url String(256) 異步接收微信支付退款結果通知的回調地址玉罐,通知URL必須為外網可訪問的url,不允許帶參數潘拨,如果參數中傳了notify_url吊输,則商戶平臺上配置的回調地址將不會生效。

PS:推薦以上的參數都必填铁追,notify_url參數可配置為環(huán)境常量季蚂,根據環(huán)境的不同配置調用不會的回調地址。

下面為具體的實際sdkwxPay.refund調用代碼:

/**
 * 作用:申請退款<br>
 * 場景:當交易發(fā)生之后一段時間內,由于買家或者賣家的原因需要退款時扭屁,賣家可以通過退款接口將支付款退還給買家算谈,
 * 微信支付將在收到退款請求并且驗證成功之后,按照退款規(guī)則將支付款按原路退到買家?guī)ぬ柹稀? * 接口文檔地址:https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter=9_4
 *
 * @param notify_url     回調地址
 * @param transaction_id 微信生成的訂單號料滥,在支付通知中有返回
 * @param out_trade_no   商戶系統(tǒng)內部訂單號然眼,要求32個字符內,只能是數字葵腹、大小寫字母_-|*@ 高每,且在同一個商戶號下唯一。
 * @param out_refund_no  商戶系統(tǒng)內部的退款單號践宴,商戶系統(tǒng)內部唯一鲸匿,只能是數字、大小寫字母_-|*@ 浴井,同一退款單號多次請求只退一筆。
 * @param total_fee      訂單總金額霉撵,傳入參數單位為:元
 * @param refund_fee     退款總金額磺浙,訂單總金額,傳入參數單位為:元
 * @param refund_desc    退款原因徒坡,若商戶傳入撕氧,會在下發(fā)給用戶的退款消息中體現退款原因
 * @return API返回數據
 * @throws Exception e
 */
public Map<String, String> refund(String notify_url, String transaction_id, String out_trade_no, String out_refund_no,
                                  String total_fee, String refund_fee, String refund_desc) throws Exception {

    /** 構造請求參數數據 **/
    Map<String, String> data = new HashMap<>();

    // 變量名      字段名 必填  類型  示例值 描述
    // 微信訂單號    二選一 String(32)  1.21775E+27 微信生成的訂單號,在支付通知中有返回
    if (transaction_id != null) {
        data.put("transaction_id", transaction_id);
    }
    // 商戶訂單號    String(32)  1.21775E+27 商戶系統(tǒng)內部訂單號喇完,要求32個字符內伦泥,只能是數字、大小寫字母_-|*@ 锦溪,且在同一個商戶號下唯一不脯。
    data.put("out_trade_no", out_trade_no);
    // 商戶退款單號   是   String(64)  1.21775E+27 商戶系統(tǒng)內部的退款單號,商戶系統(tǒng)內部唯一刻诊,只能是數字防楷、大小寫字母_-|*@ ,同一退款單號多次請求只退一筆则涯。
    data.put("out_refund_no", out_refund_no);
    // 訂單金額 是   Int 100 訂單總金額复局,單位為分,只能為整數粟判,詳見支付金額
    data.put("total_fee", String.valueOf(new BigDecimal(total_fee).multiply(new BigDecimal(100)).setScale(2, BigDecimal.ROUND_HALF_UP).intValue()));
    // 退款金額 是   Int 100 退款總金額亿昏,訂單總金額,單位為分档礁,只能為整數角钩,詳見支付金額
    // 默認單位為分,系統(tǒng)是元,所以需要*100
    data.put("refund_fee", String.valueOf(new BigDecimal(refund_fee).multiply(new BigDecimal(100)).setScale(2, BigDecimal.ROUND_HALF_UP).intValue()));
    // 退款原因 否   String(80)  商品已售完   若商戶傳入彤断,會在下發(fā)給用戶的退款消息中體現退款原因
    data.put("refund_desc", refund_desc);
    // 貨幣種類 否   String(8)   CNY 貨幣類型野舶,符合ISO 4217標準的三位字母代碼,默認人民幣:CNY宰衙,其他值列表詳見貨幣類型
    data.put("refund_fee_type", WXPayConstants.FEE_TYPE_CNY);
    // 退款結果通知url    否   String(256) https://weixin.qq.com/notify/   異步接收微信支付退款結果通知的回調地址平道,通知URL必須為外網可訪問的url,不允許帶參數,如果參數中傳了notify_url供炼,則商戶平臺上配置的回調地址將不會生效一屋。
    data.put("notify_url", notify_url);

    /** 以下參數為非必填參數 **/
    // 退款資金來源   否   String(30)  REFUND_SOURCE_RECHARGE_FUNDS    僅針對老資金流商戶使用;REFUND_SOURCE_UNSETTLED_FUNDS---未結算資金退款(默認使用未結算資金退款);REFUND_SOURCE_RECHARGE_FUNDS---可用余額退款
    // data.put("refund_account", null);


    /** 以下五個參數,在 this.fillRequestData 方法中會自動賦值 **/
    /*// 小程序ID  appid   是   String(32)  wxd678efh567hg6787  微信分配的小程序ID
    data.put("appid", WXPayConstants.APP_ID);
    // 商戶號  mch_id  是   String(32)  1230000109  微信支付分配的商戶號
    data.put("mch_id", WXPayConstants.MCH_ID);
    // 隨機字符串    nonce_str   是   String(32)  5K8264ILTKCH16CQ2502SI8ZNMTM67VS    隨機字符串袋哼,長度要求在32位以內冀墨。推薦隨機數生成算法
    data.put("nonce_str", nonce_str);
    // 簽名類型 sign_type   否   String(32)  MD5 簽名類型,默認為MD5涛贯,支持HMAC-SHA256和MD5诽嘉。
    data.put("sign_type", WXPayConstants.MD5);
    // 簽名   sign    是   String(32)  C380BEC2BFD727A4B6845133519F3AD6    通過簽名算法計算得出的簽名值,詳見簽名生成算法
    data.put("sign", sign);*/

    // 微信退款接口
    Map<String, String> resultMap = this.refund(data);

    WXPayUtil.getLogger().info("wxPay.refund:" + resultMap);

    return resultMap;
}

以上已經詳細說明的具體的字段含義弟翘,有不明白的同學可以查看微信的官方文檔虫腋,具體的源碼可以查看作者的github。

這里有一個比較需要注意的點稀余,在我們調用退款之后悦冀,會返回一些異常處理情況,官方文檔中收錄了一系列錯誤碼code睛琳,我們可以在系統(tǒng)中對其進行處理盒蟆,這里就不細說了。

2师骗、退款回調接口

以下為微信官方的退款結果通知文檔:

https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_16&index=10

2.1. 應用場景

當商戶申請的退款有結果后历等,微信會把相關結果發(fā)送給商戶,商戶需要接收處理辟癌,并返回應答募闲。
對后臺通知交互時,如果微信收到商戶的應答不是成功或超時愿待,微信認為通知失敗浩螺,微信會通過一定的策略定期重新發(fā)起通知,盡可能提高通知的成功率仍侥,但微信不保證通知最終能成功要出。

(通知頻率為15/15/30/180/1800/1800/1800/1800/3600,單位:秒)

注意:同樣的通知可能會多次發(fā)送給商戶系統(tǒng)农渊。商戶系統(tǒng)必須能夠正確處理重復的通知患蹂。
推薦的做法是或颊,當收到通知進行處理時,首先檢查對應業(yè)務數據的狀態(tài)传于,判斷該通知是否已經處理過囱挑,如果沒有處理過再進行處理,如果處理過直接返回結果成功沼溜。在對業(yè)務數據進行狀態(tài)檢查和處理之前平挑,要采用數據鎖進行并發(fā)控制,以避免函數重入造成的數據混亂系草。

特別說明:退款結果對重要的數據進行了加密通熄,商戶需要用商戶秘鑰進行解密后才能獲得結果通知的內容

2.2. 接口鏈接

在申請退款接口中上傳參數“notify_url”以開通該功能
如果鏈接無法訪問,商戶將無法接收到微信通知找都。
通知url必須為直接可訪問的url唇辨,不能攜帶參數。

示例:notify_url:“https://pay.weixin.qq.com/wxpay/pay.action”

2.3. 解密方式

解密步驟如下: 
(1)對加密串A做base64解碼能耻,得到加密串B
(2)對商戶key做md5赏枚,得到32位小寫key* ( key設置路徑:微信商戶平臺-->賬戶設置-->API安全-->密鑰設置 )
(3)用key*對加密串B做AES-256-ECB解密(PKCS7Padding)

PS:特別注意,如果要進行微信AES解密晓猛,因為GJ的進口管制限制饿幅,Java發(fā)布的運行環(huán)境包中的加解密有一定的限制。默認不允許256位密鑰的AES加解密鞍帝,解決方法就是修改策略文件诫睬,我們需要從官方網站下載無限制權限策略文件煞茫,注意自己JDK的版本別下錯了帕涌。

jdk8的jce下載地址:https://www.oracle.com/technetwork/java/javase/downloads/jce8-download-2133166.html

將local_policy.jar和US_export_policy.jar這兩個文件替換%JRE_HOME%\lib\security和%JDK_HOME%\jre\lib\security下原來的文件,注意先備份原文件续徽。

如果是jdk8蚓曼,可能會遇到安全目錄下有policy文件夾的情況,拿作者的電腦舉例钦扭,jdk路徑為/opt/jdk1.8.0_152/jre/lib/security/policy纫版,此目錄下有兩個子文件夾limitedlimited客情,需要替換limited文件夾下的文件 local_policy.jar其弊、US_export_policy.jar這兩個,最好先備份哦~0蛘K蠓ァ!替換后重啟項目即可仰担。

2.4. 調用接口

因為退款回調接口是咋們系統(tǒng)被動接收微信的消息糊识,所以此處和支付回調接口一致,也是使用了流的方式,格式為xml赂苗,下面我們來看代碼:


/**
 * 退款結果通知
 * <p>
 * 在申請退款接口中上傳參數“notify_url”以開通該功能
 * 如果鏈接無法訪問愉耙,商戶將無法接收到微信通知。
 * 通知url必須為直接可訪問的url拌滋,不能攜帶參數朴沿。示例:notify_url:“https://pay.weixin.qq.com/wxpay/pay.action”
 * <p>
 * 當商戶申請的退款有結果后,微信會把相關結果發(fā)送給商戶鸠真,商戶需要接收處理悯仙,并返回應答。
 * 對后臺通知交互時吠卷,如果微信收到商戶的應答不是成功或超時锡垄,微信認為通知失敗,微信會通過一定的策略定期重新發(fā)起通知祭隔,盡可能提高通知的成功率货岭,但微信不保證通知最終能成功。
 * (通知頻率為15/15/30/180/1800/1800/1800/1800/3600疾渴,單位:秒)
 * 注意:同樣的通知可能會多次發(fā)送給商戶系統(tǒng)千贯。商戶系統(tǒng)必須能夠正確處理重復的通知。
 * 推薦的做法是搞坝,當收到通知進行處理時搔谴,首先檢查對應業(yè)務數據的狀態(tài),判斷該通知是否已經處理過桩撮,如果沒有處理過再進行處理敦第,如果處理過直接返回結果成功。在對業(yè)務數據進行狀態(tài)檢查和處理之前店量,要采用數據鎖進行并發(fā)控制芜果,以避免函數重入造成的數據混亂。
 * 特別說明:退款結果對重要的數據進行了加密融师,商戶需要用商戶秘鑰進行解密后才能獲得結果通知的內容
 * @param request req
 * @param response resp
 * @return res xml
 *
 * @author yclimb
 * @date 2018/6/21
 */
@ApiOperation(value = "微信支付|微信退款回調接口", httpMethod = "POST", notes = "該鏈接是通過【微信退款API】中提交的參數notify_url設置右钾,如果參數中傳了notify_url,則商戶平臺上配置的回調地址將不會生效旱爆。")
@RequestMapping("/refund")
public void refund(HttpServletRequest request, HttpServletResponse response) {

    String resXml = "";
    InputStream inStream;
    try {

        inStream = request.getInputStream();
        ByteArrayOutputStream outSteam = new ByteArrayOutputStream();
        byte[] buffer = new byte[1024];
        int len = 0;
        while ((len = inStream.read(buffer)) != -1) {
            outSteam.write(buffer, 0, len);
        }
        WXPayUtil.getLogger().info("refund:微信退款----start----");

        // 獲取微信調用我們notify_url的返回信息
        String result = new String(outSteam.toByteArray(), "utf-8");
        WXPayUtil.getLogger().info("refund:微信退款----result----=" + result);

        // 關閉流
        outSteam.close();
        inStream.close();

        // xml轉換為map
        Map<String, String> map = WXPayUtil.xmlToMap(result);
        if (WXPayConstants.SUCCESS.equalsIgnoreCase(map.get(WXPayConstants.RETURN_CODE))) {

            WXPayUtil.getLogger().info("refund:微信退款----返回成功");


            /** 以下字段在return_code為SUCCESS的時候有返回: **/
            // 加密信息:加密信息請用商戶秘鑰進行解密舀射,詳見解密方式
            String req_info = map.get("req_info");

            /**
             * 解密方式
             * 解密步驟如下:
             * (1)對加密串A做base64解碼,得到加密串B
             * (2)對商戶key做md5怀伦,得到32位小寫key* ( key設置路徑:微信商戶平臺(pay.weixin.qq.com)-->賬戶設置-->API安全-->密鑰設置 )
             * (3)用key*對加密串B做AES-256-ECB解密(PKCS7Padding)
             */
            String resultStr = AESUtil.decryptData(req_info);

            // WXPayUtil.getLogger().info("refund:解密后的字符串:" + resultStr);
            Map<String, String> aesMap = WXPayUtil.xmlToMap(resultStr);


            /** 以下為返回的加密字段: **/
            //  商戶退款單號  是   String(64)  1.21775E+27 商戶退款單號
            String out_refund_no = aesMap.get("out_refund_no");
            //  退款狀態(tài)    是   String(16)  SUCCESS SUCCESS-退款成功脆烟、CHANGE-退款異常、REFUNDCLOSE—退款關閉
            String refund_status = aesMap.get("refund_status");
            //  商戶訂單號   是   String(32)  1.21775E+27 商戶系統(tǒng)內部的訂單號
            String out_trade_no = aesMap.get("out_trade_no");
            /*//    微信訂單號   是   String(32)  1.21775E+27 微信訂單號
            String transaction_id = null;
            //  微信退款單號  是   String(32)  1.21775E+27 微信退款單號
            String refund_id = null;
            //  訂單金額    是   Int 100 訂單總金額空镜,單位為分浩淘,只能為整數捌朴,詳見支付金額
            String total_fee = null;
            //  應結訂單金額  否   Int 100 當該訂單有使用非充值券時,返回此字段张抄。應結訂單金額=訂單金額-非充值代金券金額砂蔽,應結訂單金額<=訂單金額私股。
            String settlement_total_fee = null;
            //  申請退款金額  是   Int 100 退款總金額,單位為分
            String refund_fee = null;
            //  退款金額    是   Int 100 退款金額=申請退款金額-非充值代金券退款金額巍虫,退款金額<=申請退款金額
            String settlement_refund_fee = null;*/

            // 退款是否成功
            if (!WXPayConstants.SUCCESS.equals(refund_status)) {
                resXml = resFailXml;
            } else {
                // 通知微信.異步確認成功.必寫.不然會一直通知后臺.八次之后就認為交易失敗了.
                resXml = resSuccessXml;
                isSuccess = true;
            }

            // 根據付款單號查詢付款記錄 out_refund_no

            // 付款記錄修改 & 記錄付款日志
            if (payment != null) {
                WXPayUtil.getLogger().error("refund:微信支付回調:修改支付單");
            } else {
                WXPayUtil.getLogger().error("refund:微信支付回調:找不到對應的支付單");
            }


        } else {
            WXPayUtil.getLogger().error("refund:支付失敗,錯誤信息:" + map.get(WXPayConstants.RETURN_MSG));
            resXml = resFailXml;
        }

    } catch (Exception e) {
        WXPayUtil.getLogger().error("refund:微信退款回調發(fā)布異常:", e);
    } finally {
        try {
            // 處理業(yè)務完畢
            BufferedOutputStream out = new BufferedOutputStream(response.getOutputStream());
            out.write(resXml.getBytes());
            out.flush();
            out.close();
        } catch (IOException e) {
            WXPayUtil.getLogger().error("refund:微信退款回調發(fā)布異常:out:", e);
        }
    }
}

以上代碼詳細解釋了如何接收微信回調數據和解碼數據陪腌,具體的AESUtil.decryptData(req_info)請參考作者源碼掂铐,文末有地址,這里就不細講了吐限。

具體的退款接收參數請參考微信官方文檔稠项,需要注意的是商戶退款單號微信退款單號驾荣,此兩個參數是修改和記錄退款的必要憑證轻猖。

3帆吻、查詢退款

以下為微信官方的查詢退款文檔:

https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_5

3.1. 應用場景

提交退款申請后,通過調用該接口查詢退款狀態(tài)咙边。退款有一定延時猜煮,用零錢支付的退款20分鐘內到賬,銀行卡支付的退款3個工作日后重新查詢退款狀態(tài)败许。

注意:如果單個支付訂單部分退款次數超過20次請使用退款單號查詢

3.2. 接口鏈接

https://api.mch.weixin.qq.com/pay/refundquery

3.3. 是否需要證書

不需要

3.4. 調用接口

注意:當一個訂單部分退款超過10筆后王带,商戶用微信訂單號或商戶訂單號調退款查詢API查詢退款時,默認返回前10筆和total_refund_count(訂單總退款次數)市殷。商戶需要查詢同一訂單下超過10筆的退款單時愕撰,可傳入訂單號及offset來查詢,微信支付會返回offset及后面的10筆醋寝,以此類推搞挣。當商戶傳入的offset超過total_refund_count,則系統(tǒng)會返回報錯PARAM_ERROR甥桂。

舉例:

一筆訂單下的退款單有36筆柿究,當商戶想查詢第25筆時邮旷,可傳入訂單號及offset=24黄选,微信支付平臺會返回第25筆到第35筆的退款單信息,或商戶可直接傳入退款單號查詢退款

以下為調用方式:

private void doRefundQuery() {
    // 四選一婶肩,微信訂單號查詢的優(yōu)先級是: refund_id > out_refund_no > transaction_id > out_trade_no
    HashMap<String, String> data = new HashMap<String, String>();
    // 商戶訂單號
    data.put("out_trade_no", out_trade_no);
    // 微信訂單號
    data.put("transaction_id", out_trade_no);
    // 商戶退款單號   
    data.put("out_refund_no", out_trade_no);
    // 微信退款單號   
    data.put("refund_id", out_trade_no);
    try {
        Map<String, String> r = wxpay.refundQuery(data);
        System.out.println(r);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

PS:微信訂單號查詢的優(yōu)先級是: refund_id > out_refund_no > transaction_id > out_trade_no

需要注意的是办陷,查詢退款時,需要注意退款返回的錯誤碼律歼,如果出現錯誤民镜,需要及時同步商戶系統(tǒng)中的退款數據。

結語

以上為申請退款险毁、退款回調接口制圈、查詢退款相關的解釋和源碼们童,特別需要注意的是接收退款時的解密方式和替換安全文件,小伙伴們一定要注意哦鲸鹦,具體的源碼可以看作者的github慧库,里面對每個方法有詳細的注釋。

預告:下一篇文章 下載對賬單和資金賬單馋嗜,敬請期待F氚濉!葛菇!

?如果想要提前一覽源碼的小伙伴甘磨,可以先看看我的 github,地址如下:
?
??https://github.com/YClimb/wxpay-sdk/blob/master/README.md ?

加作者私人微信眯停,作者微信號如下 yclimb济舆,標明 微信支付 可拉入微信支付討論群與小伙伴一起探討哦,一定要標明 微信支付 哦~

到此本文就結束了莺债,關注公眾號查看更多推送B鹪!九府!


關注我的公眾號

?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末椎瘟,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子侄旬,更是在濱河造成了極大的恐慌肺蔚,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,723評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件儡羔,死亡現場離奇詭異宣羊,居然都是意外死亡,警方通過查閱死者的電腦和手機汰蜘,發(fā)現死者居然都...
    沈念sama閱讀 88,485評論 2 382
  • 文/潘曉璐 我一進店門仇冯,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人族操,你說我怎么就攤上這事苛坚。” “怎么了色难?”我有些...
    開封第一講書人閱讀 152,998評論 0 344
  • 文/不壞的土叔 我叫張陵泼舱,是天一觀的道長。 經常有香客問我枷莉,道長娇昙,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,323評論 1 279
  • 正文 為了忘掉前任笤妙,我火速辦了婚禮冒掌,結果婚禮上噪裕,老公的妹妹穿的比我還像新娘。我一直安慰自己股毫,他們只是感情好州疾,可當我...
    茶點故事閱讀 64,355評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著皇拣,像睡著了一般严蓖。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上氧急,一...
    開封第一講書人閱讀 49,079評論 1 285
  • 那天颗胡,我揣著相機與錄音,去河邊找鬼吩坝。 笑死毒姨,一個胖子當著我的面吹牛,可吹牛的內容都是我干的钉寝。 我是一名探鬼主播弧呐,決...
    沈念sama閱讀 38,389評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼嵌纲!你這毒婦竟也來了俘枫?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,019評論 0 259
  • 序言:老撾萬榮一對情侶失蹤逮走,失蹤者是張志新(化名)和其女友劉穎鸠蚪,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體师溅,經...
    沈念sama閱讀 43,519評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡茅信,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,971評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了墓臭。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蘸鲸。...
    茶點故事閱讀 38,100評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖窿锉,靈堂內的尸體忽然破棺而出酌摇,到底是詐尸還是另有隱情,我是刑警寧澤榆综,帶...
    沈念sama閱讀 33,738評論 4 324
  • 正文 年R本政府宣布妙痹,位于F島的核電站铸史,受9級特大地震影響鼻疮,放射性物質發(fā)生泄漏。R本人自食惡果不足惜琳轿,卻給世界環(huán)境...
    茶點故事閱讀 39,293評論 3 307
  • 文/蒙蒙 一判沟、第九天 我趴在偏房一處隱蔽的房頂上張望耿芹。 院中可真熱鬧,春花似錦挪哄、人聲如沸吧秕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽砸彬。三九已至,卻和暖如春斯入,著一層夾襖步出監(jiān)牢的瞬間砂碉,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評論 1 262
  • 我被黑心中介騙來泰國打工刻两, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留增蹭,地道東北人。 一個月前我還...
    沈念sama閱讀 45,547評論 2 354
  • 正文 我出身青樓磅摹,卻偏偏與公主長得像滋迈,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子户誓,可洞房花燭夜當晚...
    茶點故事閱讀 42,834評論 2 345

推薦閱讀更多精彩內容