1. 程式人生 > >支付寶支付--即時到賬 開發總結

支付寶支付--即時到賬 開發總結

轉載:LazyCat_Ky 的部落格 http://www.cnblogs.com/LzayCat/p/5539095.html

在支付寶支付的開發過程中,通過自己的理解和嘗試做出一點流程總結記錄:

 

一.前往 https://doc.open.alipay.com/doc2/alipayDocIndex.htm 支付寶開放平臺 點選業務接入-》即時到賬 ,即可下載 即時到賬DEMO。DEMO中包含 兩種簽名版本(MD5、RSA) 三種程式語言(CSHARP、JAVA、PHP) 兩種編碼格式(GBK、UTF-8),我選擇是MD5簽名下的PHP語言UTF-8編碼。

  如果專案擁有SSL加密協議,也就是HTTPS安全通道,可以使用rsa簽名的方式進行開發。

 

二.先配置 alipay.config.php 檔案:

複製程式碼

 1 //↓↓↓↓↓↓↓↓↓↓請在這裡配置您的基本資訊↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
 2 //合作身份者ID,簽約賬號,以2088開頭由16位純數字組成的字串,檢視地址:https://b.alipay.com/order/pidAndKey.htm
 3 $alipay_config['partner']        = '';
 4 //收款支付寶賬號,以2088開頭由16位純數字組成的字串,一般情況下收款賬號就是簽約賬號
 5 $alipay_config['seller_id']    = $alipay_config['partner'];
 6 //或者$alipay_config['seller_email']或者$alipay_config['seller_account_name']    
 7 // MD5金鑰,安全檢驗碼,由數字和字母組成的32位字串,檢視地址:https://b.alipay.com/order/pidAndKey.htm
 8 $alipay_config['key']            = '';
 9 // 伺服器非同步通知頁面路徑  需http://格式的完整路徑,不能加?id=123這類自定義引數,必須外網可以正常訪問
10 $alipay_config['notify_url'] = "http://商戶網址/create_direct_pay_by_user-PHP-UTF-8/notify_url.php";
11 // 頁面跳轉同步通知頁面路徑 需http://格式的完整路徑,不能加?id=123這類自定義引數,必須外網可以正常訪問
12 $alipay_config['return_url'] = "http://商戶網址/create_direct_pay_by_user-PHP-UTF-8/return_url.php";
13 //簽名方式
14 $alipay_config['sign_type']    = strtoupper('MD5');
15 //字元編碼格式 目前支援 gbk 或 utf-8
16 $alipay_config['input_charset']= strtolower('utf-8');
17 //ca證書路徑地址,用於curl中ssl校驗
18 //請保證cacert.pem檔案在當前資料夾目錄中
19 $alipay_config['cacert']    = getcwd().'\\cacert.pem';
20 //訪問模式,根據自己的伺服器是否支援ssl訪問,若支援請選擇https;若不支援請選擇http
21 $alipay_config['transport']    = 'http';
22 // 支付型別 ,無需修改
23 $alipay_config['payment_type'] = "1";
24 // 產品型別,無需修改
25 $alipay_config['service'] = "create_direct_pay_by_user";
26 //↑↑↑↑↑↑↑↑↑↑請在這裡配置您的基本資訊↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
27 //↓↓↓↓↓↓↓↓↓↓ 請在這裡配置防釣魚資訊,如果沒開通防釣魚功能,為空即可 ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
28 // 防釣魚時間戳  若要使用請呼叫類檔案submit中的query_timestamp函式
29 $alipay_config['anti_phishing_key'] = "";
30     
31 // 客戶端的IP地址 非區域網的外網IP地址,如:221.0.0.1
32 $alipay_config['exter_invoke_ip'] = "";
33 //↑↑↑↑↑↑↑↑↑↑請在這裡配置防釣魚資訊,如果沒開通防釣魚功能,為空即可 ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑

複製程式碼

 

