1. 程式人生 > >微信支付之微信退款

微信支付之微信退款

官方文件

無論刷卡支付、微信公眾號支付、掃碼支付、H5支付、APP支付等都有申請退款API並且介面一樣,本篇文章就拿刷卡支付中的申請退款API文件舉例

應用場景

當交易發生之後一段時間內,由於買家或者賣家的原因需要退款時,賣家可以通過退款介面將支付款退還給買家,微信支付將在收到退款請求並且驗證成功之後,按照退款規則將支付款按原路退到買家帳號上

注意事項

  1. 交易時間超過一年的訂單無法提交退款
  2. 微信支付退款支援單筆交易分多次退款,多次退款需要提交原支付訂單的商戶訂單號和設定不同的退款單號。申請退款總金額不能超過訂單金額。一筆退款失敗後重新提交,請不要更換退款單號,請使用原商戶退款單號
  3. 請求頻率限制:150qps,即每秒鐘正常的申請退款請求次數不超過150次
  4. 錯誤或無效請求頻率限制:6qps,即每秒鐘異常或錯誤的退款申請請求不超過6次
  5. 每個支付訂單的部分退款次數不能超過50次

下載證書

參考安全規範-3.商戶證書

下載:微信商戶平臺(pay.weixin.qq.com)–>賬戶中心–>賬戶設定–>API安全–>證書下載

IJPay 中的介面

com.jpay.weixin.api.WxPayApi.java

 params, String certPath, String certPass) {
        if (isSandbox)
            return doPostSSL(REFUND_SANDBOXNEW_URL, params, certPath, certPass);
        return doPostSSL(REFUND_URL, params, certPath, certPass);
    }

    /**
     * 查詢退款
     * 服務商模式接入文件:https://pay.weixin.qq.com/wiki/doc/api/micropay_sl.php?chapter=9_5
     * 商戶模式接入文件:https://pay.weixin.qq.com/wiki/doc/api/micropay.php?chapter=9_5
     * 
     * @param isSandbox
     *            是否是沙盒環境
     * @param params
     *            請求引數
     * @return {String}
     */
    public static String orderRefundQuery(boolean isSandbox, Map params) {
        if (isSandbox)
            return doPost(REFUNDQUERY_SANDBOXNEW_URL, params);
        return doPost(REFUNDQUERY_URL, params);
    }

" data-snippet-id="ext.9f866db9c07b4c33161e65583204d445" data-snippet-saved="false" data-codota-status="done">    // 申請退款
private static final String REFUND_URL = "https://api.mch.weixin.qq.com/secapi/pay/refund"; // 查詢退款 private static final String REFUNDQUERY_URL = "https://api.mch.weixin.qq.com/pay/refundquery"; // 申請退款 private static final String REFUND_SANDBOXNEW_URL = "https://api.mch.weixin.qq.com/sandboxnew/secapi/pay/refund"
; // 查詢退款 private static final String REFUNDQUERY_SANDBOXNEW_URL = "https://api.mch.weixin.qq.com/sandboxnew/pay/refundquery"; /** * 申請退款 * 服務商模式接入文件:https://pay.weixin.qq.com/wiki/doc/api/micropay_sl.php?chapter=9_4 * 商戶模式接入文件:https://pay.weixin.qq.com/wiki/doc/api/micropay.php?chapter=9_4 * * @param isSandbox * 是否是沙盒環境 * @param params * 請求引數 * @param certPath * 證書檔案目錄 * @param certPass * 證書密碼 * @return {String} */ public static String orderRefund(boolean isSandbox, Map<String, String> params, String certPath, String certPass) { if (isSandbox) return doPostSSL(REFUND_SANDBOXNEW_URL, params, certPath, certPass); return doPostSSL(REFUND_URL, params, certPath, certPass); } /** * 查詢退款 * 服務商模式接入文件:https://pay.weixin.qq.com/wiki/doc/api/micropay_sl.php?chapter=9_5 * 商戶模式接入文件:https://pay.weixin.qq.com/wiki/doc/api/micropay.php?chapter=9_5 * * @param isSandbox * 是否是沙盒環境 * @param params * 請求引數 * @return {String} */ public static String orderRefundQuery(boolean isSandbox, Map<String, String> params) { if (isSandbox) return doPost(REFUNDQUERY_SANDBOXNEW_URL, params); return doPost(REFUNDQUERY_URL, params); }

