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


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

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

    自此,问题解决!

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

  • 相关阅读:
    Java技术体系
    博客开篇
    在Web api2 中传递复杂参数的一点心得
    java内存区域
    nginx负载均衡配置
    nginx反向代理配置
    nginx部署静态网站
    nginx在Centos7.5下源码安装和配置
    Java中的类 serialVersionUID 在序列化的时候有什么用?
    linux开放防火墙端口
  • 原文地址:https://www.cnblogs.com/smartLeon/p/4049983.html
Copyright © 2020-2023  润新知