支付宝即时到帐接口无法回调及其解决过程
前段时间公司在紧锣密鼓的筹备一项社区商务项目,既然做电商,支付接口就必不可少,下面我们就看一下我在集成支付接口时所遇到的问题。
企业帐号在申请即时到帐支付接口后,便可下载官方的支付接口集成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地址来绑定本地站点。当然,对于已经上线的项目,域名能够顺利解析,也就不会有这种问题了。
自此,问题解决!
项目中还遇到支付宝退款接口无法同步回调等问题,笔者就不在此文中赘述,大家可在留言中一起交流讨论。