官方demo註解已經寫得很詳細了,值得至於的問題  $alipay_config['partner']  $alipay_config['key']  $alipay_config['seller_id/seller_email/seller_account_name'](該引數三選一 賣家的支付寶使用者號/賬號/賬號別名) 這三個引數是由支付寶開發平臺提供的。

而 $alipay_config['notify_url'] $alipay_config['return_url'] 引數 由開發者設定,設定時必須保證外網可以訪問到的地址且不可以帶?id=123自定義引數

  'notify_url' 非同步通知地址 : 這個地址是使用者支付完成後,支付寶非同步回撥的地址,開發者必須在該地址下的PHP檔案進行支付成功後業務邏輯處理。

  'return_url' 同步通知地址: 這個地址是使用者支付完成後,支付寶同步跳轉的地址,開發者在該地址下的PHP檔案處理支付寶支付成功的頁面顯示。

 

 

 

三.配置完成後 在需要需要支付的php檔案中載入 require_once "/lib/alipay_submit.class.php";  和 在支付的類裡 載入 require_once PAYPATH."/alipay.config.php";

 

四.例項化 AlipaySubmit 類 傳入引數陣列  引數列表:

基本引數

service

介面名稱

String

介面名稱。

不可空

create_direct_pay_by_user

partner

合作者身份ID

String(16)

簽約的支付寶賬號對應的支付寶唯一使用者號。

以2088開頭的16位純數字組成。

不可空

2088101011913539

_input_charset

引數編碼字符集

String

商戶網站使用的編碼格式,如utf-8、gbk、gb2312等。

不可空

gbk

sign_type

簽名方式

String

DSA、RSA、MD5三個值可選,必須大寫。

不可空

MD5

sign

簽名

String

請參見簽名

不可空

7d314d22efba4f336fb187697793b9d2

notify_url

伺服器非同步通知頁面路徑

String(190)

支付寶伺服器主動通知商戶網站裡指定的頁面http路徑。

可空

http://api.test.alipay.net/atinterface/receive_return.htm

return_url

頁面跳轉同步通知頁面路徑

String(200)

支付寶處理完請求後,當前頁面自動跳轉到商戶網站裡指定頁面的http路徑。

可空

http://api.test.alipay.net/atinterface/receive_return.htm

業務引數

out_trade_no

商戶網站唯一訂單號

String(64)

支付寶合作商戶網站唯一訂單號。

不可空

6843192280647118

subject

商品名稱

String(256)

商品的標題/交易標題/訂單標題/訂單關鍵字等。

該引數最長為128個漢字。

不可空

貝爾金護腕式

payment_type

支付型別

String(4)

只支援取值為1(商品購買)。

不可空

1

total_fee

交易金額

Number

該筆訂單的資金總額,單位為RMB-Yuan。取值範圍為[0.01,100000000.00],精確到小數點後兩位。

不可空

100

seller_id

賣家支付寶使用者號

String(16)

  • seller_id是以2088開頭的純16位數字。
  • seller_email是支付寶登入賬號,格式一般是郵箱或手機號。
  • seller_account_name是賣家支付寶賬號別名。

三個引數至少必須傳遞一個。

當簽約賬號就是收款賬號時,請務必使用引數seller_id,即seller_id的值與partner的值相同。

三個引數的優先級別是:seller_id>seller_account_name>seller_email。

不可空

2088002007018966

seller_email

賣家支付寶賬號

String(100)

[email protected]

seller_account_name

賣家支付寶賬號別名

String(100)

[email protected]

buyer_id

買家支付寶使用者號

String(16)

  • buyer_id是以2088開頭的純16位數字。
  • buyer_email是支付寶登入賬號,格式一般是郵箱或手機號。
  • buyer_account_name是買家支付寶賬號別名。

三個引數的優先級別是:buyer_id>buyer_account_name>buyer_email。

可空

2088002007018955

buyer_email

買家支付寶賬號

String(100)

[email protected]

buyer_account_name

買家支付寶賬號別名

String(100)

[email protected]

price

商品單價

Number

單位為:RMB Yuan。取值範圍為[0.01,100000000.00],精確到小數點後兩位。此引數為單價

