支付寶App支付全解析

簡單介紹了支付寶App支付的申請、接入、使用、確認支付結果等相關流程php

0 系列文章

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

1 申請

登陸支付寶商家服務,進入移動支付。簽約。ios

簽約經過後,一共須要如下參數能夠完成支付:git

  1. partnerid
  2. sellerid
  3. rsa私鑰
  4. 支付寶公鑰

1.1 partnerid

商戶合做者身份。github

進入個人商家服務
獲取pid數組

Paste_Image.png
Paste_Image.png

注:支付寶還有一個開放平臺,每一個應用一個appid,一個pid能夠有多個appid,可是移動支付、即時到帳收款、手機網站支付這三種支付渠道屬於只須要pid便可支付的支付方式,不須要申請應用微信

1.2 sellerid

登陸支付寶帳戶,通常爲郵箱或者手機號app

1.3 rsa私鑰和支付寶公鑰

rsa私鑰公鑰是本身生成,而後將公鑰上傳支付寶,私鑰本身保存。異步

詳見官網文檔函數

Paste_Image.png
Paste_Image.png

2 接入流程

參考支付寶移動支付接入文檔

主要幾個步驟:

  1. 生成支付參數(放在服務端,須要生成簽名)
  2. 調用客戶端SDK發起支付
  3. 服務端異步接收支付結果

2.1 生成支付參數

$partner = "";  //你的pid
$seller_id = "";  //seller_id
$subject = "支付寶移動支付測試";  //交易主題
$body = "支付寶移動支付測試detail";  //交易詳細說明
$total_fee = "0.01";    //支付金額 單位是元
$out_trade_no = "";  //本身業務系統生成的交易no,能夠惟一標識
$rsa_path = "";  //rsa私鑰路徑
$notify_url = "";    //接收支付結果通知url

$data = array();
$data['service'] = "mobile.securitypay.pay"; 
$data['partner'] =$partner;
$data['_input_charset'] = "utf-8";
$data['notify_url'] = $notify_url;
$data['out_trade_no'] = $out_trade_no;    
$data['subject'] = $subject;
$data['payment_type'] = "1";
$data['seller_id'] = seller_id;
$data['total_fee'] = $total_fee;
$data['body'] = $body;

//簽名
$unsign_str =createLinkString(argSort($data));
$sign =rsaSign($unsign_str, $rsa_path);
$sign = urlencode(mb_convert_encoding($sign, "UTF-8"));  //須要進行utf8格式轉換

$pay_params = $unsign_str . "&sign=" . $sign . "&sign_type=RSA";複製代碼

一些函數:

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

/** * 數組排序 按照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;
}複製代碼

3. 調用支付

3.1 Android

能夠直接參考調用我二次封裝過的Android SDK。將生成的pay_param直接傳入支付寶支付便可發起支付。
Github地址:github.com/tsy12321/Pa…

3.2 iOS

二次封裝過的iOS SDK。
Github地址:github.com/tsy12321/Pa…

4 異步結果通知

注:尤爲要注意通知結果驗證成功後要能正確處理重複通知,放置屢次發貨形成資金損失

驗證簽名能夠直接下載支付寶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");

if($_POST['trade_status'] !== "TRADE_SUCCESS" && $_POST['trade_status'] !== "TRADE_FINISHED") {    
  if($_POST['trade_status'] === "WAIT_BUYER_PAY") {                    
    //wait bueyer pay通知能夠忽略 
    die("success");    
  } else if($_POST['trade_status'] === "TRADE_CLOSED" && $_POST['refund_status'] === "REFUND_SUCCESS") {   //全額退款也是成功 
    //當退款成功時 可能會觸發通知closed的通知,也能夠算做成功支付
  } else {    //支付失敗 
    //支付失敗處理 todo
  }
}

//支付成功處理 發貨
//todo複製代碼

5 其餘

  1. 客戶端收到同步支付結果後建議一段時間內輪詢檢查服務端,獲取服務端的結果,支付最終狀態以服務端爲準

結尾

更多文章關注個人公衆號

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