支付宝即时到帐接口无法回调及其解决过程

    前段时间公司在紧锣密鼓的筹备一项社区商务项目,既然做电商,支付接口就必不可少,下面我们就看一下我在集成支付接口时所遇到的问题。

    企业帐号在申请即时到帐支付接口后,便可下载官方的支付接口集成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地址来绑定本地站点。当然,对于已经上线的项目,域名能够顺利解析,也就不会有这种问题了。

自此,问题解决!

项目中还遇到支付宝退款接口无法同步回调等问题,笔者就不在此文中赘述,大家可在留言中一起交流讨论。

posted @ 2014-10-27 23:45  TinyLeon  阅读(23169)  评论(6编辑  收藏  举报