新版支付宝手机网站支付接口alipay.trade.wap.pay同步回调已经不返回交易状态trade_status,同步的不返回状态感觉不能写数据库操作了,同步回调只能作跳转用吗?看过其他大神的例子以前的旧版接口alipay.wap.direct异步和同步回调里面因为有交易状态(交易成功,失败等)返回。在写的逻辑基本可以一模一样,两者都是判断完trade_status是否等于TRADE_SUCCESS,因为同步异步不知道谁的速度返回快,两者都是先查询订单状态是否已经更改为付款状态,是的就不作数据库操作,否就进行更改状态等一系列数据库操作。而且旧版的return_url是叫同步通知,新版的return_url叫前台回跳,难道改版是为了return_url只作跳转用吗,数据库就由notify_url来处理,这样理解对不对?return_url里面应该怎么写?旧版支付接口:https://doc.open.alipay.com/docs/doc.htm?spm=a219a.7629140.0.0.o73CpK&treeId=60&articleId=104790&docType=1#s2
新版支付接口:https://doc.open.alipay.com/doc2/detail.htm?treeId=203&articleId=105463&docType=1#s3

解决方案 »

  1.   

    那我return_url里面该写什么判断啊?新版接口的return_url的get返回值已经不提供是否成功支付了,是不是不能做数据库操作(例如订单状态更新),直接跳回自己的网站算了?
      

  2.   

    谢谢大哥
    新版接口return_url接收的参数,已经没有trade_status返回了:
        [total_amount] => 50.00
        [timestamp] => 2017-01-23 10:28:11
        [sign] => ehp6Yvislw7ga7fh8fUwybiNtwiJ+xOAn+io58bUhww2qY8sYIKad6Te0CDOhkP2PEGBukJklTBhoS5/9IUwNGFeysUbb2Nk/RqVGVO9+LpJczGJ84npfk4UTDqbNpywaWcWdMtb1nli0IxwQkWNd41UpkKLS+I1xq9HwBWGyqA=
        [trade_no] => 2017012321001004480200233814
        [sign_type] => RSA
        [auth_app_id] => 2016073100135245
        [charset] => UTF-8
        [seller_id] => 2088102169336823
        [method] => alipay.trade.wap.pay.return
        [app_id] => 2016073100135245
        [out_trade_no] => 20170123102709751737
        [version] => 1.0
      

  3.   

    交易状态trade_status 可以根据out_trade_no去调用支付宝API获取的。
    return_url你可以跳转到判断是否支付成功的页面。
      

  4.   

    你意思是在return_url中调用一次查询接口吗,然后根据查询接口返回值判断跳转的页面?这些理解对不对
      

  5.   


    对的,就是这个意思。
    只有支付宝通过你定义的接口notify_url返回的才不需要再请求多次api获取状态。
    同步跳转回来的,都需要调用接口判断状态是否支付成功,这样比较安全。
      

  6.   

    在SDK 有例子:
    调用接口同步的
      Dictionary<string, string> sArray = GetRequestGet();
                if (sArray.Count != 0)
                {
                    bool flag = AlipaySignature.RSACheckV1(sArray, config.alipay_public_key, config.charset, config.sign_type, false);
                    if (flag)
                    {
                        Response.Write("同步验证通过");
                    }
                    else
                    {
                        Response.Write("同步验证失败");
                    }
                } public Dictionary<string, string> GetRequestGet()
            {
                int i = 0;
                Dictionary<string, string> sArray = new Dictionary<string, string>();
                NameValueCollection coll;
                //coll = Request.Form;
                coll = Request.QueryString;
                String[] requestItem = coll.AllKeys;
                for (i = 0; i < requestItem.Length; i++)
                {
                    sArray.Add(requestItem[i], Request.QueryString[requestItem[i]]);
                }
                return sArray;        }
    异步的
         //Dictionary<string, string> sArray = GetRequestPost();
                //if (sArray.Count != 0)
                //{
                //    bool flag = AlipaySignature.RSACheckV1(sArray, config.alipay_public_key, config.charset, config.sign_type, false);
                //    if (flag)
                //    {
                //        //交易状态
                //        //判断该笔订单是否在商户网站中已经做过处理
                //        //如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序
                //        //请务必判断请求时的total_amount与通知时获取的total_fee为一致的
                //        //如果有做过处理,不执行商户的业务程序            //        //注意:
                //        //退款日期超过可退款期限后(如三个月可退款),支付宝系统发送该交易状态通知
                //        string trade_status = Request.Form["trade_status"];            //        Response.Write("success");
                //    }
                //    else
                //    {
                //        Response.Write("fail");
                //    }
                //}
      public Dictionary<string, string> GetRequestPost()
            {
                int i = 0;
                Dictionary<string, string> sArray = new Dictionary<string, string>();
                NameValueCollection coll;
                //coll = Request.Form;
                coll = Request.Form;
                String[] requestItem = coll.AllKeys;
                for (i = 0; i < requestItem.Length; i++)
                {
                    sArray.Add(requestItem[i], Request.Form[requestItem[i]]);
                }
                return sArray;        }