宅男在线永久免费观看网直播,亚洲欧洲日产国码无码久久99,野花社区在线观看视频,亚洲人交乣女bbw,一本一本久久a久久精品综合不卡

全部
常見問題
產(chǎn)品動(dòng)態(tài)
精選推薦

支付寶異步回調(diào)

管理 管理 編輯 刪除

現(xiàn)支付寶的通知有兩類。


A服務(wù)器通知,對(duì)應(yīng)的參數(shù)為notify_url,支付寶通知使用POST方式
B頁面跳轉(zhuǎn)通知,對(duì)應(yīng)的參數(shù)為return_url,支付寶通知使用GET方式 (通知地址不需要像以前一樣去賬戶內(nèi)設(shè)置,而是由客戶在支付的時(shí)候通過參數(shù)傳遞給我地址。

例如 notify_url=http://www.xxx.com/notify_alipay.asp 注意:www.XXX.com是您網(wǎng)站的域名,也可以用ip地址代替。對(duì)于服務(wù)器通知,ip地址一定是公網(wǎng)的,私有地址(例如10.2.1.1或者 192.168.1.1)支付寶無法通知到客戶端)

以下內(nèi)容來自支付寶官方網(wǎng)站,不過由于地址改變了,導(dǎo)致原帖無法訪問,通過快照查找到其內(nèi)容,特分享一下.

1. 確認(rèn)您使用的接口是用notify_url還是return_url。
2. notify_url為服務(wù)器通知,支付寶可以保證99.9999%的通知到達(dá)率,前提是您的網(wǎng)絡(luò)通暢。
3. return_url為網(wǎng)頁重定向通知,是由客戶的瀏覽器觸發(fā)的一個(gè)通知,若客戶去網(wǎng)銀支付,也會(huì)受銀行接口影響,由于各種影響因素特別多,所以該種類型的通知支付寶不保證其到達(dá)率。
買家付款成功后,會(huì)跳到 return_url所在的頁面,這個(gè)頁面可以展示給客戶看,這個(gè)頁面只有付款成功才會(huì)跳轉(zhuǎn),并且只跳轉(zhuǎn)一次..
notify_url: 服務(wù)器后臺(tái)通知,這個(gè)頁面是支付寶服務(wù)器端自動(dòng)調(diào)用這個(gè)頁面的鏈接地址,這個(gè)頁面根據(jù)支付寶反饋過來的信息修改網(wǎng)站的定單狀態(tài),更新完成后需要返回一個(gè)success給支付寶.,不能含有任何其它的字符包括html語言.
流程:買家付完款(trade_status=WAIT_SELLER_SEND_GOODS)--->支付寶通知 notify_url--->如果反饋給支付寶的是success(表示成功,這個(gè)狀態(tài)下不再反饋,如果不是繼續(xù)通知,一般第一次發(fā)送和第二次發(fā)送的時(shí)間間隔是3分鐘)
剩下的過程,賣家發(fā)貨,買家確認(rèn)收貨,交易成功都是這個(gè)流程

-------------------------------------------------------------------
大家想必都有這種困惑——拿到支付寶的接口代碼后,盡管里面的程序有注釋,接口代碼包中也附有開發(fā)說明,但還是不知道該如何入手。這不難想象是什么原因,因?yàn)樽约翰⒉涣私膺@個(gè)接口的工作原理是什么?
那么這篇文章就是要向大家全面展示關(guān)于支付寶接口的所有東西,以便大家能快速上手把接口接入自己的項(xiàng)目中,也能幫助那些已經(jīng)對(duì)支付寶接口有所了解的程序開發(fā)者們更了解支付寶的一些通用規(guī)則、特殊用途等。

正題開始——

一、 結(jié)構(gòu)


