支付寶介面文檔說明

来源:http://www.cnblogs.com/xrmqbl/archive/2016/01/06/5104573.html
-Advertisement-
Play Games

支付寶介面使用文檔說明 支付寶非同步通知(notify_url)與return_url.現支付寶的通知有兩類。A伺服器通知,對應的參數為notify_url,支付寶通知使用POST方式B頁面跳轉通知,對應的參數為return_url,支付寶通知使用GET方式 (通知地址不需要像以前一樣去賬戶內設置,而...


支付寶介面使用文檔說明 支付寶非同步通知(notify_url)與return_url.

現支付寶的通知有兩類。 
A伺服器通知,對應的參數為notify_url,支付寶通知使用POST方式 
B頁面跳轉通知,對應的參數為return_url,支付寶通知使用GET方式 (通知地址不需要像以前一樣去賬戶內設置,而是由客戶在支付的時候通過參數傳遞給我地址。 

例 如 notify_url=http://www.xxx.com/notify_alipay.asp 註意:www.XXX.com是您網站的功能變數名稱,也可以用ip地址代替。對於伺服器通知,ip地址一定是公網的,私有地址(例如10.2.1.1或者 192.168.1.1)支付寶無法通知到客戶端) 

以下內容來自支付寶官方網站,不過由於地址改變了,導致原帖無法訪問,通過快照查找到其內容,特分享一下. 

1. 確認您使用的介面是用notify_url還是return_url。 
2. notify_url為伺服器通知,支付寶可以保證99.9999%的通知到達率,前提是您的網路通暢。 
3. return_url為網頁重定向通知,是由客戶的瀏覽器觸發的一個通知,若客戶去網銀支付,也會受銀行介面影響,由於各種影響因素特別多,所以該種類型的通知支付寶不保證其到達率。 
買家付款成功後,會跳到 return_url所在的頁面,這個頁面可以展示給客戶看,這個頁面只有付款成功才會跳轉,並且只跳轉一次.. 
notify_url: 伺服器後臺通知,這個頁面是支付寶伺服器端自動調用這個頁面的鏈接地址,這個頁面根據支付寶反饋過來的信息修改網站的定單狀態,更新完成後需要返回一個success給支付寶.,不能含有任何其它的字元包括html語言. 
流 程:買家付完款(trade_status=WAIT_SELLER_SEND_GOODS)--->支付寶通知notify_url---& gt;如果反饋給支付寶的是success(表示成功,這個狀態下不再反饋,如果不是繼續通知,一般第一次發送和第二次發送的時間間隔是3分鐘) 
剩下的過程,賣家發貨,買家確認收貨,交易成功都是這個流程 

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

正題開始—— 

一、 結構 
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這個文件中。

二、 工作原理 
大家對結構部分已經有所瞭解,那麼我們就開始分析具體的這個介面是如何運作的。 
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 = "[email protected]"; 
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鏈接地址,如: 

https://www.alipay.com/cooperate/gateway.do?s...3d199ba&sign_type=MD5 

該鏈接來自支付寶官方的技術文檔“標準實物雙介面技術文檔” 
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. 第二步——排序: 
該部分的排序的原理與“接入部分”的原理“排序步驟”一樣,值得註意的是 ,這裡的參數是支付寶通知返回時,傳回來的訂單信息的各種參數以及值。http://www.k686.com/ 
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"); 
作用上不同的詳細說明,大家可以看下麵的第四部分。http://www.k686.com/

三、 參數 
首先大家有個疑問,技術文檔中的輸入參數列表中給出了諸多參數,而手上拿到的代碼里只寫了一部分參數來進行傳遞信息,這究竟是為什麼?那麼我們先帶著這個疑問往下看。 
以下討論的參數不涵蓋網關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_1、logistics_fee_1、 logistics_paymen 
t_1(第二組);logistics_type_2、logistics_fee_2、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) 剩下的參數無需理會 

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

1、 參數列表的最後一列叫“可空”,N代表不允許為空,Y代表允許為空,結合上面的不可缺少參數與增加的有用參數來進行比較,不難發現,不可缺少的參數全是為N的。 
2、 有些為Y的參數有一組,例如buyer_email、buyer_id,凡是遇到這種的一般都是二可選一也可都不選,或是二必選一。舉例說明:二必選一的是seller_email、seller_id,二選一的 
是buyer_email、buyer_id。 
所有的介面的參數如此分析就能判斷出哪些是重要參數哪些可不要,結合技術文檔與程式介面來研究就能一目瞭然。

四、 通知返回 
a) 返回頁 
傳遞給支付寶時的return_url參數所對應的頁面文件。 
具備的屬性: 
1、支付介面中買家的購買流程已經走到支付寶里且支付寶提示支付成功時,頁面會自動跳轉回自身網站的這個頁面里來。 
2、同步的,無時差 
3、獲得參數的方法是用get方式獲取。 
4、不論跳轉回來程式判斷是真還是假(if(sign = mysign and responseTxt = true))只跳轉回來一次,不重覆。 
5、這個並不是支付寶伺服器調用了該頁面,而是通過與組合拼接各參數形成的URL鏈接原理等同,拼接出來的URL鏈接,之後程式上做自動跳轉。 
6、基於5的原因,該頁面的程式調試可不必在伺服器上而是本機上調試、運行。 
b) 通知頁 
傳遞給支付寶時的notify_url參數所對應的頁面文件 
具備的屬性: 
1、這個通知頁就是被支付寶調用才能啟動的。 
2、伺服器間的互動,不像返回頁肉眼可以看到,這個是看不到的。 
3、獲得參數的方法是用POST方式獲取。 
4、支付寶中的該筆交易存在,且該筆交易狀態發生了變更,就會被調用。 
5、被調用程式判斷(if(sign = mysign and responseTxt = true)),若我們自己在該判斷中有做程式編寫,成功則不再被調用,不成功則會反覆被調用。 
6、非同步的,第一次收到訂單信息(以下都稱之為“通知”)是與返回頁近乎等同或等同的同步時間,在判斷不成功的情況下,會收到第二次第三次等次數的通知,時間間隔從最先的一兩分鐘,到後面的幾個小時。失效時間是4 
8小時。 
7、基於6的原因,該頁面的程式調試必須在伺服器上調試、運行。 
8、程式編寫時必須採用程式執行成功,才寫頁面response.Write(“success”);,不成功則寫頁面response.Write(“fail”); 支付寶根據success來判定是否要重新再次發送通知。 
9、該頁面的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問題,這個問題至今沒有什麼可以解決的辦法,只 能重裝或是更換伺服器,也有的伺服器因為中毒才導致的)。本文來源於 http://www.k686.com/

五、 調試 
接入部分做好了,通知返回部分也做好了,那麼開始調試吧。 
調試也分成兩大部分來做。 
a) 部分網站用了框架模式frame,但這個並不適用支付寶的介面程式,因此絕對不能把支付寶的介面頁面置於整個網站的框架之下。 
b) 確定好要用POST還是GET方式來傳遞參數,二者不能混用。由於有些網站中不一定只有一個介面入口,所以整個網站都必須保持一致性,不能這個介面用POST,那個介面用GET,這樣直接導致後續出現一系列連查找 
原因都極其困難的現象。 
c) 接入部分的調試工作,則是輸入支付寶要求的格式的值,如subject、body的值不允許有非法字元、金額格式必須是小數點後兩位數或是正整數且不是金 額格式(即$123.00),以及非常重要的一個原則,傳遞的參數要麼不傳遞這個參數(即傳遞的眾多參數中,這個參數完全不存在),要麼這個參數不允許為 空。很多人在調試時支付出現一系列“調試錯誤”有很大的一部分原因就是參 
數的設置存在問題。 
d) 編碼格式一定要確認再確認,在支付時直接出現“調試錯誤,SIGN不對”只有兩種原因,一是C部分已提到的參數的設置問題,另一個便是這個編碼格式的問題。編碼格式是非常重要的,絕對不能這個地方用GBK,另個地方用utf-8。 
e) 通過介面走一次真實的操作,若是支付介面,則走一筆真實的交易,金額則是0.01元(支付寶是沒有測試環境的,所以請老實的使用自己簽約的號去走真實交易),不要覺得很麻煩,也不要把這個工作交個經理或者你的老闆 
來做,因為它直接關係到你後續的操作步驟與調試的順暢程度。 
f) 返回部分在本機電腦上就可以調試完畢,之前有提到不要把支付測試工作交給自己以外的其他人,這裡就可以得到充分的說明,不論是哪種語言都擁有自己風格的單 步監控程式代碼的能力,返回部分就要一步一步監控程式的執行,確保1、是否執行到了“mysign == sign && responseTxt == "true"”,這個IF語句的判斷;2、是否進入了這個語句里而不是else里;3、資料庫更新程式是否執行成功,而不是卡著不動了;4、資料庫更新完 畢後,程式是否走完。基本出現問題的地方就在第一步,所以不要 
覺得奇怪為什麼掉單? 
g) 通知頁的調試,這個調試就比較麻煩了,首先這個支付寶介面已經完成且放在了伺服器上,別人可以通過互聯網來進行支付;其次,要把通知頁中的“寫日誌”程式啟動起來,日誌內容主要記錄trade_status、tr 
ade_no、out_trade_no、price、sign、mysign、responseTxt等。一般出現的原因依舊是“mysign == sign && responseTxt == "true"”這個判斷上不被通過。 
具體檢測方式: 
1、直接用互聯網訪問http://www.xxx.com/alipay/notify_url.asp 
訪問是否能夠訪問得到,且顯示"fail"的字眼,其他如空白或是其他程式錯誤提示等內容,均屬程式執行出錯。 
2、程式是否執行到,sign=mysgin and responseTxt = "true"這個判斷中,如果執行到這個判斷時跳到ELSE的判斷語句去了,則表示您的介面程式在支付時傳遞的參數信息或是您的編碼格式、合作身份者ID與安全校驗碼的設置存在問題。 
3、程式已經執行到sign=mysgin and responseTxt = "true"這個判斷中,卻沒有執行到response.Write("success")這句話,說明您自己編寫進去的程式代碼執行出錯,請檢查。

