支付寶接入原理

轉載自:http://www.cnblogs.com/blodfox777/archive/2009/11/03/1595223.html

支付寶接口程序、文檔及解讀(ASP.NET)

 

最近須要爲網站加入支付寶的充值接口,而目前關於支付寶接口開發的資料比較雜亂,這裏就我這次開發所用到的資料進行彙總整理,但願可以幫助須要的朋友。php

開發步驟:

1. 肯定簽約類型

支付寶的接口有多種類型,因此首先你要肯定簽約的合同類型,肯定使用的是哪一個接口,不至於走錯了道道。html

此步驟中,能夠參考文檔:支付寶接口操做教程java

2. 下載開發文檔

若是是即時到帳的開發,請先下載並仔細閱讀:標準快速付款接口文檔sql

文檔中比較詳細的介紹了邏輯流程,時序圖以及枚舉定義等,最好在看示例代碼以前通讀之數據庫

3. 獲取簽約帳號的支付寶安全校驗碼(key)和合做id:partner

支付寶示例程序的調試須要商戶號和相應的密鑰,不然沒法進行程序的調試,具體獲取方法請查看官方幫助,再也不贅述安全

4. 下載支付寶示例程序

asp 即時到帳接口代碼實例:點此下載 (31.62 KB) 

php_GBK 即時到帳接口代碼實例:點此下載 (22.02 KB) 

php_UTF-8 即時到帳接口代碼實例:點此下載 (22.02 KB) 

net_05_GBK(post方式) 即時到帳接口代碼實例:點此下載 (12.03 KB) 

net_05_UTF-8(post方式) 即時到帳接口代碼實例: 點此下載 (10.72 KB) 

java_GBK(get方式) 即時到帳接口代碼實例:點此下載 (136.54 KB) 

java_UTF-8 (get方式)即時到帳接口代碼實例:點此下載 (112.67 KB) 服務器

 5. 支付寶示例程序的解讀

 下面內容轉自http://dev.alipay.com/devclub/mvnforum/viewthread_thread,161_offset,0網絡

你們想必都有這種困惑——拿到支付寶的接口代碼後,儘管裏面的程序有註釋,接口代碼包中也附有開發說明,但仍是不知道該如何入手。這不難想象是什麼緣由,由於本身並不瞭解這個接口的工做原理是什麼?
那麼這篇文章就是要向你們全面展現關於支付寶接口的全部東西,以便你們能快速上手把接口接入本身的項目中,也能幫助那些已經對支付寶接口有所瞭解的程序開發者們更瞭解支付寶的一些通用規則、特殊用途等。

正題開始——

1、 結構 
a) 通常由兩部分組成,接入部分與通知返回部分。接入部分即爲傳遞參數等信息組合成超級連接,並用該連接來進行跳轉。通知返回部分則是支付寶服務器對該筆訂單處理完畢後,通知與返回該筆訂單的詳細信息到商戶服務器,商
戶服務器接收到後,並對其進行數據處理。 
b) 以實物標準雙接口ASP代碼中的程序爲例。 
i. 接入部分的頁面文件包含:配置頁alipay_Config.asp、方法詳細頁alipay/Alipay_Payto.asp、程序入口頁index.asp以及MD5加密方法類頁alipayto/Alipay_md5.asp。
ii. 通知返回部分的頁面文件包含:方法詳細頁alipay/Alipay_Payto.asp、MD5加密方法類頁alipayto/Alipay_md5.asp、支付完成後(支付寶處理完畢後)自動跳轉回的自定義頁面return_Alipay_Notify.asp、兩方服務器間相互交互(肉眼沒法見到的)通知頁Alipay_Notif
y.asp。
這裏你們能夠一目瞭然,MD5加密方法類與方法詳細頁不管是哪部分都有被調用,所以這兩個文件可視爲核心代碼部分,若想理解接口的工做原理則要從該部分入手。 
c) 以實物標準雙接口的ASP.NET C#語言代碼程序爲例:
i. 接入部分的頁面文件包含:無需更改的ALIPAY的類文件App_Code/AliPay.cs及入口頁面文件Default.aspx
ii. 通知返回部分的頁面文件包含:兩方服務器間相互交互(肉眼沒法見到的)通知頁Alipay_Notify.aspx、支付完成後(支付寶處理完畢後)自動跳轉回的自定義頁面Alipay_Return.aspx、
無需更改的ALIPAY的類文件App_Code/AliPay.cs
這個架構是否更容易理解了?沒錯,核心部分的運算過程就在AliPay.cs這個文件中。架構

 