a) 一般由兩部分組成,接入部分與通知返回部分。接入部分即為傳遞參數(shù)等信息組合成超級(jí)鏈接,并用該鏈接來進(jìn)行跳轉(zhuǎn)。通知返回部分則是支付寶服務(wù)器對(duì)該筆訂單處理完畢后,通知與返回該筆訂單的詳細(xì)信息到商戶服務(wù)器,商
戶服務(wù)器接收到后,并對(duì)其進(jìn)行數(shù)據(jù)處理。
b) 以實(shí)物標(biāo)準(zhǔn)雙接口ASP代碼中的程序?yàn)槔?
i. 接入部分的頁面文件包含:配置頁alipay_Config.asp、方法詳細(xì)頁alipay/Alipay_Payto.asp、程序入口頁index.asp以及MD5加密方法類頁alipayto/Alipay_md5.asp。
ii. 通知返回部分的頁面文件包含:方法詳細(xì)頁alipay/Alipay_Payto.asp、MD5加密方法類頁alipayto /Alipay_md5.asp、支付完成后(支付寶處理完畢后)自動(dòng)跳轉(zhuǎn)回的自定義頁面return_Alipay_Notify.asp、兩方服務(wù)器間相互交互(肉眼無法見到的)通知頁Alipay_Notif
y.asp。
這里大家可以一目了然,MD5加密方法類與方法詳細(xì)頁不論是哪部分都有被調(diào)用,因此這兩個(gè)文件可視為核心代碼部分,若想理解接口的工作原理則要從該部分入手。
c) 以實(shí)物標(biāo)準(zhǔn)雙接口的ASP.NET C#語言代碼程序?yàn)槔?
i. 接入部分的頁面文件包含:無需更改的ALIPAY的類文件App_Code/AliPay.cs及入口頁面文件Default.aspx
ii. 通知返回部分的頁面文件包含:兩方服務(wù)器間相互交互(肉眼無法見到的)通知頁Alipay_Notify.aspx、支付完成后(支付寶處理完畢后)自動(dòng)跳轉(zhuǎn)回的自定義頁面Alipay_Return.aspx、
無需更改的ALIPAY的類文件App_Code/AliPay.cs
這個(gè)架構(gòu)是否更容易理解了?沒錯(cuò),核心部分的運(yùn)算過程就在AliPay.cs這個(gè)文件中。
-----------------------------------------------------------------

二、 工作原理
大家對(duì)結(jié)構(gòu)部分已經(jīng)有所了解,那么我們就開始分析具體的這個(gè)接口是如何運(yùn)作的。
a) 接入部分原理
i. 第一步——選定參數(shù)信息:
結(jié)合技術(shù)文檔以及接口代碼DEMO,選定傳遞給支付寶服務(wù)器的參數(shù),以實(shí)物標(biāo)準(zhǔn)雙接口為例。如必傳項(xiàng)service、partner、seller_email、sign、sign_type、out_trade
_no、price、subject、quantity、payment_type以及最少一組的物流信息參數(shù)三個(gè)logistics_type、logistics_fee、logistics_payment
等,選填項(xiàng)body、discount、show_url等。
以ASP.NET C#語言代碼程序?yàn)槔?

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. 第二步——排序:
把這些參數(shù)的變量名(即技術(shù)文檔里給出的變量名,以這種方式組合:service=”trade_create_by_buyer”作為一串字符串)按從a到z的順序依次排序。以ASP.NET C#語言代碼程序?yàn)槔摴δ茉贏LIPAY.CS類中;以ASP代碼中的程序?yàn)槔?,該功能在alipayto/Alipay_Payto.asp文件中。
iii. 第三步——加密:
目前一般的加密方式是MD5,不論是哪種加密方式,要加密的信息是要傳給支付寶的信息,且存在于技術(shù)文檔中,而非自定義的變量名。對(duì)以上排序好的所有參數(shù)(不包括網(wǎng)關(guān)參數(shù)即:string gateway = "https://www.alipay.com/cooperate/gateway.do?" ;)以循環(huán)的方式,用‘&’字符拼接成一長串字符串(這里需要注意,所有的參數(shù)都是&字符來拼接的,拼接后直接再拼接安全校驗(yàn)碼Key, 在程序中大家可看到,這個(gè)key是直接加到該字符串后面而沒有用&字符 ),之后進(jìn)行加密。得出的加密字符串集存儲(chǔ)于sign這個(gè)參數(shù)中。
iv. 第四步——拼接字符串成URL鏈接
我們已經(jīng)拿到了各個(gè)參數(shù)、參數(shù)所屬的值以及加密得出的加密字符串,那么手上現(xiàn)在的所有參數(shù)信息的格式,應(yīng)當(dāng)都是一組一組的 service=”trade_create_by_buyer”這種格式的字符串,拼接的話,則依靠循環(huán)的方式遍歷所有的這種字符串,因?yàn)檫@次的拼接是要成URL鏈接,所以之前排除在外的網(wǎng)關(guān)gaetway和加密類型參數(shù)sig
n_type也都會(huì)被拼接進(jìn)來,那么,連接的字符則用大家所熟知的字符’&’,就這樣得出一個(gè)完整的URL鏈接地址,如:

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