示例程式碼

com.ijpay.controller.weixin.WxPayController.java

    /**
     * 微信退款
     */
    public void refund() {
        String transaction_id = getPara("transactionId");
        String out_trade_no = getPara("out_trade_no");

        if (StrKit.isBlank(out_trade_no) && StrKit.isBlank(transaction_id)) {
            renderText("transactionId、out_trade_no二選一");
            return;
        }

        Map<String, String> params = new HashMap<String, String>();
        params.put("appid", appid);
        params.put("mch_id", mch_id);
        params.put("nonce_str", System.currentTimeMillis()+"");
        if (StrKit.notBlank(transaction_id)) {
            params.put("transaction_id", transaction_id);
        }else {
            params.put("out_trade_no", out_trade_no);
        }
        params.put("out_refund_no", System.currentTimeMillis()+"");
        params.put("total_fee", "1");
        params.put("refund_fee", "1");
        params.put("sign", PaymentKit.createSign(params, partnerKey));
        String refund = WxPayApi.orderRefund(false, params , certPath, mch_id);
        renderText(refund);
    }

    /**
     * 微信退款查詢
     */
    public void refundQuery() {
        String transaction_id = getPara("transactionId");
        String out_trade_no = getPara("out_trade_no");
        String out_refund_no = getPara("out_refund_no");
        String refund_id = getPara("refund_id");

        Map<String, String> params = new HashMap<String, String>();
        params.put("appid", appid);
        params.put("mch_id", mch_id);
        params.put("nonce_str", System.currentTimeMillis()+"");
        params.put("transaction_id", transaction_id);
        params.put("out_trade_no", out_trade_no);
        params.put("out_refund_no", out_refund_no);
        params.put("refund_id", refund_id);
        params.put("out_refund_no", System.currentTimeMillis()+"");
        params.put("sign", PaymentKit.createSign(params, partnerKey));
        String refund = WxPayApi.orderRefundQuery(false, params);
        renderText(refund);
    }

同步返回結果XML參考

//退款
<xml><return_code><![CDATA[SUCCESS]]></return_code>
<return_msg><![CDATA[OK]]></return_msg>
<appid><![CDATA[wxxx]]></appid>
<mch_id><![CDATA[xxxx]]></mch_id>
<nonce_str><![CDATA[22hvoyIn52VVVksU]]></nonce_str>
<sign><![CDATA[ED121D6583909150308C76ACFB6FC74B]]></sign>
<result_code><![CDATA[SUCCESS]]></result_code>
<transaction_id><![CDATA[4200000100201801133414066xxx]]></transaction_id>
<out_trade_no><![CDATA[1515845954891]]></out_trade_no>
<out_refund_no><![CDATA[1519535580802]]></out_refund_no>
<refund_id><![CDATA[50000405502018022503594217469]]></refund_id>
<refund_channel><![CDATA[]]></refund_channel>
<refund_fee>1</refund_fee>
<coupon_refund_fee>0</coupon_refund_fee>
<total_fee>1</total_fee>
<cash_fee>1</cash_fee>
<coupon_refund_count>0</coupon_refund_count>
<cash_refund_fee>1</cash_refund_fee>
</xml>


//退款查詢錯誤示例
<xml>
<appid><![CDATA[wxxxx]]></appid>
<err_code><![CDATA[REFUNDNOTEXIST]]></err_code>
<err_code_des><![CDATA[not exist]]></err_code_des>
<mch_id><![CDATA[xxx]]></mch_id>
<nonce_str><![CDATA[SG1IAYtK0apvnHpF]]></nonce_str>
<result_code><![CDATA[FAIL]]></result_code>
<return_code><![CDATA[SUCCESS]]></return_code>
<return_msg><![CDATA[OK]]></return_msg>
<sign><![CDATA[7323459E0DE45DBB8C87932C4C99BBF3]]></sign>
</xml>

//退款查詢

