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

Alipay

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

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

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

Есть 3 основных шага для возврата Alipay:

  1. Создать ссылку для возврата
  2. Откройте ссылку возврата, перейдите в кассир Alipay, введите пароль для подтверждения возврата
  3. Получать уведомления о результатах возврата асинхронно

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

Примечание. Этот возврат применим к возмещению трех каналов оплаты: мгновенной учетной записи, мобильного веб-сайта и мобильного платежа.

1 Создайте ссылку для возврата

Этот интерфейс поддерживает пакетные возвраты. Операция может быть возвращена несколько раз, и максимальное количество возвратов не может превышать 99 раз. Общая сумма нескольких возвратов не должна превышать сумму платежа по транзакции.

$partner = "";  //你的pid
$seller_id = "";  //seller_id
$rsa_path = "";  //rsa私钥路径
$notify_url = "";    //接收退款结果通知url
$batch_no = "";  //注意要遵循接口batchno格式
$batch_detail = "";    //批量拼接字符串,详细格式见文档

$MAPI_GATEWAY = "https://mapi.alipay.com/gateway.do";    //mapi 入口 路由

$data = array();
$data['service'] = "refund_fastpay_by_platform_pwd"; 
$data['partner'] =$partner;
$data['_input_charset'] = "utf-8";
$data['notify_url'] = $notify_url;
$data['seller_email'] = $seller_id;    
$data['refund_date'] = date('Y-m-d H:i:s');
$data['batch_no'] = $batch_no;
$data['batch_detail'] = batch_detail;

//签名
$unsign_str =createLinkString(argSort($data));
$sign =rsaSign($unsign_str, $rsa_path);

$params = createLinkstringUrlencode($data);

$url = $MAPI_GATEWAY . '?' . $params;

Некоторые функции:

/**
 * 把数组所有元素,按照“参数=参数值”的模式用“&”字符拼接成字符串
 * @param $para mixed 需要拼接的数组
 * @return string 拼接完成以后的字符串
 */
public static function createLinkString($para) {    
  $arg  = "";    
  while (list ($key, $val) = each ($para)) {        
    if($val == "") {            
      continue;        
    }        
    $arg.=$key."=".$val."&";    
  }    
  //去掉最后一个&字符    
  $arg = substr($arg,0,count($arg)-2);    
  //如果存在转义字符,那么去掉转义    
  if(get_magic_quotes_gpc()){
    $arg = stripslashes($arg);
  }    
  return $arg;
  }

/**
 * 把数组所有元素,按照“参数=参数值”的模式用“&”字符拼接成字符串 并对字符串做urlencode编码
 * @param $para mixed 需要拼接的数组
 * @return string 拼接完成以后的字符串
 */
public static function createLinkstringUrlencode($para) {    
  $arg  = "";    
  while (list ($key, $val) = each ($para)) {        
    if($val == "") {            
      continue;        
    }        
    $arg.=$key."=".urlencode($val)."&";
  }    
  //去掉最后一个&字符    
  $arg = substr($arg,0,count($arg)-2);    
  //如果存在转义字符,那么去掉转义    
  if(get_magic_quotes_gpc()){
    $arg = stripslashes($arg);
  }    
  return $arg;
  }

/**
 * 数组排序 按照ASCII字典升序
 * @param $para mixed 排序前数组
 * @return mixed 排序后数组
 */
public static function argSort($para) {    
  ksort($para);    
  reset($para);    
  return $para;
}

/**
 * RSA签名
 * @param $data string 待签名数据
 * @param $private_rsa_path string 用户私钥地址
 * @return mixed
 *      失败:false
 *      成功:签名结果
 */
public static function rsaSign($data, $private_rsa_path) {    
  $private_rsa = file_get_contents($private_rsa_path);    
  $res = openssl_get_privatekey($private_rsa);    
  if(!$res) {        
    return false;    
  }    
  openssl_sign($data, $sign, $res);    
  openssl_free_key($res);    
  //base64编码    
  $sign = base64_encode($sign);    
  return $sign;
}

2 Уведомление о возврате

Чтобы проверить подпись, вы можете напрямую загрузить пример Alipay sdk и сделать прямой вызов.
ссылка для скачивания:doc.open.Ali боится иметь.com/doc2/detail…
Откройте демонстрационную версию на стороне сервера и извлеките часть уведомления о проверке для использования.

?alipay_partnerid = "";  //你的pid
?alipay_public_key_path = "";  //支付宝公钥路径

$alipayNotify = new AlipayNotify($alipay_partnerid, $alipay_public_key_path);
$verify_result = $alipayNotify->verifyNotify();
if(!$verify_result) {    
  //签名验证失败 todo 
  die("fail");
}

//成功接收并验证了通知
echo("success");

//解析result_details里面每笔退款的状态,然后更新退款状态
//todo
}

//支付成功处理 发货
//todo

конец

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

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