規則:price、quantity能代替total_fee。即存在total_fee,就不能存在price和quantity;存在price、quantity,就不能存在total_fee。

可空

10.00

quantity

購買數量

Number

price、quantity能代替total_fee。即存在total_fee,就不能存在price和quantity;存在price、quantity,就不能存在total_fee。

可空

1

body

商品描述

String(1000)

對一筆交易的具體描述資訊。如果是多種商品,請將商品描述字串累加傳給body。

可空

美國專業護腕滑鼠墊,舒緩式凝膠軟墊模擬手腕的自然曲線和運動,創造和緩的GelFlex舒適地帶!

show_url

商品展示網址

String(400)

收銀臺頁面上,商品展示的超連結。

可空

http://www.360buy.com/product/113714.html

paymethod

預設支付方式

String

取值範圍:

  • creditPay(信用支付)
  • directPay(餘額支付)

如果不設定,預設識別為餘額支付。

說明:

必須注意區分大小寫。

可空

directPay

enable_paymethod

支付渠道

String

用於控制收銀臺支付渠道顯示,該值的取值範圍請參見支付渠道

可支援多種支付渠道顯示,以“^”分隔。

可空

directPay^bankPay^cartoon^cash

anti_phishing_key

防釣魚時間戳

String

通過時間戳查詢介面獲取的加密支付寶系統時間戳。

如果已申請開通防釣魚時間戳驗證,則此欄位必填。

可空

587FE3D2858E6B01E30104656E7805E2

exter_invoke_ip

客戶端IP

String(15)

使用者在建立交易時,該使用者當前所使用機器的IP。

如果商戶申請後臺開通防釣魚IP地址檢查選項,此欄位必填,校驗用。

可空

128.214.222.111

extra_common_param

公用回傳引數

String(100)

如果使用者請求時傳遞了該引數,則返回給商戶時會回傳該引數。

可空

你好,這是測試商戶的廣告。

it_b_pay

超時時間

String

設定未付款交易的超時時間,一旦超時,該筆交易就會自動被關閉。

取值範圍:1m~15d。

m-分鐘,h-小時,d-天,1c-當天(1c-當天的情況下,無論交易何時建立,都在0點關閉)。

該引數數值不接受小數點,如1.5h,可轉換為90m。

可空

1h

token

快捷登入授權令牌

String(40)

如果開通了快捷登入產品,則需要填寫;如果沒有開通,則為空。

可空

201103290c9f9f2c03db4267a4c8e1bfe3adfd52

qr_pay_mode

掃碼支付方式

String(1)

掃碼支付的方式,支援前置模式和跳轉模式。

前置模式是將二維碼前置到商戶的訂單確認頁的模式。需要商戶在自己的頁面中以iframe方式請求支付寶頁面。具體分為以下3種:

  • 0:訂單碼-簡約前置模式,對應iframe寬度不能小於600px,高度不能小於300px;
  • 1:訂單碼-前置模式,對應iframe寬度不能小於300px,高度不能小於600px;
  • 3:訂單碼-迷你前置模式,對應iframe寬度不能小於75px,高度不能小於75px。
  • 4:訂單碼-可定義寬度的嵌入式二維碼,商戶可根據需要設定二維碼的大小。

跳轉模式下,使用者的掃碼介面是由支付寶生成的,不在商戶的域名下。

  • 2:訂單碼-跳轉模式

可空

1

qrcode_width

商戶自定二維碼寬度

Integer

商戶自定義的二維碼寬度。

當qr_pay_mode=4時,該引數生效。

可空 200

need_buyer_realnamed

是否需要買家實名認證

String(2)

是否需要買家實名認證。

  • T表示需要買家實名認證;
  • 不傳或者傳其它值表示不需要買家實名認證。
可空  T

promo_param

商戶優惠活動引數

String(128)

商戶與支付寶約定的營銷透傳引數。

可空 {"customer201412":"Y","goods201412":"Y"}

hb_fq_param

花唄分期引數

String