<xml>
<appid><![CDATA[wxxxx]]></appid>
<cash_fee><![CDATA[1]]></cash_fee>
<mch_id><![CDATA[xxx]]></mch_id>
<nonce_str><![CDATA[KptCSXZh1qBjK8wb]]></nonce_str>
<out_refund_no_0><![CDATA[1519535580802]]></out_refund_no_0>
<out_trade_no><![CDATA[1515845954891]]></out_trade_no>
<refund_account_0><![CDATA[REFUND_SOURCE_UNSETTLED_FUNDS]]></refund_account_0>
<refund_channel_0><![CDATA[ORIGINAL]]></refund_channel_0>
<refund_count>1</refund_count>
<refund_fee>1</refund_fee>
<refund_fee_0>1</refund_fee_0>
<refund_id_0><![CDATA[50000405502018022503594217469]]></refund_id_0>
<refund_recv_accout_0><![CDATA[支付使用者的零錢]]></refund_recv_accout_0>
<refund_status_0><![CDATA[SUCCESS]]></refund_status_0>
<refund_success_time_0><![CDATA[2018-02-25 13:13:03]]></refund_success_time_0>
<result_code><![CDATA[SUCCESS]]></result_code>
<return_code><![CDATA[SUCCESS]]></return_code>
<return_msg><![CDATA[OK]]></return_msg>
<sign><![CDATA[E8A30F02296C6169860A92C2D52AD5A8]]></sign>
<total_fee><![CDATA[1]]></total_fee>
<transaction_id><![CDATA[4200000100201801133414066940]]></transaction_id>
</xml>

如有疑問歡迎留言交流討論

相關推薦

支付原路退款

1.場景還原   最近專案要求上線微信支付原路退款功能,今天筆者就微信支付原路退款的流程梳理下,方便有需要的夥伴借閱2.準備工作①獲取微信支付的相關配置WECHATPAY_PARTNER = "150xxxxxxx"; //商戶號 WECHATPAY_PARTNERKEY =

支付退款

官方文件 應用場景 注意事項 下載證書 示例程式碼 官方文件 無論刷卡支付、微信公眾號支付、掃碼支付、H5支付、APP支付等都有申請退款API並且介面一樣,本篇文章就拿刷卡支付中的申請退款API文件舉例 應用場景 當交易發生

支付小程式支付

今天給大家介紹一下微信小程式是如果實現支付的流程,在開發之前我們首先要獲取到商戶的appId和mchId最後就是商戶的key值了。這些值在商戶申請成功之後都會通過郵件的形式傳送給商戶,所以如果還沒有拿到這些值的情況下,是不能夠進行微信支付的。上面的那些值全部拿到之後,我們就可

支付退款

ttpClient color url 參考文獻 secret 網站 ces 密鑰 將在   微信支付開發完之後,客戶提出新要求,要求有退款功能,好吧,完整的支付流程也包括退款,幹吧。o_o ....   當交易發生之後一段時間內,由於買家或者賣家的原因需要退款時,賣家可

支付h5方式(非內置瀏覽器中支付)

開放 奔騰 server 手機號 產品 etop 名稱 ota lds 這兩天完成了公司網站手機和PC端的支付對接,就是支付寶和微信. 對接完後有所感觸,我們來聊一聊,微信支付的坑,為什麽這麽說呢,因為我在對接完支付寶後是很愉快的,基本上在demo上稍加修改就ok了,

支付掃碼支付、公眾號支付、H5支付、小程序支付相關業務流程分析總結

doc bsp 說明 引入 red 內容 bubuko url參數 數據 前言 很久以來,一直想寫一篇微信支付有關的總結文檔;一方面是總結自己的一些心得,另一方面也可以幫助別人,但是因種種原因未能完全理解透徹微信支付的幾大支付方式,今天有幸做一些總結上的文章,也趁此機會,將

ThinkPHP整合支付發現金紅包

大家好,微信支付系列教程四種方式已經結束,如果你以為結束了就錯了,有同學跟我提到微信還有紅包功能,我開始也沒注意這一塊,於是看了下微信商戶平臺上有講到這一塊,微信支付平臺上也早就有了,於是趁熱打鐵,研究了下,繼續發出關於微信紅包的教程文章。接下來請看微信支付發紅包之現金紅包教程! 現在微信商戶

C# 支付公眾號支付

第一次接觸微信支付這塊, 把微信支付的sdk研究了很久,也 在網上找了很多的資料   記錄一下  防止哪天忘記。 微信支付步驟: 1,獲取code 2,獲取access_token 和使用者openID 3,查詢訂單詳情 4,初始化微信支付環境 6,提交充值資料 5