該鏈接來自支付寶官方的技術(shù)文檔“標(biāo)準(zhǔn)實(shí)物雙接口技術(shù)文檔”
v. 第五步——自動(dòng)跳轉(zhuǎn)
第四步中已經(jīng)運(yùn)算得出的URL鏈接字符串,我們則要讓其活起來,那么活起來的方式就是——用程序調(diào)用它,也就是所謂的頁面自動(dòng)跳轉(zhuǎn)。這樣就能跳到支付寶的官方收銀臺(tái)頁面。
可以說,現(xiàn)在已經(jīng)成功的把支付寶接口融合進(jìn)了大家自己的網(wǎng)站中,且能夠使用支付寶來進(jìn)行付款了。
b) 通知返回部分原理
i. 專業(yè)術(shù)語
通知返回是兩個(gè)頁面,即傳遞給支付寶時(shí)的notify_url參數(shù)所對(duì)應(yīng)的頁面文件(asp.net的是Alipay_Notify.aspx、asp的是Alipay_Notify.asp)稱之為通知頁,傳遞
給支付寶時(shí)的return_url參數(shù)所對(duì)應(yīng)的頁面文件(asp.net的是Alipay_Return.aspx、asp的是return_Alipay_Notify.asp)稱之為返回頁。
ii. 通知返回原理
1. 第一步——驗(yàn)證是否是支付寶服務(wù)器發(fā)來的請(qǐng)求:
a) 以asp程序代碼為例:

alipayNotifyURL = "http://notify.alipay.com/trade/notify_query.do?"
alipayNotifyURL = alipayNotifyURL &"partner=" & partner & "¬ify_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#程序代碼為例:

//獲取遠(yuǎn)程服務(wù)器ATN結(jié)果,驗(yàn)證是否是支付寶服務(wù)器發(fā)來的請(qǐng)求
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 = "錯(cuò)誤:" + exp.Message;
}

return strResult;
}

調(diào)用部分:

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

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

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

得到的便是ResponseTxt的值,這是下面的步驟要用到的。
2. 第二步——排序:
該部分的排序的原理與“接入部分”的原理“排序步驟”一樣,值得注意的是 ,這里的參數(shù)是支付寶通知返回時(shí),傳回來的訂單信息的各種參數(shù)以及值。http://www.k686.com/
3. 第三步——加密:
該部分的加密原理與“接入部分”的原理“加密步驟”一樣,依然值得注意的部分是加密的參數(shù)信息,這些參數(shù)信息是來源于上面一步驟排序好后的參數(shù)拼接起來的字符串來加密的。
4. 第四步——判斷:
上面我們有得到加密的結(jié)果(命名為mysign吧)、檢驗(yàn)是否是支付寶發(fā)來的消息的正確性ResponseTxt、以及通過POST或GET的方式得到的sign參數(shù)的值,那么這個(gè)判斷的含義便是通知返回里最重要
的部分了,因?yàn)樗莵頇z驗(yàn)下面的程序是否執(zhí)行我們的數(shù)據(jù)處理的。如何判斷呢?各語言程序代碼中,都是把加密得出的結(jié)果mysign與從支付寶那或得到的sign的值進(jìn)行比較,并且還要讓reponseTxt這個(gè)的
值要等于true,這樣才達(dá)到驗(yàn)證成功。值得注意的是 ,大家都有遇到過這種事,支付部分即接入部分的確是做好了,但為什么無法與支付寶的交易信息同步,出現(xiàn)的問題就在這個(gè)判斷上沒有成功,下面的第五部分則會(huì)詳細(xì)說明。
5. 第五步——自身網(wǎng)站的數(shù)據(jù)處理
終于判斷成功了,程序已經(jīng)執(zhí)行到了這里。各語言程序代碼的這塊地方的注釋都寫著“更新自己數(shù)據(jù)庫的訂單語句”或是“這里可以指定你需要顯示的內(nèi)容”。如字面上的意思,這塊地方就是要我們大家來對(duì)這筆交易信息進(jìn)行數(shù)
據(jù)處理,即編寫程序。這個(gè)說法大概專業(yè)了點(diǎn),簡單易懂的講法便是,支付寶的交易成功的信息和其他的一切交易狀態(tài),自己的網(wǎng)站也能夠?qū)@筆訂單同步起來,即支付寶里這筆訂單的交易狀態(tài)是“買家已付款等待賣家發(fā)貨”,
那么自己網(wǎng)站里顯示的這筆狀態(tài)也因如此,那么就應(yīng)當(dāng)在這里面寫下諸如:

