微信退款API的操作方法


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

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

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

 

賬號關聯(AppID綁定)

https://pay.weixin.qq.com/static/pay_setting/appid_protocol.shtml  

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

注意:

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 退款貨幣類型,需與支付一致,或者不填。符合ISO 4217標准的三位字母代碼,默認人民幣: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>';
        }    
        
    }
     

 

 

 

function posturl($data, $url){
            $ch = curl_init();
            //指定URL
            curl_setopt($ch, CURLOPT_URL, $url);
            //設定請求后返回結果
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
            //聲明使用POST方式來進行發送
            curl_setopt($ch, CURLOPT_POST, 1);
            //發送什么數據呢
            curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
            //忽略證書
            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
            curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
            //if($is_pem == 1){
                curl_setopt($ch,CURLOPT_SSLCERTTYPE,'PEM'); //sslCertType
                curl_setopt($ch,CURLOPT_SSLCERT,'../key/wxpay/apiclient_cert.pem');//證書路徑
                curl_setopt($ch,CURLOPT_SSLKEYTYPE,'PEM');  //sslKeyType
                curl_setopt($ch,CURLOPT_SSLKEY,'../key/wxpay/apiclient_key.pem');//證書路徑
           // }
            //忽略header頭信息
            curl_setopt($ch, CURLOPT_HEADER, 0);
            //設置超時時間
            curl_setopt($ch, CURLOPT_TIMEOUT, 10);
            //發送請求
            $output = curl_exec($ch);
            //關閉curl
            curl_close($ch);
            //返回數據
            return $output;
        }

 上面If里面可以填寫 證書路徑地址 附帶的文件 可以以不用IF 直接


免責聲明!

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



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