php 開發 支付 v3 配置

      公司需要微信支付現不到鎮的是非常的麻煩。然後呢那個要怎麼申請我就不寫了。因為不是我負責的所以我就記錄微信支付開發就好了。自己也記錄一下以後要開發好下手 。 1. 到這裡下載sdk        版本本V3 : http

ThinkPHP整合支付刷卡模式

大家好,這篇文章是繼微信支付之Native 掃碼支付 模式二之後的微信支付系列教程第四篇:微信刷卡支付 本教程跟前三篇教程不一樣,所需要的類庫也不一樣,所以做刷卡支付的時候,與之前的方法沒多少關係,大家注意一下。 下面開始介紹詳細步驟! step1:下載微信刷卡支

支付Native掃碼支付功能

作者:陳惠,叩丁狼教育高階講師。原創文章,轉載請註明出處。 上一篇微信支付文章:https://www.jianshu.com/p/9c322b1a5274 實現了微信公眾號內H5頁面進行支付的功能,但是這種方式的缺點就是必須在微信中開啟付款頁面才能實現,所以並不適合所有的場景。那

支付JSAPI支付

JSAPI支付 JSAPI支付是使用者在微信中開啟商戶的H5頁面,商戶在H5頁面通過呼叫微信支付提供的JSAPI介面調起微信支付模組完成支付 使用場景 使用者在微信公眾賬號(必須是服務號)內進入商家公眾號,開啟某個H5頁面,

php CI 支付擴充套件 掃碼支付 jssdk 支付 退款

微信支付API類庫來自:https://github.com/zhangv/wechat-pay 請先看一眼官方場景及支付時序圖:https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=6_5 官方API列表:h

ThinkPHP整合支付JSAPI模式

目前微信是很火的,微信支付目前很少在網上能看到一系列詳細的demo,因此,花一點時間來做一下關於微信支付系列教程,本次教程是JSAPI模式支付,其他的還會繼續寫下去 首先,下載微信支付的demo,我們根據微信上的demo來整合到TP中。 介紹下我們這裡需要用到的幾個檔案:

PHP支付掃碼支付

在手機微信端進行微信支付,直接調起JSAPI支付,這可以實現在微信裡邊的開的頁面進行支付,比如微商城,微信端JSAPI支付詳見:;但有時候商城還有PC端,需要在PC端使用微信支付,則需要PC端生成支付二維碼,然後微信掃碼完成支付。例如: 這裡主要講一下PC端掃碼支付以及退

支付-掃碼支付-模式2(模式1)

微信商戶申請開通:https://pay.weixin.qq.com/service_provider/index.shtml 注意:開通公眾賬號之後,然後根據流程開通相對應的商戶平臺 開發文件

支付公眾號發紅包和企業付款

微信現金紅包,是微信支付商戶平臺提供的營銷工具之一,上線以來深受廣大商戶與使用者的喜愛。商戶可以通過本平臺向微信支付使用者發放現金紅包。使用者領取紅包後,資金到達使用者微信支付零錢賬戶,在日常運營中為

5.支付統一下單

統一下單 除刷卡支付場景以外,商戶系統先呼叫該介面在微信支付服務後臺生成預支付交易單,返回正確的預支付交易回話標識後再按掃碼、JSAPI、APP等不同場景生成交易串調起支付。 統一下單時除了被掃支付之外的其他支付方式必須要進行的操作 使用場景 掃碼

支付JSAPI公眾號支付

前提 本教程預設以下幾點你已經完全滿足: 開通了認證後的服務號 服務號開通的微信支付的認證 騰訊給你的郵件中有商戶登入的賬號和密碼 擁有一個可供上傳程式碼和設定回撥域名的網站或雲服務 有一點點php知識。 第一步:公眾號設定 1、 你的公眾號,在支付認證的標籤下, 內容應該和下圖類似。證明公眾號已

(原創分享C# MVC)支付公眾號支付教程

前段時間在公司實習做了公眾號的微信支付及退款,期間參考了網上一大推資料,自己也遇到了一些坑,所以把這個教程寫下來方便後來人。 首先做微信支付你得先把微信官網的開發文件看一邊,網址:https://pay.weixin.qq.com/wiki/doc/api/j