2、 工做原理
你們對結構部分已經有所瞭解,那麼咱們就開始分析具體的這個接口是如何運做的。
a) 接入部分原理
i. 第一步——選定參數信息: 
結合技術文檔以及接口代碼DEMO,選定傳遞給支付寶服務器的參數,以實物標準雙接口爲例。如必傳項service、partner、seller_email、sign、sign_type、out_trade
_no、price、subject、quantity、payment_type以及最少一組的物流信息參數三個logistics_type、logistics_fee、logistics_payment
等,選填項body、discount、show_url等。
以ASP.NET C#語言代碼程序爲例:框架

string service = "trade_create_by_buyer";
        
string seller_email = "aaaa@126.com"; 
        
string sign_type = "MD5";
        
string key = "********************************";
        
string partner = "2088************";
        
string _input_charset = "utf-8";
        
string show_url = "http://www.alipay.com/";
        
string out_trade_no = TxtOrderno.Text.Trim();
        
string subject = TxtSubject.Text.Trim();
        
string body = TxtBody.Text.Trim();
        
string price = TxtPrice.Text.Trim();
        
string quantity = TxtQua.Text.Trim();
        
string logistics_type = "POST";
        
string logistics_fee = TxtPost.Text.Trim();
        
string logistics_payment = "BUYER_PAY";
        
string notify_url = "http://www.xxx.com/swnet05utf8/Alipay_Notify.aspx"; 
        
string return_url = "http://www.xxx.com/swnet05utf8/Alipay_Return.aspx";


ii. 第二步——排序: 
把這些參數的變量名(即技術文檔裏給出的變量名,以這種方式組合:service=」trade_create_by_buyer」做爲一串字符串)按從a到z的順序依次排序。以ASP.NET C#語言代碼程序爲例,該功能在ALIPAY.CS類中;以ASP代碼中的程序爲例,該功能在alipayto/Alipay_Payto.asp文件中。
iii. 第三步——加密: 
目前通常的加密方式是MD5,不管是哪一種加密方式,要加密的信息是要傳給支付寶的信息,且存在於技術文檔中,而非自定義的變量名。對以上排序好的全部參數(不包括網關參數即:string gateway = "https://www.alipay.com/cooperate/gateway.do?" ;)以循環的方式,用‘&’字符拼接成一長串字符串(這裏須要注意,全部的參數都是&字符來拼接的,拼接後直接再拼接安全校驗碼Key,在程序中你們可看到,這個key是直接加到該字符串後面而沒有用&字符 ),以後進行加密。得出的加密字符串集存儲於sign這個參數中。
iv. 第四步——拼接字符串成URL連接 
咱們已經拿到了各個參數、參數所屬的值以及加密得出的加密字符串,那麼手上如今的全部參數信息的格式,應當都是一組一組的service=」trade_create_by_buyer」這種格式的字符串,拼接的話,則依靠循環的方式遍歷全部的這種字符串,由於此次的拼接是要成URL連接,因此以前排除在外的網關gaetway和加密類型參數sig
n_type也都會被拼接進來,那麼,鏈接的字符則用你們所熟知的字符’&’,就這樣得出一個完整的URL連接地址,如:


該連接來自支付寶官方的技術文檔「標準實物雙接口技術文檔」
v. 第五步——自動跳轉 
第四步中已經運算得出的URL連接字符串,咱們則要讓其活起來,那麼活起來的方式就是——用程序調用它,也就是所謂的頁面自動跳轉。這樣就能跳到支付寶的官方收銀臺頁面。
能夠說,如今已經成功的把支付寶接口融合進了你們本身的網站中,且可以使用支付寶來進行付款了。 
b) 通知返回部分原理
i. 專業術語 
通知返回是兩個頁面,即傳遞給支付寶時的notify_url參數所對應的頁面文件(asp.net的是Alipay_Notify.aspx、asp的是Alipay_Notify.asp)稱之爲通知頁,傳遞
給支付寶時的return_url參數所對應的頁面文件(asp.net的是Alipay_Return.aspx、asp的是return_Alipay_Notify.asp)稱之爲返回頁。
ii. 通知返回原理 
1. 第一步——驗證是不是支付寶服務器發來的請求: 
a) 以asp程序代碼爲例:

alipayNotifyURL = "http://notify.alipay.com/trade/notify_query.do?"
alipayNotifyURL 
= alipayNotifyURL &"partner=" & partner & "&notify_id=" & request("notify_id")
        
Set Retrieval = Server.CreateObject("Msxml2.ServerXMLHTTP.3.0")
    
Retrieval.setOption 2, 13056 
    
Retrieval.open "GET", alipayNotifyURL, False, "", "" 
    
Retrieval.send()
    
ResponseTxt = Retrieval.ResponseText
        
Set Retrieval = Nothing


獲得的即是ResponseTxt的值,這是下面的步驟要用到的。
b) 以asp.net C#程序代碼爲例:

   //獲取遠程服務器ATN結果,驗證是不是支付寶服務器發來的請求
    
public String Get_Http(String a_strUrl, int timeout)
    
{
        
string strResult;
        
try
        
{
            
HttpWebRequest myReq = (HttpWebRequest)HttpWebRequest.Create(a_strUrl);
            myReq
.Timeout = timeout;
            
HttpWebResponse HttpWResp = (HttpWebResponse)myReq.GetResponse();
            
Stream myStream = HttpWResp.GetResponseStream();
            
StreamReader sr = new StreamReader(myStream, Encoding.Default);
            
StringBuilder strBuilder = new StringBuilder();
            
while (-1 != sr.Peek())
            
{
                strBuilder
.Append(sr.ReadLine());
            
}

            strResult 
= strBuilder.ToString();
        
}
        
catch (Exception exp)
        
{

            strResult 
= "錯誤:" + exp.Message;
        
}

        
return strResult;
}


調用部分:

       string alipayNotifyURL = "https://www.alipay.com/cooperate/gateway.do?service=notify_verify";
        
string partner = "2088************";

        alipayNotifyURL 
= alipayNotifyURL + "&partner=" + partner + "&notify_id=" + Request.Form["notify_id"];

        
//獲取支付寶ATN返回結果,true是正確的訂單信息,false 是無效的
        
string responseTxt = Get_Http(alipayNotifyURL, 120000);


獲得的即是ResponseTxt的值,這是下面的步驟要用到的。
2. 第二步——排序: 
該部分的排序的原理與「接入部分」的原理「排序步驟」同樣,值得注意的是 ,這裏的參數是支付寶通知返回時,傳回來的訂單信息的各類參數以及值。
3. 第三步——加密: 
該部分的加密原理與「接入部分」的原理「加密步驟」同樣,依然值得注意的部分是加密的參數信息,這些參數信息是來源於上面一步驟排序好後的參數拼接起來的字符串來加密的。
4. 第四步——判斷: 
上面咱們有獲得加密的結果(命名爲mysign吧)、檢驗是不是支付寶發來的消息的正確性ResponseTxt、以及經過POST或GET的方式獲得的sign參數的值,那麼這個判斷的含義即是通知返回裏最重要
的部分了,由於它是來檢驗下面的程序是否執行咱們的數據處理的。如何判斷呢?各語言程序代碼中,都是把加密得出的結果mysign與從支付寶那或獲得的sign的值進行比較,而且還要讓reponseTxt這個的
值要等於true,這樣才達到驗證成功。值得注意的是 ,你們都有遇到過這種事,支付部分即接入部分的確是作好了,但爲何沒法與支付寶的交易信息同步,出現的問題就在這個判斷上沒有成功,下面的第五部分則會詳細說明。
5. 第五步——自身網站的數據處理 
終於判斷成功了,程序已經執行到了這裏。各語言程序代碼的這塊地方的註釋都寫着「更新本身數據庫的訂單語句」或是「這裏能夠指定你須要顯示的內容」。如字面上的意思,這塊地方就是要咱們你們來對這筆交易信息進行數
據處理,即編寫程序。這個說法大概專業了點,簡單易懂的講法即是,支付寶的交易成功的信息和其餘的一切交易狀態,本身的網站也可以對這筆訂單同步起來,即支付寶裏這筆訂單的交易狀態是「買家已付款等待賣家發貨」,
那麼本身網站裏顯示的這筆狀態也因如此,那麼就應當在這裏面寫下諸如:

           if (Request.Form["trade_status"] == "WAIT_SELLER_SEND_GOODS")//   判斷支付狀態_買家付款成功,等待賣家發貨(文檔中有枚舉表能夠參考)   
            
