1. 程式人生 > 其它 >微信退款API的操作方法

微信退款API的操作方法

首先我們需要申請到商戶的key金鑰 這個是在

https://pay.weixin.qq.com/index.php/apply/applyment_home/guide_normal#none 微信官方連結

詳情請看https://www.cnblogs.com/wzsoul/p/15538319.html

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

注意:

1、交易時間超過一年的訂單無法提交退款

2、微信支付退款支援單筆交易分多次退款,多次退款需要提交原支付訂單的商戶訂單號和設定不同的退款單號。申請退款總金額不能超過訂單金額。 一筆退款失敗後重新提交,請不要更換退款單號,請使用原商戶退款單號

3、請求頻率限制:150qps,即每秒鐘正常的申請退款請求次數不超過150次 4、每個支付訂單的部分退款次數不能超過50次 5、如果同一個使用者有多筆退款,建議分不同批次進行退款,避免併發退款導致退款失敗 6、申請退款介面的返回僅代表業務的受理情況,具體退款是否成功,需要通過退款查詢介面獲取結果。 7、一個月之前的訂單申請退款頻率限制為:5000/min

介面地址

介面連結:https://api.mch.weixin.qq.com/secapi/pay/refund

我們退款的時候需要注意要準備證書使用,在支付的時候不是必要條件

需要證書

請求需要雙向證書。

一、超級管理員掃碼登入微信支付商戶平臺後,進入賬戶中心找到API安全;

點選申請證書,跳出生成API證書介面。點選“允許訪問”,同意網頁訪問剪下板;

三、下載證書工具,在證書工具中點選“申請證書”按鈕;

四、按照要求填寫商戶資訊,點選下一步;

五、複製請求串到剪下板,在之前的生成API證書介面貼上,輸入“簡訊驗證碼”和“登入密碼”;點選下一步,進入複製證書串介面。

六、複製證書串到剪下板,在證書工具的貼上證書串介面,點選貼上按鈕。然後進入下一步,生成證書。

七、生成證書之後,找到下載到電腦的證書檔案,改個好認的名字發給技術人員,記得保留一個備份。

技術人員獲得證書之後將證書部署到伺服器上。也就完成了微信支付與微信公眾號等平臺的對接了。

下面是請求時需要的參

欄位名變數名必填型別示例值描述
公眾賬號ID appid String(32) wx8888888888888888 微信分配的公眾賬號ID(企業號corpid即為此appid)
商戶號 mch_id String(32) 1900000109 微信支付分配的商戶號
隨機字串 nonce_str String(32) 5K8264ILTKCH16CQ2502SI8ZNMTM67VS 隨機字串,不長於32位。
簽名 sign String(32) C380BEC2BFD727A4B6845133519F3AD6 簽名,
簽名型別 sign_type String(32) HMAC-SHA256 簽名型別,目前支援HMAC-SHA256和MD5,預設為MD5
微信支付訂單號 transaction_id 二選一 String(32) 1217752501201407033233368018 微信生成的訂單號,在支付通知中有返回
商戶訂單號 out_trade_no String(32) 1217752501201407033233368018 商戶系統內部訂單號,要求32個字元內(最少6個字元),只能是數字、大小寫字母_-|*且在同一個商戶號下唯一。

transaction_id、out_trade_no二選一,如果同時存在優先順序:transaction_id>out_trade_no

商戶退款單號 out_refund_no String(64) 1217752501201407033233368018 商戶系統內部的退款單號,商戶系統內部唯一,只能是數字、大小寫字母_-|*@ ,同一退款單號多次請求只退一筆。
訂單金額 total_fee int 100 訂單總金額,單位為分,只能為整數
退款金額 refund_fee int 100 退款總金額,訂單總金額,單位為分,只能為整數,
退款貨幣種類 refund_fee_type String(8) CNY 退款貨幣型別,需與支付一致,或者不填。符合ISO4217標準的三位字母程式碼,預設人民幣:CNY,
退款原因 refund_desc String(80) 商品已售完

若商戶傳入,會在下發給使用者的退款訊息中體現退款原因

注意:若訂單退款金額≤1元,且屬於部分退款,則不會在退款訊息中體現退款原因

退款資金來源 refund_account String(30) REFUND_SOURCE_RECHARGE_FUNDS

僅針對老資金流商戶使用

REFUND_SOURCE_UNSETTLED_FUNDS---未結算資金退款(預設使用未結算資金退款)

REFUND_SOURCE_RECHARGE_FUNDS---可用餘額退款

退款結果通知url notify_url String(256) https://weixin.qq.com/notify/

非同步接收微信支付退款結果通知的回撥地址,通知URL必須為外網可訪問的url,不允許帶引數
公網域名必須為https,如果是走專線接入,使用專線NAT IP或者私有回撥域名可使用http

如果引數中傳了notify_url,則商戶平臺上配置的回撥地址將不會生效。

由於跟支付的時候呼叫的一樣 我們這裡只寫核心的轉換程式碼 詳情請看部落格的支付流程

微信需要的是xml格式的資料所以我們必須轉換為對應的格式

            $post_data = "<xml> 
                      <appid>".$appid."</appid> 
                      <body>".$body."</body> 
                      <mch_id>".$mch_id."</mch_id> 
                      <nonce_str>".$nonce_str."</nonce_str> 
                      <notify_url>".$notify_url."</notify_url> 
                      <out_trade_no>".$out_trade_no."</out_trade_no> 
                      <spbill_create_ip>".$spbill_create_ip."</spbill_create_ip> 
                      <total_fee>".$total_fee."</total_fee> 
                      <trade_type>".$trade_type."</trade_type> 
                      <sign>".$sign."</sign> 
                     </xml>";//拼接成XML 格式 
                
                // <scene_info>$scene_info</scene_info> 
                // 微信地址
                $url = 'https://api.mch.weixin.qq.com/pay/unifiedorder';
                $dataxml=$this->posturl($url,$post_data);
                $reruxml = (array)simplexml_load_string($dataxml, 'SimpleXMLElement', LIBXML_NOCDATA); 
          //請求接收回來的資料轉換為陣列的格式

XML 轉陣列

    //回撥資訊
    public function wxhd(){
        
        //允許從外部載入XML實體(防止XML注入攻擊)
        libxml_disable_entity_loader(true);  
        // 用於接收所有的資料
        $data=file_get_contents("php://input");
        
        $postObj = (array)simplexml_load_string($data, 'SimpleXMLElement', LIBXML_NOCDATA);  
        //此處 用於變更訂單的支付狀態 或者其他操作
        
        // 下面更新成功的變數(更新資料表) 最後一個 更新欄位後
        //此處用於返回給微信支付通知,我們也做出相應的修改
        if(){
            echo '<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>';
        }    
        
    }