引數格式:hb_fq_seller_percent ^賣家承擔付費比例|hb_fq_num ^期數。

  • hb_fq_num:花唄分期數,比如分3期支付;
  • hb_fq_seller_percent:賣家承擔收費比例,比如50代表賣家承擔50%。

兩個引數必須一起傳入。

兩個引數用“|”間隔。Key和value之間用“^”間隔。

具體花唄分期期數和賣家承擔收費比例可傳入的數值請諮詢支付寶。

可空 hb_fq_seller_percent^50|hb_fq_num^3

goods_type

商品型別

String(2)

商品型別:

  • 1表示實物類商品
  • 0表示虛擬類商品

如果不傳,預設為實物類商品。

可空 1

 

從官網給出的引數列表可以知道必須的引數有10個,

其中 service、partner、_input_charset、seller_id、payment_type、sign_type、sign 都可以通過 alipay.config.php 配置檔案獲取, 此外還必須傳入out_trade_no、subject、total_fee。

 

五. 呼叫 AlipaySubmit 類中的 buildRequestForm 方法 傳入陣列引數、提交方式(post) 和 提交按鈕。

複製程式碼

 1 $parameter = array(
 2                 "service"               => trim($alipay_config['service']),
 3                 "partner"               => trim($alipay_config['partner']),
 4                 "seller_email"          => trim($alipay_config['seller_email']),
 5                 "payment_type"          => trim($alipay_config['payment_type']),
 6                 "notify_url"            => $notify_url,//非同步回撥
 7                 "return_url"            => $return_url,//同步回撥
 8                 "out_trade_no"          => $ordernum,//訂單號
 9                 "subject"               => $subject,
10                 "total_fee"             => $total_fee,
11                 "body"                  => $body,
12                 "show_url"              => $show_url,
13                 "anti_phishing_key"     => $anti_phishing_key,
14                 "exter_invoke_ip"       => $exter_invoke_ip,
15                 "extra_common_param"    => $extra_common_param,
16                 "_input_charset"        => trim(strtolower($alipay_config['input_charset']))                
17             );
18             //建立請求
19             $alipaySubmit = new AlipaySubmit($alipay_config);
20             $html_text = $alipaySubmit->buildRequestForm($parameter,"post", "");
21             echo $html_text;

複製程式碼

 

六.  支付寶提交引數進行支付時獲取簽名的流程(sign_type、sign不參加簽名)並以表單方式傳送請求:

  1.先呼叫buildRequestPara($para_temp)方法 將傳入的引數進行處理(排序簽名);

  2.paraFilter($para_temp)方法是對陣列中的空值和簽名引數(sign_type、sign)進行排除;

  3.argSort($para_filter)方法是對陣列進行排序;

  4.$this->buildRequestMysign($para_sort)方法是將陣列進行簽名(把陣列所有元素,按照“引數=引數值”的模式用“&”字元拼接成字串);

  5.在buildRequestMysign方法中陣列引數和配置檔案(alipay.config.php)中key引數進行MD5加密返回簽名字串;

  6.最後將簽名字串和簽名型別也加入請求陣列引數中;

  7.將請求引數進行迴圈組裝成表單彈出新頁面自動提交表單。

  

複製程式碼

 1 $sHtml = "<form id='alipaysubmit' name='alipaysubmit' action='".$this->alipay_gateway_new."_input_charset=".trim(strtolower($this->alipay_config['input_charset']))."' method='".$method."'>";
 2         while (list ($key, $val) = each ($para)) {
 3             $sHtml.= "<input type='hidden' name='".$key."' value='".$val."'/>";
 4         }
 5 
 6         //submit按鈕控制元件請不要含有name屬性
 7         $sHtml = $sHtml."<input type='submit' value='".$button_name."'></form>";
 8         
 9         $sHtml = $sHtml."<script>document.forms['alipaysubmit'].submit();</script>";
10         
11         return $sHtml;

複製程式碼

 

七.支付成功後的回撥 (回撥頁面已經傳給支付寶伺服器,支付寶伺服器會在支付完成後對支付回撥頁面進行請求並傳回支付引數)

  1.頁面同步回傳的引數(通知地址:'return_url')

引數 引數名稱 型別(位元組長度) 引數說明 是否可為空 樣例
is_success 成功標識 String(1) 表示介面呼叫是否成功,並不表明業務處理結果。 不可空 T
sign_type 簽名方式 String DSA、RSA、MD5三個值可選,必須大寫。 不可空 MD5
sign 簽名 String(32) 請參見簽名驗證 不可空 b1af584504b8e845ebe40b8e0e733729
out_trade_no 商戶網站唯一訂單號 String(64) 對應商戶網站的訂單系統中的唯一訂單號,非支付寶交易號。需保證在商戶網站中的唯一性。是請求時對應的引數,原樣返回。 可空 6402757654153618
subject 商品名稱 String(256) 商品的標題/交易標題/訂單標題/訂單關鍵字等。 可空 手套
payment_type 支付型別 String(4) 只支援取值為1(商品購買)。 可空 1
exterface 介面名稱 String 標誌呼叫哪個介面返回的連結。 可空 create_direct_pay_by_user
trade_no 支付寶交易號 String(64) 該交易在支付寶系統中的交易流水號。最長64位。 可空 2014040311001004370000361525
trade_status 交易狀態 String 交易目前所處的狀態。成功狀態的值只有兩個:
TRADE_FINISHED(普通即時到賬的交易成功狀態);
TRADE_SUCCESS(開通了高階即時到賬或機票分銷產品後的交易成功狀態)
可空 TRADE_FINISHED
notify_id 通知校驗ID String 支付寶通知校驗ID,商戶可以用這個流水號詢問支付寶該條通知的合法性。 可空 RqPnCoPT3K9%2Fvwbh3I%2BODmZS9o4qChHwPWbaS7UMBJpUnBJlzg42y9A8gQlzU6m3fOhG
notify_time 通知時間 Date 通知時間(支付寶時間)。格式為yyyy-MM-dd HH:mm:ss。 可空 2008-10-23 13:17:39
notify_type 通知型別 String 返回通知型別。 可空 trade_status_sync
seller_email 賣家支付寶賬號 String(100) 賣家支付寶賬號,可以是Email或手機號碼。 可空 [email protected]
buyer_email 買家支付寶賬號 String(100) 買家支付寶賬號,可以是Email或手機號碼。 可空 [email protected]
seller_id 賣家支付寶賬戶號 String(30) 賣家支付寶賬號對應的支付寶唯一使用者號。以2088開頭的純16位數字。 可空 2088002007018916
buyer_id 買家支付寶賬戶號 String(30) 買家支付寶賬號對應的支付寶唯一使用者號。以2088開頭的純16位數字。 可空 2088101000082594
total_fee 交易金額 Number 該筆訂單的資金總額,單位為RMB-Yuan。取值範圍為[0.01,100000000.00],精確到小數點後兩位。 可空 10.00
body 商品描述 String(1000) 對一筆交易的具體描述資訊。如果是多種商品,請將商品描述字串累加傳給body。 可空 Hello
extra_common_param 公用回傳引數 String 用於商戶回傳引數,該值不能包含“=”、“&”等特殊字元。如果使用者請求時傳遞了該引數,則返回給商戶時會回傳該引數。 可空 你好,這是測試商戶的廣告。

  根據 trade_status 的狀態可以知道訂單的支付狀態可以進行對支付成功後的業務邏輯處理。注意 通過GET獲取引數。

if($_GET['trade_status'] == 'TRADE_FINISHED' || $_GET['trade_status'] == 'TRADE_SUCCESS') {
//不管普通或者高階 都執行此處
//判斷該筆訂單是否在商戶網站中已經做過處理
//如果沒有做過處理,根據訂單號(out_trade_no)在商戶網站的訂單系統中查到該筆訂單的詳細,並執行商戶的業務程式
//如果有做過處理,不執行商戶的業務程式
}

  因為訂單有可能已經通過非同步進行處理了,所以需要先進行判斷訂單是否已經處理,如果處理就不再處理直接展示成功頁面,如果未處理就處理業務後展示成功頁面。

 

 

  2.頁面非同步回傳的引數(通知地址:'notify_url')