{
                
//更新本身數據庫的訂單語句,請本身填寫一下
                
string strOrderNO = Request.Form["out_trade_no"];//訂單號
                
string strPrice = Request.Form["price"];//金額
                
string sql = "update order_table set order_status = ‘買家已付款,等待賣家發貨’ where order_no = " + strOrderNO;
                
Update(sql);
            
}


等數據庫處理代碼。
iii. 存在的區別 
1. 你們仔細閱讀代碼不難發現,在通知頁中程序運行時,獲取參數的方法是用POST方式,而返回頁中程序運行時,獲取參數的方法是用GET方式。由此可知一些基本的信息——返回頁傳遞回來的參數信息是儲存在URL連接
裏的,而通知頁的參數信息是不在URL連接裏,也能從中推斷出兩者在功能上的差別。 
2. 你們可看到通知頁面比返回頁中多一個環節,那就是Response.Write("success");
做用上不一樣的詳細說明,你們能夠看下面的第四部分。

 

3、 參數
首先你們有個疑問,技術文檔中的輸入參數列表中給出了諸多參數,而手上拿到的代碼裏只寫了一部分參數來進行傳遞信息,這到底是爲何?那麼咱們先帶着這個疑問往下看。
如下討論的參數不涵蓋網關gateway、加密參數sign、加密類型sign_type,由於這些都是必須的。
以實物標準雙接口爲例,可把參數看作幾個功能部分組成
a) 不可缺乏的參數
i. service服務參數,這個是用來區別這個接口是用的什麼接口,因此絕對不能修改。
ii. partner合做身份者ID、key安全校驗碼或稱私鑰這一組參數是簽約合同生效後才能拿的到,partner是來鑑別是哪一個商家與支付寶簽約,而這個Key它如同鑰匙般至關重要。
iii. seller_email收款人支付寶帳號,支付寶中有手機類型、電子郵件類型的支付寶帳號是均可以用這個參數的。
iv. subject在支付寶的收銀臺裏是直接與商品名稱關聯在一塊兒的,可是說的更準確些的話,這個參數是這筆交易的名稱,由於這筆交易不必定只買一件商品。它的做用不只是在收銀臺裏能夠清晰的顯示出來,並且在支付寶的帳
戶的交易明細的列表裏,它也是排在第一列,由此可推測出,它有財務對帳、做爲交易查詢的篩選條件等諸多做用。很是重要。
v. out_trade_no技術文檔中給出的是商戶交易號(確保在商戶系統中惟一),顧名思義這個就是咱們你們本身網站的訂單系統裏的惟一訂單號,而非支付寶的。這裏須要強調的,這個訂單號必須得是惟一的,如何惟一法?本身網站
裏訂單系統的訂單號是絕對惟一的吧,支付寶要求的惟一就是這個,爲何非要惟一?支付寶會根據訂單號來斷定這筆訂單對於這個商家的全部交易中是不是惟一的。
vi. price金額、quantity數量,這裏設置有兩種方式一種商品的單價金額,多個數量(即大於等於1)。另種是數量爲1,金額表明總額,甚至是包含了運費。爲何大部分的客戶要這麼作?緣由很簡單,第一,購物車裏的東西不必定是單純的
一件或者多件相同的商品,那麼爲商品設置金額時就有困難了,所以這裏用總額是最好的,而數量就默認爲1。第二,運費的設置不少客戶是與各家快遞公司簽約、每件物品的快遞費用也不盡相同,爲了省去麻煩,在程序計算的
時候乾脆把運費也加進去。所以咱們只須要記住一件事,這個price的金額就是所謂的總額了。
vii. payment_type支付類型,沒什麼可說的直接寫成1,無需改動。
viii. 物流信息logistics_type、logistics_fee、logistics_payment這是一組物流信息,實物標準雙接口中必須得至少有一組物流信息,也就是指這三個參數了,最多可有三組,哪三組呢?logistics_type_一、logistics_fee_一、logistics_paymen
t_1(第二組);logistics_type_二、logistics_fee_二、logistics_payment_2(第三組)。後兩組爲可選項。通常前面有說Price已是總額了且包含了運費,那
麼這裏物流運費就直接設置成0便可,即logistics_fee=」0」,其餘兩個的信息可參考技術文檔來填寫,由於要從技術文檔中的枚舉列表裏來選擇,因此毫不可亂填寫。
b) 可增長的有用參數
i. 物流信息最多三組,最少一組,這已經在前部分有所說起,這裏就再也不細說。
ii. _input_charset,當是UTF-8的編碼格式時必須得用到且不容許爲空的,即_input_charset=」utf-8」
iii. notify_url、return_url,return_url表明支付完畢後能夠自動從支付寶的官方頁面跳轉回來,notify_url這個是防止調單的首選最佳工具。
iv. body,在支付寶收銀臺中的商品描述裏顯示,若是subject是訂單名稱的話,那麼這個body則最準確的稱之爲訂單描述,其實我的認爲它做爲備註之類的更爲恰當。不少人都很鬱悶支付寶爲什麼不能像其餘公司
的接口有個自定義的參數來存放客戶想要的東西,其實body也具備相似的這種功能,它不只容納的信息是全部參數裏最大的,並且仍是以字符串的形式儲存,我的認爲它其實也是很是重要的不可缺乏的參數之一呢。
v. discount折扣,顧名思義若是小於0,則是用原金額Price*quantity+(discount),實際金額便比原總額小了。如今有些商戶有支付寶的優惠卷,而優惠卷的用途也是在這個參數中體現,具體作法與前
面無異。
vi. show_url商品展現地址,這個連接的做用是在支付寶收銀臺的商品連接旁邊有個下劃線「詳情」的連接,而點連接彈出的一個新頁面即是這個商品展現地址的頁面。
vii. 收貨信息receive_name、receive_address、receive_zip、receive_phone、receive_mobile,這些信息若也設置爲傳遞給支付寶的參數之一的話,那麼在支付寶收銀臺點選下一步的時候,本該出現的填寫收貨信息頁面不見蹤跡,而直接跳到了收貨信息頁面的下一個頁面去了。不少商戶在本身的網站的購物
流程中都有一個填寫收貨信息的選項卡,爲了省去到支付寶收銀臺中還要填寫一次收貨信息的麻煩,那麼這些收貨信息的參數就派上用場了。值得注意的是,收貨人姓名和地址是必填項,否則仍是會出現收貨信息填寫頁。
viii. buyer_email買家支付寶帳號,這個設置好後呈現的效果即是,本來是空的支付寶帳號的輸入框此時已經有個支付寶帳號在裏面放置。
c) 剩下的參數無需理會

