支付寶支付--即時到賬 開發總結
轉載: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,即seller_id的值與partner的值相同。 三個引數的優先級別是:seller_id>seller_account_name>seller_email。 |
不可空 |
2088002007018966 |
seller_email |
賣家支付寶賬號 |
String(100) |
|||
seller_account_name |
賣家支付寶賬號別名 |
String(100) |
|||
buyer_id |
買家支付寶使用者號 |
String(16) |
三個引數的優先級別是:buyer_id>buyer_account_name>buyer_email。 |
可空 |
2088002007018955 |
buyer_email |
買家支付寶賬號 |
String(100) |
|||
buyer_account_name |
買家支付寶賬號別名 |
String(100) |
|||
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 |
取值範圍:
如果不設定,預設識別為餘額支付。 說明: 必須注意區分大小寫。 |
可空 |
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種:
跳轉模式下,使用者的掃碼介面是由支付寶生成的,不在商戶的域名下。
|
可空 |
1 |
qrcode_width |
商戶自定二維碼寬度 |
Integer |
商戶自定義的二維碼寬度。 當qr_pay_mode=4時,該引數生效。 |
可空 | 200 |
need_buyer_realnamed |
是否需要買家實名認證 |
String(2) |
是否需要買家實名認證。
|
可空 | T |
promo_param |
商戶優惠活動引數 |
String(128) |
商戶與支付寶約定的營銷透傳引數。 |
可空 | {"customer201412":"Y","goods201412":"Y"} |
hb_fq_param |
花唄分期引數 |
String |
引數格式:hb_fq_seller_percent ^賣家承擔付費比例|hb_fq_num ^期數。
兩個引數必須一起傳入。 兩個引數用“|”間隔。Key和value之間用“^”間隔。 具體花唄分期期數和賣家承擔收費比例可傳入的數值請諮詢支付寶。 |
可空 | hb_fq_seller_percent^50|hb_fq_num^3 |
goods_type |
商品型別 |
String(2) |
商品型別:
如果不傳,預設為實物類商品。 |
可空 | 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¬ify_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欄位的通知給商戶。