if (Request.Form["trade_status"] == "WAIT_SELLER_SEND_GOODS")// 判斷支付狀態(tài)_買家付款成功,等待賣家發(fā)貨(文檔中有枚舉表可以參考)
{
//更新自己數(shù)據(jù)庫的訂單語句,請(qǐng)自己填寫一下
string strOrderNO = Request.Form["out_trade_no"];//訂單號(hào)
string strPrice = Request.Form["price"];//金額
string sql = "update order_table set order_status = ‘買家已付款,等待賣家發(fā)貨’ where order_no = " + strOrderNO;
Update(sql);
}

等數(shù)據(jù)庫處理代碼。
iii. 存在的區(qū)別
1. 大家仔細(xì)閱讀代碼不難發(fā)現(xiàn),在通知頁中程序運(yùn)行時(shí),獲取參數(shù)的方法是用POST方式,而返回頁中程序運(yùn)行時(shí),獲取參數(shù)的方法是用GET方式。由此可知一些基本的信息——返回頁傳遞回來的參數(shù)信息是儲(chǔ)存在URL鏈接
里的,而通知頁的參數(shù)信息是不在URL鏈接里,也能從中推斷出二者在功能上的差異。
2. 大家可看到通知頁面比返回頁中多一個(gè)環(huán)節(jié),那就是Response.Write("success");
作用上不同的詳細(xì)說明,大家可以看下面的第四部分。http://www.k686.com/
-------------------------------------------------------------------