整個實物標準雙接口的參數介紹完畢,那麼其餘接口的參數還要介紹嗎?你們從上面分析得出的東西對比技術文檔的參數列表是否看出什麼來了?

一、 參數列表的最後一列叫「可空」,N表明不容許爲空,Y表明容許爲空,結合上面的不可缺乏參數與增長的有用參數來進行比較,不難發現,不可缺乏的參數全是爲N的。
二、 有些爲Y的參數有一組,例如buyer_email、buyer_id,凡是遇到這種的通常都是二可選一也可都不選,或是二必選一。舉例說明:二必選一的是seller_email、seller_id,二選一的
是buyer_email、buyer_id。
全部的接口的參數如此分析就能判斷出哪些是重要參數哪些可不要,結合技術文檔與程序接口來研究就能一目瞭然。

 

4、 通知返回
a) 返回頁
傳遞給支付寶時的return_url參數所對應的頁面文件。
具有的屬性:
一、支付接口中買家的購買流程已經走到支付寶裏且支付寶提示支付成功時,頁面會自動跳轉回自身網站的這個頁面裏來。
二、同步的,無時差
三、得到參數的方法是用get方式獲取。
四、不論跳轉回來程序判斷是真仍是假(if(sign = mysign and responseTxt = true))只跳轉回來一次,不重複。
五、這個並非支付寶服務器調用了該頁面,而是經過與組合拼接各參數造成的URL連接原理等同,拼接出來的URL連接,以後程序上作自動跳轉。
六、基於5的緣由,該頁面的程序調試可沒必要在服務器上而是本機上調試、運行。
 
