Полный анализ возврата средств WeChat

WeChat

Краткое введение в обработку запросов на возврат средств WeChat и некоторые меры предосторожности

0 серия статей

первая серияПолный анализ платежей в приложении WeChat
вторая серияПолный анализ платежей в приложении Alipay
Серия третьяПолный анализ оплаты публичного аккаунта WeChat
Серия четвертаяПолный анализ оплаты скан-кода WeChat
Пятая серияПолный анализ мгновенных платежей Alipay
Шестая серияПолный анализ возврата средств WeChat
Седьмая серияПолный анализ возврата средств Alipay
Серия восьмаяОбновление платежной платформы Alipay и полный анализ обновлений

1 Запросить возврат

Официальная документация по интерфейсу

Когда требуется возврат средств из-за покупателя или продавца в течение периода времени после совершения транзакции, продавец может вернуть платеж покупателю через интерфейс возврата.После получения запроса на возврат средств и его успешной проверки WeChat Pay будет следовать метод возврата.Согласно правилам оплаты, платеж будет возвращен на счет покупателя в соответствии с первоначальным маршрутом.

Уведомление:

  1. Возврат не может быть отправлен для заказов старше одного года
  2. Возврат WeChat Pay поддерживает несколько возвратов за одну транзакцию.Для многократного возврата вам необходимо указать номер заказа продавца исходного платежного поручения и установить другой номер заказа возврата. Если возврат не удался и отправлен повторно, следует использовать исходный номер заказа на возврат. Общая сумма возврата не может превышать фактическую сумму, уплаченную пользователем.

Требуется проверка сертификата. Скачать сертификат:
Он используется для некоторых интерфейсов, требующих проверки сертификата, таких как возврат средств. Нажмите «Центр учетных записей — Безопасность API» на платформе WeChat Merchant и нажмите «Загрузить сертификат».

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 Запрос на возврат

Поскольку возвраты WeChat будут поступать в разное время в зависимости от канала оплаты, сам WeChat не предоставляет обратных вызовов.
Успешная заявка на возврат не означает, что учетная запись была успешно получена.Все деловые стороны должны регулярно звонить, чтобы проверить статус возврата.
Как правило, сдача и оплата банковской картой поступают в течение 20 минут, а кредитная карта – в течение 2-3 дней.

Поэтому запланированная задача, которую я поставил, состоит в том, чтобы выполнить запрос на возврат с частотой 15 секунд 2 минуты 20 минут 1 день 1 день 2 дня 2 дня 2 дня после успешного выполнения заявки на возврат.

Официальная документация по интерфейсу

$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

конец

Больше статей следите за моим публичным аккаунтом

我的公众号
мой публичный аккаунт