三、 參數(shù)
首先大家有個(gè)疑問,技術(shù)文檔中的輸入?yún)?shù)列表中給出了諸多參數(shù),而手上拿到的代碼里只寫了一部分參數(shù)來進(jìn)行傳遞信息,這究竟是為什么?那么我們先帶著這個(gè)疑問往下看。
以下討論的參數(shù)不涵蓋網(wǎng)關(guān)gateway、加密參數(shù)sign、加密類型sign_type,因?yàn)檫@些都是必須的。
以實(shí)物標(biāo)準(zhǔn)雙接口為例,可把參數(shù)看做幾個(gè)功能部分組成
a) 不可缺少的參數(shù)
i. service服務(wù)參數(shù),這個(gè)是用來區(qū)別這個(gè)接口是用的什么接口,所以絕對(duì)不能修改。
ii. partner合作身份者ID、key安全校驗(yàn)碼或稱私鑰這一組參數(shù)是簽約合同生效后才能拿的到,partner是來鑒別是哪個(gè)商家與支付寶簽約,而這個(gè)Key它如同鑰匙般相當(dāng)重要。
iii. seller_email收款人支付寶賬號(hào),支付寶中有手機(jī)類型、電子郵件類型的支付寶賬號(hào)是都可以用這個(gè)參數(shù)的。
iv. subject在支付寶的收銀臺(tái)里是直接與商品名稱關(guān)聯(lián)在一起的,但是說的更準(zhǔn)確些的話,這個(gè)參數(shù)是這筆交易的名稱,因?yàn)檫@筆交易不一定只買一件商品。它的作用不僅是在收銀臺(tái)里可以清晰的顯示出來,而且在支付寶的賬
戶的交易明細(xì)的列表里,它也是排在第一列,由此可推測出,它有財(cái)務(wù)對(duì)賬、作為交易查詢的篩選條件等諸多作用。非常重要。
v. out_trade_no技術(shù)文檔中給出的是商戶交易號(hào)(確保在商戶系統(tǒng)中唯一),顧名思義這個(gè)就是我們大家自己網(wǎng)站的訂單系統(tǒng)里的唯一訂單號(hào),而非支付寶的。這里需要強(qiáng)調(diào)的,這個(gè)訂單號(hào)必須得是唯一的,如何唯一法?自己網(wǎng)站
里訂單系統(tǒng)的訂單號(hào)是絕對(duì)唯一的吧,支付寶要求的唯一就是這個(gè),為什么非要唯一?支付寶會(huì)根據(jù)訂單號(hào)來判定這筆訂單對(duì)于這個(gè)商家的所有交易中是否是唯一的。
vi. price金額、quantity數(shù)量,這里設(shè)置有兩種方式一種商品的單價(jià)金額,多個(gè)數(shù)量(即大于等于1)。另種是數(shù)量為1,金額代表總額,甚至是包含了運(yùn)費(fèi)。為什么大部分的客戶要這么做?原因很簡單,第一,購物車?yán)锏臇|西不一定是單純的
一件或者多件相同的商品,那么為商品設(shè)置金額時(shí)就有困難了,因此這里用總額是最好的,而數(shù)量就默認(rèn)為1。第二,運(yùn)費(fèi)的設(shè)置很多客戶是與各家快遞公司簽約、每件物品的快遞費(fèi)用也不盡相同,為了省去麻煩,在程序計(jì)算的
時(shí)候干脆把運(yùn)費(fèi)也加進(jìn)去。因此我們只需要記住一件事,這個(gè)price的金額就是所謂的總額了。
vii. payment_type支付類型,沒什么可說的直接寫成1,無需改動(dòng)。
viii. 物流信息logistics_type、logistics_fee、logistics_payment這是一組物流信息,實(shí)物標(biāo)準(zhǔn)雙接口中必須得至少有一組物流信息,也就是指這三個(gè)參數(shù)了,最多可有三組,哪三組呢?logistics_type_1、logistics_fee_1、 logistics_paymen
t_1(第二組);logistics_type_2、logistics_fee_2、logistics_payment_2(第三組)。后兩組為可選項(xiàng)。一般前面有說Price已經(jīng)是總額了且包含了運(yùn)費(fèi),那
么這里物流運(yùn)費(fèi)就直接設(shè)置成0即可,即logistics_fee=”0”,其他兩個(gè)的信息可參考技術(shù)文檔來填寫,因?yàn)橐獜募夹g(shù)文檔中的枚舉列表里來選擇,所以絕不可亂填寫。
b) 可增加的有用參數(shù)
i. 物流信息最多三組,最少一組,這已經(jīng)在前部分有所提及,這里就不再細(xì)說。
ii. _input_charset,當(dāng)是UTF-8的編碼格式時(shí)必須得用到且不允許為空的,即_input_charset=”utf-8”
iii. notify_url、return_url,return_url代表支付完畢后可以自動(dòng)從支付寶的官方頁面跳轉(zhuǎn)回來,notify_url這個(gè)是防止調(diào)單的首選最佳工具。
iv. body,在支付寶收銀臺(tái)中的商品描述里顯示,如果subject是訂單名稱的話,那么這個(gè)body則最準(zhǔn)確的稱之為訂單描述,其實(shí)個(gè)人認(rèn)為它作為備注之類的更為恰當(dāng)。很多人都很郁悶支付寶為何不能像其他公司
的接口有個(gè)自定義的參數(shù)來存放客戶想要的東西,其實(shí)body也具有類似的這種功能,它不僅容納的信息是所有參數(shù)里最大的,而且還是以字符串的形式儲(chǔ)存,個(gè)人認(rèn)為它其實(shí)也是非常重要的不可缺少的參數(shù)之一呢。
v. discount折扣,顧名思義如果小于0,則是用原金額Price*quantity+(discount),實(shí)際金額便比原總額小了?,F(xiàn)在有些商戶有支付寶的優(yōu)惠卷,而優(yōu)惠卷的用途也是在這個(gè)參數(shù)中體現(xiàn),具體做法與前
面無異。
vi. show_url商品展示地址,這個(gè)鏈接的作用是在支付寶收銀臺(tái)的商品鏈接旁邊有個(gè)下劃線“詳情”的鏈接,而點(diǎn)鏈接彈出的一個(gè)新頁面便是這個(gè)商品展示地址的頁面。
vii. 收貨信息receive_name、receive_address、receive_zip、receive_phone、 receive_mobile,這些信息若也設(shè)置為傳遞給支付寶的參數(shù)之一的話,那么在支付寶收銀臺(tái)點(diǎn)選下一步的時(shí)候,本該出現(xiàn)的填寫收貨信息頁面不見蹤影,而直接跳到了收貨信息頁面的下一個(gè)頁面去了。很多商戶在自己的網(wǎng)站的購物
流程中都有一個(gè)填寫收貨信息的選項(xiàng)卡,為了省去到支付寶收銀臺(tái)中還要填寫一次收貨信息的麻煩,那么這些收貨信息的參數(shù)就派上用場了。值得注意的是,收貨人姓名和地址是必填項(xiàng),不然還是會(huì)出現(xiàn)收貨信息填寫頁。
viii. buyer_email買家支付寶賬號(hào),這個(gè)設(shè)置好后呈現(xiàn)的效果便是,原本是空的支付寶賬號(hào)的輸入框此時(shí)已經(jīng)有個(gè)支付寶賬號(hào)在里面放置。
c) 剩下的參數(shù)無需理會(huì)

