前段时间公司在紧锣密鼓的筹备一项社区商务项目,既然作电商,支付接口就必不可少,下面咱们就看一下我在集成支付接口时所遇到的问题。html
企业账号在申请即时到账支付接口后,即可下载官方的支付接口集成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小时内调用屡次,固然在前一次调用失败的状况下。ui
但同步回调必不可少,同步回调过程当中,支付接口会返回给咱们交易号,订单号等信息,这些记录都是有用处的。在后续的退款接口集成中,这些数据必不可少。url
为了解决这个问题,笔者联系了采用了多种方案,最后将同步回调的url改成任意一个众所周知的网站,好比http://www.baidu.com/。结果惊喜的发现,支付接口成功回调了!并在百度的url中附带了咱们须要的交易号等数据。spa
这时咱们能发现:同步回调失败,并非支付接口出现了异常,而是咱们的同步回调url有问题。这里笔者仍发现了一个奇怪的现象:若是用手机扫码支付,那么支付成功后是可以顺利回调的,而输入账号支付,却回调失败。因此笔者未曾怀疑是同步回调的url有异常。.net
后来咨询了支付宝接口的客服,了解到:手机扫码支付和账号支付,回调采用的重定向机制是不一样的,自此,内心的一块小石头落地。code
那么账号支付后,如何才能正常回调呢?原来是个人本地站点,用的是主机名+端口号的组合,支付接口回调不能找到对应的回调url,即认为该url不合法。因此建议你们使用ip地址来绑定本地站点。固然,对于已经上线的项目,域名可以顺利解析,也就不会有这种问题了。htm
自此,问题解决!
项目中还遇到支付宝退款接口没法同步回调等问题,笔者就不在此文中赘述,你们可在留言中一块儿交流讨论。