引數 引數名稱 型別(位元組長度) 引數說明 是否可為空 樣例
notify_time 通知時間 Date 通知的傳送時間。格式為yyyy-MM-dd HH:mm:ss。 不可空 2009-08-12 11:08:32
notify_type 通知型別 String 通知的型別。 不可空 trade_status_sync
notify_id 通知校驗ID String 通知校驗ID。 不可空 70fec0c2730b27528665af4517c27b95
sign_type 簽名方式 String DSA、RSA、MD5三個值可選,必須大寫。 不可空 DSA
sign 簽名 String 請參見簽名驗證 不可空 _p_w_l_h_j0b_gd_aejia7n_ko4_m%2Fu_w_jd3_nx_s_k_mxus9_hoxg_y_r_lunli_pmma29_t_q%3D
out_trade_no 商戶網站唯一訂單號 String(64) 對應商戶網站的訂單系統中的唯一訂單號,非支付寶交易號。需保證在商戶網站中的唯一性。是請求時對應的引數,原樣返回。 可空 3618810634349901
subject 商品名稱 String(256) 商品的標題/交易標題/訂單標題/訂單關鍵字等。它在支付寶的交易明細中排在第一列,對於財務對賬尤為重要。是請求時對應的引數,原樣通知回來。 可空 phone手機
payment_type 支付型別 String(4) 只支援取值為1(商品購買)。 可空 1
trade_no 支付寶交易號 String(64) 該交易在支付寶系統中的交易流水號。最長64位。 可空 2014040311001004370000361525
trade_status 交易狀態 String 取值範圍請參見交易狀態 可空 TRADE_FINISHED
gmt_create 交易建立時間 Date 該筆交易建立的時間。格式為yyyy-MM-dd HH:mm:ss。 可空 2008-10-22 20:49:31
gmt_payment 交易付款時間 Date 該筆交易的買家付款時間。格式為yyyy-MM-dd HH:mm:ss。 可空 2008-10-22 20:49:50
gmt_close 交易關閉時間 Date 交易關閉時間。格式為yyyy-MM-dd HH:mm:ss。 可空 2008-10-22 20:49:46
refund_status 退款狀態 String 取值範圍請參見退款狀態 可空 REFUND_SUCCESS
gmt_refund 退款時間 Date 賣家退款的時間,退款通知時會發送。格式為yyyy-MM-dd HH:mm:ss。 可空 2008-10-29 19:38:25
seller_email 賣家支付寶賬號 String(100) 賣家支付寶賬號,可以是email和手機號碼。 可空 [email protected]
buyer_email 買家支付寶賬號 String(100) 買家支付寶賬號,可以是Email或手機號碼。 可空 13758698870
seller_id 賣家支付寶賬戶號 String(30) 賣家支付寶賬號對應的支付寶唯一使用者號。以2088開頭的純16位數字。 可空 2088002007018916
buyer_id 買家支付寶賬戶號 String(30) 買家支付寶賬號對應的支付寶唯一使用者號。以2088開頭的純16位數字。 可空 2088002007013600
price 商品單價 Number 如果請求時使用的是total_fee,那麼price等於total_fee;如果請求時使用的是price,那麼對應請求時的price引數,原樣通知回來。 可空 10.00
total_fee 交易金額 Number 該筆訂單的總金額。請求時對應的引數,原樣通知回來。 可空 10.00
quantity 購買數量 Number 如果請求時使用的是total_fee,那麼quantity等於1;如果請求時使用的是quantity,那麼對應請求時的quantity引數,原樣通知回來。 可空 1
body 商品描述 String(1000) 該筆訂單的備註、描述、明細等。對應請求時的body引數,原樣通知回來。 可空 Hello
discount 折扣 Number 支付寶系統會把discount的值加到交易金額上,如果需要折扣,本引數為負數。 可空 -5
is_total_fee_adjust 是否調整總價 String(1) 該交易是否調整過價格。 可空 N
use_coupon 是否使用紅包買家 String(1) 是否在交易過程中使用了紅包。 可空 N
extra_common_param 公用回傳引數 String 用於商戶回傳引數,該值不能包含“=”、“&”等特殊字元。如果使用者請求時傳遞了該引數,則返回給商戶時會回傳該引數。 可空 你好,這是測試商戶的廣告。
business_scene 是否掃碼支付 String 回傳給商戶此標識為qrpay時,表示對應交易為掃碼支付。目前只有qrpay一種回傳值。非掃碼支付方式下,目前不會返回該引數。 可空 qrpay

   根據 trade_status 的狀態可以知道訂單的支付狀態可以進行對支付成功後的業務邏輯處理。注意 通過POST獲取引數。

   trade_status 的狀態

觸發條件名 觸發條件描述 觸發條件預設值
TRADE_FINISHED 交易完成 true(觸發通知)
TRADE_SUCCESS 支付成功 true(觸發通知)
WAIT_BUYER_PAY 交易建立 false(不觸發通知)
TRADE_CLOSED 交易關閉 false(不觸發通知)

 

  因為訂單有可能已經通過同步進行處理了,所以需要先進行判斷訂單是否已經處理,如果處理就不再處理,如果未處理就處理業務。

  注意:

  •  程式執行完後必須列印輸出“success”(不包含引號)。如果商戶反饋給支付寶的字元不是success這7個字元,支付寶伺服器會不斷重發通知,直到超過24小時22分鐘。一般情況下,25小時以內完成8次通知(通知的間隔頻率一般是:4m,10m,10m,1h,2h,6h,15h);
  • 當商戶收到伺服器非同步通知並打印出success時,伺服器非同步通知引數notify_id才會失效。
  • 驗證是否是支付寶發來的通知 : 

     請求的完整連結 https://mapi.alipay.com/gateway.do?service=notify_verify&partner=2088002396712354&notify_id=RqPnCoPT3K9%252Fvwbh3I%252BFioE227%252BPfNMl8jwyZqMIiXQWxhOCmQ5MQO%252FWd93rvCB%252BaiGg

     返回資料(純文字)成功時:true,不成功時:報對應錯誤。

  •  業務資料處理:

     商戶需要驗證該通知資料中的out_trade_no是否為商戶系統中建立的訂單號,並判斷total_fee是否確實為該訂單的 實際金額(即商戶訂單建立時的金額),同時需要校驗通知中的seller_id(或者seller_email) 是否為out_trade_no這筆          單據的對應的操作方(有的時候,一個商戶可能有多個seller_id/seller_email),上述有任何一個 驗證不通過,則表明本次通知是異常通知,務必忽略。在上述驗證通過後商戶必須根據支付寶不同型別的業務通知,正確的進行不同的業務處           理,並且過濾重複的通 知結果資料。在支付寶的業務通知中,只有交易通知狀態為TRADE_SUCCESS或TRADE_FINISHED時,支付寶才會認定為買家付款成功。 如果商戶需要對同步返回的資料做驗籤,必須通過服務端的簽名驗籤程式碼邏輯          來實現。如果商戶未正確處理業務通知,存在潛在的風險,商戶自行承擔因此而產生的所有損失。

     交易狀態TRADE_SUCCESS的通知觸發條件是商戶簽約的產品支援退款功能的前提下,買家付款成功;

     交易狀態TRADE_FINISHED的通知觸發條件是商戶簽約的產品不支援退款功能的前提下,買家付款成功;或者,商戶簽約的產品支援退款功能的前提下,交易已經成功並且已經超過可退款期限;

     交易成功之後,商戶(高階即時到賬或機票平臺商)可呼叫批量退款介面,系統會發送退款通知給商戶,具體內容請參見批量退款介面文件;

     當商戶使用站內退款時,系統會發送包含refund_status和gmt_refund欄位的通知給商戶。