微信退款全解析

Tsy遠發表於2017-09-22

簡單介紹了微信退款的請求處理和一些注意事項

0 系列文章

系列一 微信App支付全解析
系列二 支付寶App支付全解析
系列三 微信公眾號支付全解析
系列四 微信掃碼支付全解析
系列五 支付寶即時到賬支付全解析
系列六 微信退款全解析
系列七 支付寶退款全解析
系列八 支付寶開放平臺支付更新升級全解析

1 申請退款

官方介面文件

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

注意:

  1. 交易時間超過一年的訂單無法提交退款
  2. 微信支付退款支援單筆交易分多次退款,多次退款需要提交原支付訂單的商戶訂單號和設定不同的退款單號。一筆退款失敗後重新提交,要採用原來的退款單號。總退款金額不能超過使用者實際支付金額。

需要證照驗證。證照下載:
用於退款等一些需要證照驗證的介面使用。在微信商戶平臺點選「賬戶中心 - API 安全」,點選「下載證照」

Paste_Image.png
Paste_Image.png

證照下載後,開啟壓縮包會看到「apiclient_cert.pem」和「apiclient_key.pem」和rootca.pem證照。

$appid = "";  //你的appid
$mch_id = "";  //商戶id
$wx_api_key = "";    //商戶api祕鑰
$out_trade_no = "";  //待退款交易的業務交易號
$out_refund_no = "";  //業務生成的唯一退款單號
$total_fee = "1";    //待退款交易的總金額
$refund_fee = "1";  //退款金額 單位分

$REFUND_URL = "https://api.mch.weixin.qq.com/secapi/pay/refund";  //退款

$data = array();
$data['appid'] = $appid; 
$data['mch_id'] =$mch_id;
$data['nonce_str'] = randomStr(20);  //隨機20位字串
$data['out_trade_no'] = $out_trade_no;    
$data['out_refund_no'] = $out_refund_no;   
$data['total_fee'] = $total_fee;
$data['refund_fee'] = $refund_fee;
$data['op_user_id'] = mch_id;
$data['sign'] =sign($data, $wx_api_key);    //簽名

//轉為xml格式
$xml_str = arrayToXmlStr($data); 

//證照設定
$opt_arr = array(    
  CURLOPT_SSLCERT => "../" . $config['wx_pemcert'],      
  CURLOPT_SSLKEY => "../" . $config['wx_pemkey'],    
  CURLOPT_CAINFO => "../key/wx_rootca.pem");

//傳送請求 使用封裝好的curl_post
$result = Curl::curl_post($REFUND_URL, $xml_str, $opt_arr);

//解析得到的值
$get_data = simplexml_load_string($raw_data, 'SimpleXMLElement', LIBXML_NOCDATA);
$get_para = array();
$get_sign = "";
foreach ($get_data->children() as $child) 
{    
  if($child->getName() == 'sign') {        
    $get_sign = strval($child);    
  } else {        
    $get_para[strval($child->getName())] = strval($child);    
   }
}

if($get_para['return_code'] !== "SUCCESS") {
    //return code fail
}

//驗證簽名
if(!verifySign($get_sign, $get_para, $wx_api_key)) {
    //驗證簽名非法
}
//驗證result code
if($get_para['result_code'] !== 'SUCCESS') {
  //申請失敗
}

//退款申請成功
//todo複製程式碼

2 退款查詢

由於微信退款會根據支付渠道而到賬時間不同,所有微信本身不提供到賬回撥。
退款申請成功並不能代表到賬成功,所有業務方需要定時呼叫查詢退款狀態。
一般零錢和銀行卡支付的20分鐘內到賬,信用卡會2-3天到賬。

所以我設定的定時任務是分別在退款申請成功後的15s 2min 20min 1day 1day 2day 2day頻率進行退款查詢。

官方介面文件

$appid = "";  //你的appid
$mch_id = "";  //商戶id
$wx_api_key = "";    //商戶api祕鑰
$out_refund_no = "";  //待查詢的退款單號

$REFUND_QUERY_URL = "https://api.mch.weixin.qq.com/pay/refundquery";  //退款查詢

$data = array();
$data['appid'] = $appid; 
$data['mch_id'] =$mch_id;
$data['nonce_str'] = randomStr(20);  //隨機20位字串
$data['out_refund_no'] = $out_refund_no;   
$data['sign'] =sign($data, $wx_api_key);    //簽名

//轉為xml格式
$xml_str = arrayToXmlStr($data); 
//傳送請求 使用封裝好的curl_post
$result = Curl::curl_post($REFUND_QUERY_URL, $xml_str);

//解析得到的值
$get_data = simplexml_load_string($raw_data, 'SimpleXMLElement', LIBXML_NOCDATA);
$get_para = array();
$get_sign = "";
foreach ($get_data->children() as $child) 
{    
  if($child->getName() == 'sign') {        
    $get_sign = strval($child);    
  } else {        
    $get_para[strval($child->getName())] = strval($child);    
   }
}

if($get_para['return_code'] !== "SUCCESS") {
    //return code fail
}

//驗證簽名
if(!verifySign($get_sign, $get_para, $wx_api_key)) {
    //驗證簽名非法
}
//驗證result code
if($get_para['result_code'] !== 'SUCCESS') {
  //退款失敗記錄log
  //todo
}
//退款成功 修改退款狀態
//todo複製程式碼

結尾

更多文章關注我的公眾號

我的公眾號
我的公眾號

相關文章