前段時間公司在緊鑼密鼓的籌備一項社區商務項目,既然做電商,支付接口就必不可少,下面我們就看一下我在集成支付接口時所遇到的問題。
企業帳號在申請即時到帳支付接口后,便可下載官方的支付接口集成demo,我廠大部分項目都采用C#.net,故以C#集成支付接口。
閑話少說,上代碼,下面是支付寶接口的核心代碼:
1 //把請求參數打包成數組 2 SortedDictionary<string, string> sParaTemp = new SortedDictionary<string, string>(); 3 sParaTemp.Add("partner", merchantPayInfo.Apartner); 4 sParaTemp.Add("_input_charset", Config.Input_charset.ToLower()); 5 sParaTemp.Add("service", "create_direct_pay_by_user"); 6 sParaTemp.Add("payment_type", "1"); 7 sParaTemp.Add("notify_url", notify_url); 8 sParaTemp.Add("return_url", return_url); 9 sParaTemp.Add("seller_email", merchantPayInfo.SellerEmail); 10 sParaTemp.Add("out_trade_no", OrderNo); 11 sParaTemp.Add("subject", ProductName); 12 sParaTemp.Add("total_fee", OrderPrice); 13 sParaTemp.Add("body", ""); 14 sParaTemp.Add("show_url", ""); 15 sParaTemp.Add("anti_phishing_key", ""); 16 sParaTemp.Add("exter_invoke_ip", ""); 17 sParaTemp.Add("extend_param", ""); 18 19 var submit = new Submit(merchantPayInfo.Akey); 20 //建立請求 21 string sHtmlText = submit.BuildRequest(sParaTemp, "get", "確認"); 22 Response.ContentType = "text/html"; 23 Response.Write(sHtmlText); 24 Response.End();
其中必填的一些參數包括:訂單號,訂單價格。當然也要填寫同步回調的url,異步回調的url,商品名稱等,最后建立請求,我們會跳轉到如下頁面:

那么,問題來了:支付成功后,我們需要從支付寶的支付頁面回調到我們自己的系統,通常需要更新訂單狀態,計算銷量等,但是,即時到帳支付成功后卻不能回調,這讓我們傷透腦筋。雖然支付接口有異步調用url,並且會在24小時內調用多次,當然在前一次調用失敗的情況下。
但同步回調必不可少,同步回調過程中,支付接口會返回給我們交易號,訂單號等信息,這些記錄都是有用處的。在后續的退款接口集成中,這些數據必不可少。
為了解決這個問題,筆者聯系了采用了多種方案,最后將同步回調的url改為任意一個眾所周知的網站,比如http://www.baidu.com/。結果驚喜的發現,支付接口成功回調了!並在百度的url中附帶了我們需要的交易號等數據。
這時我們能發現:同步回調失敗,並不是支付接口出現了異常,而是我們的同步回調url有問題。這里筆者仍發現了一個奇怪的現象:如果用手機掃碼支付,那么支付成功后是能夠順利回調的,而輸入帳號支付,卻回調失敗。所以筆者不曾懷疑是同步回調的url有異常。
后來咨詢了支付寶接口的客服,了解到:手機掃碼支付和帳號支付,回調采用的重定向機制是不同的,自此,心里的一塊小石頭落地。
那么帳號支付后,如何才能正常回調呢?原來是我的本地站點,用的是主機名+端口號的組合,支付接口回調不能找到對應的回調url,即認為該url不合法。所以建議大家使用ip地址來綁定本地站點。當然,對於已經上線的項目,域名能夠順利解析,也就不會有這種問題了。
自此,問題解決!
項目中還遇到支付寶退款接口無法同步回調等問題,筆者就不在此文中贅述,大家可在留言中一起交流討論。