整個(gè)實(shí)物標(biāo)準(zhǔn)雙接口的參數(shù)介紹完畢,那么其他接口的參數(shù)還要介紹嗎?大家從上面分析得出的東西對(duì)比技術(shù)文檔的參數(shù)列表是否看出什么來了?

1、 參數(shù)列表的最后一列叫“可空”,N代表不允許為空,Y代表允許為空,結(jié)合上面的不可缺少參數(shù)與增加的有用參數(shù)來進(jìn)行比較,不難發(fā)現(xiàn),不可缺少的參數(shù)全是為N的。
2、 有些為Y的參數(shù)有一組,例如buyer_email、buyer_id,凡是遇到這種的一般都是二可選一也可都不選,或是二必選一。舉例說明:二必選一的是seller_email、seller_id,二選一的
是buyer_email、buyer_id。
所有的接口的參數(shù)如此分析就能判斷出哪些是重要參數(shù)哪些可不要,結(jié)合技術(shù)文檔與程序接口來研究就能一目了然。
--------------------------------------------------------

四、 通知返回
a) 返回頁
傳遞給支付寶時(shí)的return_url參數(shù)所對(duì)應(yīng)的頁面文件。
具備的屬性:
1、支付接口中買家的購買流程已經(jīng)走到支付寶里且支付寶提示支付成功時(shí),頁面會(huì)自動(dòng)跳轉(zhuǎn)回自身網(wǎng)站的這個(gè)頁面里來。
2、同步的,無時(shí)差
3、獲得參數(shù)的方法是用get方式獲取。
4、不論跳轉(zhuǎn)回來程序判斷是真還是假(if(sign = mysign and responseTxt = true))只跳轉(zhuǎn)回來一次,不重復(fù)。
5、這個(gè)并不是支付寶服務(wù)器調(diào)用了該頁面,而是通過與組合拼接各參數(shù)形成的URL鏈接原理等同,拼接出來的URL鏈接,之后程序上做自動(dòng)跳轉(zhuǎn)。
6、基于5的原因,該頁面的程序調(diào)試可不必在服務(wù)器上而是本機(jī)上調(diào)試、運(yùn)行。
b) 通知頁
傳遞給支付寶時(shí)的notify_url參數(shù)所對(duì)應(yīng)的頁面文件
具備的屬性:
1、這個(gè)通知頁就是被支付寶調(diào)用才能啟動(dòng)的。
2、服務(wù)器間的互動(dòng),不像返回頁肉眼可以看到,這個(gè)是看不到的。
3、獲得參數(shù)的方法是用POST方式獲取。
4、支付寶中的該筆交易存在,且該筆交易狀態(tài)發(fā)生了變更,就會(huì)被調(diào)用。
5、被調(diào)用程序判斷(if(sign = mysign and responseTxt = true)),若我們自己在該判斷中有做程序編寫,成功則不再被調(diào)用,不成功則會(huì)反復(fù)被調(diào)用。
6、異步的,第一次收到訂單信息(以下都稱之為“通知”)是與返回頁近乎等同或等同的同步時(shí)間,在判斷不成功的情況下,會(huì)收到第二次第三次等次數(shù)的通知,時(shí)間間隔從最先的一兩分鐘,到后面的幾個(gè)小時(shí)。失效時(shí)間是4
8小時(shí)。
7、基于6的原因,該頁面的程序調(diào)試必須在服務(wù)器上調(diào)試、運(yùn)行。
8、程序編寫時(shí)必須采用程序執(zhí)行成功,才寫頁面response.Write(“success”);,不成功則寫頁面response.Write(“fail”); 支付寶根據(jù)success來判定是否要重新再次發(fā)送通知。
9、該頁面的Html頁面中必須是空白、無任何Html標(biāo)簽、無任何空格、不允許做頁面跳轉(zhuǎn)。