b) 通知頁
傳遞給支付寶時的notify_url參數所對應的頁面文件
具有的屬性:
一、這個通知頁就是被支付寶調用才能啓動的。
二、服務器間的互動,不像返回頁肉眼能夠看到,這個是看不到的。
三、得到參數的方法是用POST方式獲取。
四、支付寶中的該筆交易存在,且該筆交易狀態發生了變動,就會被調用。
五、被調用程序判斷(if(sign = mysign and responseTxt = true)),若咱們本身在該判斷中有作程序編寫,成功則再也不被調用,不成功則會反覆被調用。
六、異步的,第一次收到訂單信息(如下都稱之爲「通知」)是與返回頁近乎等同或等同的同步時間,在判斷不成功的狀況下,會收到第二次第三次等次數的通知,時間間隔從最早的一兩分鐘,到後面的幾個小時。失效時間是4
8小時。
七、基於6的緣由,該頁面的程序調試必須在服務器上調試、運行。
八、程序編寫時必須採用程序執行成功,才寫頁面response.Write(「success」);,不成功則寫頁面response.Write(「fail」); 支付寶根據success來斷定是否要從新再次發送通知。
九、該頁面的Html頁面中必須是空白、無任何Html標籤、無任何空格。
 

以C# ASP.NET實物標準雙接口代碼爲例:

       if (mysign == sign && responseTxt == "true") 
        
{
            
if (Request.Form["trade_status"] == "WAIT_BUYER_PAY")//   判斷支付狀態_等待買家付款(文檔中有枚舉表能夠參考)            
            
{
                
//更新本身數據庫的訂單語句,請本身填寫一下
            
}
            
else if (Request.Form["trade_status"] == "WAIT_SELLER_SEND_GOODS")//   判斷支付狀態_買家付款成功,等待賣家發貨(文檔中有枚舉表能夠參考)   
            
{
                
//更新本身數據庫的訂單語句,請本身填寫一下
                
string strOrderNO = Request.Form["out_trade_no"];//訂單號
                
string strPrice = Request.Form["price"];//金額
                
string sql = "update order_table set order_status = '買家已付款,等待賣家發貨' where order_no = @out_trade_no";
                
Update(sql,para);
            
}
            
else if (Request.Form["trade_status"] == "WAIT_BUYER_CONFIRM_GOODS")//   判斷支付狀態_賣家已發貨等待買家確認(文檔中有枚舉表能夠參考)   
            
{
                
//更新本身數據庫的訂單語句,請本身填寫一下
                
string strOrderNO = Request.Form["out_trade_no"];//訂單號
                
string strPrice = Request.Form["price"];//金額
                
string sql = "update order_table set order_status = '賣家已發貨,等待買家確認收貨' where order_no = @out_trade_no";
                
Update(sql, para);
            
}
            
else if (Request.Form["trade_status"] == "TRADE_FINISHED")//   判斷支付狀態_交易成功結束(文檔中有枚舉表能夠參考)   
            
{
                
//更新本身數據庫的訂單語句,請本身填寫一下
                
string strOrderNO = Request.Form["out_trade_no"];//訂單號
                
string strPrice = Request.Form["price"];//金額
                
string sql = "update order_table set order_status = '交易成功' where order_no = @out_trade_no";
                
Update(sql, para);
            
}
            
else
            
{
                
//更新本身數據庫的訂單語句,請本身填寫一下
            
}

            
Response.Write("success");
        
}
        
else
        
{
            
Response.Write("fail");
        
}


c) 在支付寶的衆多接口中,不是全部的接口都擁有通知頁與返回頁的。
有的接口只有返回頁;有的接口有通知頁且用XML格式的內容顯示在當前頁面中;有的沒有通知頁也沒有返回頁僅僅只以XML格式的內容顯示在當前頁面中。因此,咱們要根據各接口的技術文檔與程序實例來作相應的數據處
理。
d) 你們這裏存在一個疑問,通常你們的作法都是把數據庫更新些在返回頁中,可是不少狀況下出現了訂單不一樣步即掉單現象。這是爲何?
答:返回頁是當前頁面自動跳轉的,這雖然跳轉的反應速度不錯,但人的手動關閉該頁面操做絕對可使之在沒有跳轉回來以前就關掉了該頁面,此時本來該數據庫更新的程序並無被啓動,這樣直接致使了掉單,因此通常大商
戶,尤爲是網絡遊戲行業的即時到賬充值的技術作法是:返回頁中有訂單處理程序,通知頁中也有,當返回頁中的訂單沒作過處理時,通知頁中的數據處理程序便啓動;這樣便可近乎100%解決掉單問題(還有種掉單緣由是你們本身的服務器出現問題,好比MS3XML.DLL問題,這個問題至今沒有什麼能夠解決的辦法,只能重裝或是更換服務器,也有的服務器由於中毒才致使的)。

 