六、 其他 
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)方式來進行跳轉。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • /*目的:創建一個單鏈表,實現尾部插入,頭部插入,遍歷鏈表*/#include #include #include //定義一個結構體,用來表示一個節點,包含指針域,數據域struct node{ int data; //數據域 struct node *next; //指針域,...
  • 轉自:https://blog.shonenada.com/post/websocket-with-flask/WebSocket with FlaskHTML5 以前,HTML 還不支持WebSocket,當時如果要進行實時的內容更新,要麼使用Ajax輪詢(Polling)或者使用Comet技術。...
  • 因為總用vector,卻忘記了有stack,今天用到棧頂的值才想起來,說起來stack很方便,也很容易用,看下邊例子: 1 #include 2 #include 3 using namesapce std; 4 5 int main(void) 6 { 7 stack v; 8 ...
  • Allocators與Criterion在記憶體使用及Create、Copy、Assignment的相同點及區別
  • 感謝此文:http://blog.csdn.net/soszou/article/details/23673133 本文很多技術及操作來源於此文 需求:因為微信方面的開發調試。為了測試方便,直接構建了一個跟真實生產環境一樣的測試環境。除了功能變數名稱不同其他都一樣。想直接使用功能變數名稱進行訪問調試。用的IIS+T...
  • 今天在上班路上看到一篇互聯網網路協議的文章感覺寫的的是相當好,圖文兼備,通俗易懂,好東西嘛當然要留下了,也在這給大家分享分享!
  • 最近在使用python做介面測試,發現python中http請求方法有很多種,現彙總如下:一、python自帶庫----urllib2python自帶庫urllib2使用的比較多,簡單使用如下:import urllib2response = urllib2.urlopen('http://loca...
  • Demo:import java.nio.file.Path;import java.nio.file.Paths;public class PathInfoTest { public static void main(String[] args) { /...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...