以C# ASP.NET實(shí)物標(biāo)準(zhǔn)雙接口代碼為例:

if (mysign == sign && responseTxt == "true")
{
if (Request.Form["trade_status"] == "WAIT_BUYER_PAY")// 判斷支付狀態(tài)_等待買家付款(文檔中有枚舉表可以參考)
{
//更新自己數(shù)據(jù)庫的訂單語句,請(qǐng)自己填寫一下
}
else if (Request.Form["trade_status"] == "WAIT_SELLER_SEND_GOODS")// 判斷支付狀態(tài)_買家付款成功,等待賣家發(fā)貨(文檔中有枚舉表可以參考)
{
//更新自己數(shù)據(jù)庫的訂單語句,請(qǐng)自己填寫一下
string strOrderNO = Request.Form["out_trade_no"];//訂單號(hào)
string strPrice = Request.Form["price"];//金額
string sql = "update order_table set order_status = '買家已付款,等待賣家發(fā)貨' where order_no = @out_trade_no";
Update(sql,para);
}
else if (Request.Form["trade_status"] == "WAIT_BUYER_CONFIRM_GOODS")// 判斷支付狀態(tài)_賣家已發(fā)貨等待買家確認(rèn)(文檔中有枚舉表可以參考)
{
//更新自己數(shù)據(jù)庫的訂單語句,請(qǐng)自己填寫一下
string strOrderNO = Request.Form["out_trade_no"];//訂單號(hào)
string strPrice = Request.Form["price"];//金額
string sql = "update order_table set order_status = '賣家已發(fā)貨,等待買家確認(rèn)收貨' where order_no = @out_trade_no";
Update(sql, para);
}
else if (Request.Form["trade_status"] == "TRADE_FINISHED")// 判斷支付狀態(tài)_交易成功結(jié)束(文檔中有枚舉表可以參考)
{
//更新自己數(shù)據(jù)庫的訂單語句,請(qǐng)自己填寫一下
string strOrderNO = Request.Form["out_trade_no"];//訂單號(hào)
string strPrice = Request.Form["price"];//金額
string sql = "update order_table set order_status = '交易成功' where order_no = @out_trade_no";
Update(sql, para);
}
else
{
//更新自己數(shù)據(jù)庫的訂單語句,請(qǐng)自己填寫一下
}

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

c) 在支付寶的眾多接口中,不是所有的接口都擁有通知頁與返回頁的。
有的接口只有返回頁;有的接口有通知頁且用XML格式的內(nèi)容顯示在當(dāng)前頁面中;有的沒有通知頁也沒有返回頁僅僅只以XML格式的內(nèi)容顯示在當(dāng)前頁面中。所以,我們要根據(jù)各接口的技術(shù)文檔與程序?qū)嵗齺碜鱿鄳?yīng)的數(shù)據(jù)處
理。
d) 大家這里存在一個(gè)疑問,一般大家的做法都是把數(shù)據(jù)庫更新些在返回頁中,但是很多情況下出現(xiàn)了訂單不同步即掉單現(xiàn)象。這是為什么?
答:返回頁是當(dāng)前頁面自動(dòng)跳轉(zhuǎn)的,這雖然跳轉(zhuǎn)的反應(yīng)速度不錯(cuò),但人的手動(dòng)關(guān)閉該頁面操作絕對(duì)可以使之在沒有跳轉(zhuǎn)回來之前就關(guān)掉了該頁面,此時(shí)原本該數(shù)據(jù)庫更新的程序并沒有被啟動(dòng),這樣直接導(dǎo)致了掉單,所以一般大商
戶,尤其是網(wǎng)絡(luò)游戲行業(yè)的即時(shí)到帳充值的技術(shù)做法是:返回頁中有訂單處理程序,通知頁中也有,當(dāng)返回頁中的訂單沒做過處理時(shí),通知頁中的數(shù)據(jù)處理程序便啟動(dòng);這樣即可近乎100%解決掉單問題(還有種掉單原因是大家自己的服務(wù)器出現(xiàn)問題,比如MS3XML.DLL問題,這個(gè)問題至今沒有什么可以解決的辦法,只能重裝或是更換服務(wù)器,也有的服務(wù)器因?yàn)橹卸静艑?dǎo)致的)。本文來源于 http://www.k686.com/
-------------------------------------------------

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

