支付寶接口如何保證用戶支付完成數據庫狀態同步
廣告:
用戶支付成功頁面,該頁面有短暫的停留時間,買家看到這個提示信息后有可能會把當前頁面關掉,導致頁面沒有自動跳轉回商戶網站(return_url)使得商戶的業務數據沒有被處理(如:訂單沒有更新)。出現這種情況的原因是:商戶網站的支付寶接口并沒有利用服務器異步通知頁面文件(notify_url)或是該頁面在訂單執行過程中也出現異常。
解決方法:
解決人員:商戶網店開發、維護或管理的程序開發技術人員、商戶網店系統提供商
解決步驟:
1、打開return_url頁面文件(參數參數return_url對應返回文件),找到已經編寫好的業務邏輯處理程序代碼段,對其增加防止該筆交易被重復處理判斷。
2、打開notify_url頁面文件(參數參數notify_url對應返回文件),找到可插入商戶的業務邏輯處理程序代碼的地方,編寫與return_url頁面文件中相類似的程序,也需要包含防止該筆交易被重復處理的判斷。
如:
'——請根據您的業務邏輯來編寫程序(以上代碼僅作參考)——
'Response.Write "驗證成功<br>"
userid=0
if request.Cookies("member")("userid")<>"" then
userid = request.Cookies("member")("userid")
end if
'根據訂單號更新訂單,把訂單處理成交易成功
conn.execute("update mvc_order set paystate='已付款',trade_no=' " & trade_no & " ' where ordernum='" & out_trade_no & "' ")
修改完成后效果:
當買家關掉自動跳轉回商戶網站的返回頁面(參數return_url對應的return_url返回文件)時,商戶的業務處理依舊被notify_url頁面文件所執行,因此就不會發生業務沒有同步的現象出現(如:訂單沒有被更新)
注意:
1、注意獲取值的方式,notify_url頁面文件是POST方式獲。╮equest.form("參數名 ")、$_POST['參數名']),return_url頁面文件是GET方式獲。╮equest.querrystring("參數名 ")、$_GET['參數名'])
2、notify_url文件的特性是:
1、 必須保證服務器異步通知頁面(notify_url)上無任何字符,如空格、HTML標簽、開發系統自帶拋出的異常提示信息等;
2、 該頁面中獲得參數的方式,需要使用POST方式獲取,如:
request.Form(“out_order_no”)、$_POST['out_order_no'];
3、 支付寶主動發起通知,該方式才會被啟用;
4、 只有在支付寶的交易管理中存在該筆交易,且發生了交易狀態的改變,支付寶才會通過該方式發起服務器通知(即時到賬中交易狀態為“等待買家付款”的狀態默認是不會發送通知的);
5、 服務器間的交互,不像頁面跳轉同步服務器異步通知頁面可以在頁面上顯示出來,這種交互方式是不可見的;
6、 第一次交易狀態改變(即時到賬中此時交易狀態是交易完成)時,不僅頁面跳轉同步通知頁面會啟用,而且服務器異步通知頁面也會收到支付寶發來的處理結果通知;
7、 程序執行完后必須打印輸出“success”(不包含引號)。如果商戶反饋給支付寶的字符不是success這7個字符,支付寶服務器會不斷重發通知,直到超過24小時22分鐘。
在25小時內完成6~10次通知(通知頻率:5s,2m,10m,15m,1h,2h,6h,15h);
8、 程序執行完成后,該頁面不能執行頁面跳轉。如果執行頁面跳轉,支付寶會收不到success字符,會被支付寶服務器判定為該頁面程序運行出現異常,而重發處理結果通知;
9、 cookies、session等在此頁面會失效,即無法獲取這些數據;
10、 該方式的調試與運行必須在服務器上,即互聯網上能訪問;
11、 該方式的作用主要防止訂單丟失,即頁面跳轉同步服務器異步通知頁面沒有處理訂單更新,它則去處理;
12、 通知ID(參數notify_id)只有一分鐘有效期,超過一分鐘該次通知會驗證失敗。一旦驗證成功下次再驗證就會失效。
"如果您依照以上方法還無法解決,可提交集成申請,我們的技術支持會及時與您聯系,協助您解決。
申請地址:https://b.alipay.com/support/helperApply.htm?action=supportHome"
廣告: