支付寶退款全解析

簡單介紹了支付寶退款的請求處理和一些注意事項php

0 系列文章

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

支付寶退款主要3個步驟:數組

  1. 生成退款連接
  2. 打開退款連接,跳轉支付寶收銀臺,輸入密碼確認退款
  3. 異步接收退款結果通知

官方文檔和Demo微信

注:這個退款適用於即時到帳、手機網站、移動支付這三個支付渠道的退款異步

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;複製代碼

一些函數:post

/** * 把數組全部元素,按照「參數=參數值」的模式用「&」字符拼接成字符串 * @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 退款結果通知

驗證簽名能夠直接下載支付寶sdk例子,進行直接調用。
下載地址:doc.open.alipay.com/doc2/detail…
打開其中服務端Demo將裏面驗證通知部分取出來使用。網站

$$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複製代碼

結尾

更多文章關注個人公衆號
編碼

個人公衆號
個人公衆號
相關文章
相關標籤/搜索