----------------------------------------------------------

六、 其他
a) 有些接口,例如支付的接口,是支持POST或者GET方式傳遞參數(shù)的。
i. POST傳遞方式:
這里需要注意的地方是:<form action=” aliay_url” …>中action的值是網(wǎng)關(guān)+編碼格式參數(shù),即https://www.alipay.com/cooperate/gateway.do? _input_charset=utf-8,GBK的編碼格式可以為:https://www.alipay.com/cooperate /gateway.do?。
ii. GET傳遞方式:
是用&字符來連接起來的一長串URL鏈接字符串,通過自動(dòng)跳轉(zhuǎn)不是<form action=” aliay_url” …>的方式來存放,而是用Response.Redirect(aliay_url)方式來進(jìn)行跳轉(zhuǎn)。

請(qǐng)登錄后查看

CRMEB-慕白寒窗雪 最后編輯于2023-04-27 11:35:47

快捷回復(fù)
回復(fù)
回復(fù)
回復(fù)({{post_count}}) {{!is_user ? '我的回復(fù)' :'全部回復(fù)'}}
排序 默認(rèn)正序 回復(fù)倒序 點(diǎn)贊倒序

{{item.user_info.nickname ? item.user_info.nickname : item.user_name}} LV.{{ item.user_info.bbs_level || item.bbs_level }}

作者 管理員 企業(yè)

{{item.floor}}# 同步到gitee 已同步到gitee {{item.is_suggest == 1? '取消推薦': '推薦'}}
{{item.is_suggest == 1? '取消推薦': '推薦'}}
沙發(fā) 板凳 地板 {{item.floor}}#
{{item.user_info.title || '暫無簡介'}}
附件

{{itemf.name}}

{{item.created_at}}  {{item.ip_address}}
打賞
已打賞¥{{item.reward_price}}
{{item.like_count}}
{{item.showReply ? '取消回復(fù)' : '回復(fù)'}}
刪除
回復(fù)
回復(fù)

{{itemc.user_info.nickname}}

{{itemc.user_name}}

回復(fù) {{itemc.comment_user_info.nickname}}

附件

{{itemf.name}}

{{itemc.created_at}}
打賞
已打賞¥{{itemc.reward_price}}
{{itemc.like_count}}
{{itemc.showReply ? '取消回復(fù)' : '回復(fù)'}}
刪除
回復(fù)
回復(fù)
查看更多
打賞
已打賞¥{{reward_price}}
3700
{{like_count}}
{{collect_count}}
添加回復(fù) ({{post_count}})

相關(guān)推薦

快速安全登錄

使用微信掃碼登錄
{{item.label}} 加精
{{item.label}} {{item.label}} 板塊推薦 常見問題 產(chǎn)品動(dòng)態(tài) 精選推薦 首頁頭條 首頁動(dòng)態(tài) 首頁推薦
取 消 確 定
回復(fù)
回復(fù)
問題:
問題自動(dòng)獲取的帖子內(nèi)容,不準(zhǔn)確時(shí)需要手動(dòng)修改. [獲取答案]
答案:
提交
bug 需求 取 消 確 定
打賞金額
當(dāng)前余額:¥{{rewardUserInfo.reward_price}}
{{item.price}}元
請(qǐng)輸入 0.1-{{reward_max_price}} 范圍內(nèi)的數(shù)值
打賞成功
¥{{price}}
完成 確認(rèn)打賞

微信登錄/注冊(cè)

切換手機(jī)號(hào)登錄

{{ bind_phone ? '綁定手機(jī)' : '手機(jī)登錄'}}

{{codeText}}
切換微信登錄/注冊(cè)
暫不綁定
CRMEB客服

CRMEB咨詢熱線 咨詢熱線

400-8888-794

微信掃碼咨詢

CRMEB開源商城下載 源碼下載 CRMEB幫助文檔 幫助文檔
返回頂部 返回頂部
CRMEB客服