5、 調試
接入部分作好了,通知返回部分也作好了,那麼開始調試吧。
調試也分紅兩大部分來作。
a) 部分網站用了框架模式frame,但這個並不適用支付寶的接口程序,所以絕對不能把支付寶的接口頁面置於整個網站的框架之下
b) 肯定好要用POST仍是GET方式來傳遞參數,兩者不能混用。因爲有些網站中不必定只有一個接口入口,因此整個網站都必須保持一致性,不能這個接口用POST,那個接口用GET,這樣直接致使後續出現一系列連查找
緣由都極其困難的現象。
c) 接入部分的調試工做,則是輸入支付寶要求的格式的值,如subject、body的值不容許有非法字符、金額格式必須是小數點後兩位數或是正整數且不是金額格式(即$123.00),以及很是重要的一個原則,傳遞的參數要麼不傳遞這個參數(即傳遞的衆多參數中,這個參數徹底不存在),要麼這個參數不容許爲空。不少人在調試時支付出現一系列「調試錯誤」有很大的一部分緣由就是參
數的設置存在問題。
d) 編碼格式必定要確認再確認,在支付時直接出現「調試錯誤,SIGN不對」只有兩種緣由,一是C部分已提到的參數的設置問題,另外一個即是這個編碼格式的問題。編碼格式是很是重要的,絕對不能這個地方用GBK,另個地方用utf-8。
e) 經過接口走一次真實的操做,如果支付接口,則走一筆真實的交易,金額則是0.01元(支付寶是沒有測試環境的,因此請老實的使用本身簽約的號去走真實交易),不要以爲很麻煩,也不要把這個工做交個經理或者你的老闆
來作,由於它直接關係到你後續的操做步驟與調試的順暢程度。
f) 返回部分在本機電腦上就能夠調試完畢,以前有提到不要把支付測試工做交給本身之外的其餘人,這裏就能夠獲得充分的說明,不管是哪一種語言都擁有本身風格的單步監控程序代碼的能力,返回部分就要一步一步監控程序的執行,確保一、是否執行到了「mysign == sign && responseTxt == "true"」,這個IF語句的判斷;二、是否進入了這個語句裏而不是else裏;三、數據庫更新程序是否執行成功,而不是卡着不動了;四、數據庫更新完畢後,程序是否走完。基本出現問題的地方就在第一步,因此不要
以爲奇怪爲何掉單?

g) 通知頁的調試,這個調試就比較麻煩了,首先這個支付寶接口已經完成且放在了服務器上,別人能夠經過互聯網來進行支付;其次,要把通知頁中的「寫日誌」程序啓動起來,日誌內容主要記錄trade_status、tr
ade_no、out_trade_no、price、sign、mysign、responseTxt等。通常出現的緣由依舊是「mysign == sign && responseTxt == "true"」這個判斷上不被經過。
具體檢測方式:
一、直接用互聯網訪問http://www.xxx.com/alipay/notify_url.asp
訪問是否可以訪問獲得,且顯示"fail"的字眼,其餘如空白或是其餘程序錯誤提示等內容,均屬程序執行出錯。
二、程序是否執行到,sign=mysgin and responseTxt = "true"這個判斷中,若是執行到這個判斷時跳到ELSE的判斷語句去了,則表示您的接口程序在支付時傳遞的參數信息或是您的編碼格式、合做身份者ID與安全校驗碼的設置存在問題。
三、程序已經執行到sign=mysgin and responseTxt = "true"這個判斷中,卻沒有執行到response.Write("success")這句話,說明您本身編寫進去的程序代碼執行出錯,請檢查。

6、 其餘 
a) 有些接口,例如支付的接口,是支持POST或者GET方式傳遞參數的。
i. POST傳遞方式:
這裏須要注意的地方是:<form action=」 aliay_url」 …>中action的值是網關+編碼格式參數,即https://www.alipay.com/cooperate/gateway.do?_input_charset=utf-8,GBK的編碼格式能夠爲:https://www.alipay.com/cooperate/gateway.do?。
ii. GET傳遞方式:
是用&字符來鏈接起來的一長串URL連接字符串,經過自動跳轉不是<form action=」 aliay_url」 …>的方式來存放,而是用Response.Redirect(aliay_url)方式來進行跳轉。

6. FAQ文檔

支付寶還提供了FAQ文檔,若是遇到問題,能夠先行查閱:

集成常見FAQ (集成錯誤文檔和其餘信息): 商家工具FAQ.pdf (391.17 KB)

相關文章
相關標籤/搜索