ASP.NET MVC 支付宝sdk 查询订单状态 填坑攻略

1.alipay.trade.query(统一收单线下交易查询)

前情提要:  请把扫码支付分解为两步理解    

扫码成功 : 客户的支付宝软件会发送支付宝(注这里不再经过我们开发的服务器)第一次请求创建订单,

支付成功 :客户的支付宝软件会发送到支付宝(注这里不再经过我们开发的服务器)请求改变之前创建订单的 状态 和 部分值

这个接口有个大坑

    如下图


客户扫码前是得不到 trade_no的 , 客户未扫码就调用

alipay.trade.query  得到的结果会是 交易不存在.  如下

 {"alipay_trade_query_response":{"code":"40004",
	"msg":"Business Failed",
	"sub_code":"ACQ.TRADE_NOT_EXIST",
	"sub_msg":"交易不存在",
	"buyer_pay_amount":"0.00",
	"invoice_amount":"0.00",
	"out_trade_no":"20150320010101031",
	"point_amount":"0.00",
	"receipt_amount":"0.00"
},
"sign":"MdKcd3mz6cpl+Z/u0ypmWQoeiFfJg1Z0DdXsUlsxumVzwxkkhBKgC/x6wIyUle1gm6Z6Pe+lpzzGzfenw4+tuv3xCi0MK53wt6lEiCKOKYPjpQRjcjEYuSTh+ZvUDvd+zRCZzkXMhsccM96WA+mA5LvyVAxJh92cRCaJhKuxYFklsY5wF1k93+Nhco9YQeEO5QMRwtg3Nw618m8c6zKacmM8YuRtmpGdZMlF9dwfOnnNu4v+DSwk4xwwLlL+LU+6wY63rX3GaIZhVCIIFz15MhxUaTgqNv1GDkg5z2oScFMuMIYWiPVQnlh7Ag69OdRv5lsCg8qkh42UKOWR1CeFzw=="
}

客户扫码但是未支付的情况下调用   

alipay.trade.query    会返回   "msg" :"Success"  但是值得注意的是receipt_amount 即 实际收到的钱 为 0  ,

  trade_status 为 等待买家支付   
如下:

{"alipay_trade_query_response":{"code":"10000",
"msg":"Success",
"buyer_logon_id":"gai***@sandbox.com",
"buyer_pay_amount":"0.00",
"buyer_user_id":"2088102176080898",
"buyer_user_type":"PRIVATE",
"invoice_amount":"0.00",
"out_trade_no":"20150320010101033",
"point_amount":"0.00",
"receipt_amount":"0.00",   //实际收到的金额
"total_amount":"88.88",
"trade_no":"2018051221001004890200422558",
"trade_status":"WAIT_BUYER_PAY"},
"sign":"JS19aBJTktrJ3LGhccVh26XgN56/MTEbL+9wM/R5MiyOEZW+v9l/TtDv9X/FN8IMVJom0XQN/ZKKVHHjwG0LUbUuB85iRPpoewHUTCihLeMt6Wg7aFYF+amtrbPPS3RtCt6MXNzroTmxvQyzZToQG0Pe2dI2ZnpfAGFL8HPb4I/9UBN9tCls81HahKTSnaL1XcP7Vnwoz9RrRgIB3yu92kpRADYiw/6SzM1qJiQbDJMvTjPezZ5H0jMzOrmQNKN+8yHW1bqnGhx07cnEd4ZY8MrOSLTc88pvegBn3FPg3U7HcvmoLtK80VTM95S8JpdoqOoz07P4KYgPmWwGG854qw=="}

如果当前只是到了获取都二维码 --->等待用户扫码   的这一步

我们只有 out_trade_no   所以我传参时只传了一个 out_trtade_no  代码如下:

   //验证当前订单的状态
        [NoPermissionRequiredAttribute]
        public ActionResult GetOrderStatus(string out_trade_no, string trade_no="")
        {
            const string URL = "https://openapi.alipaydev.com/gateway.do";  //沙箱环境与正式环境不同 这里要用沙箱的 支付宝地址
            //	APPID即创建应用后生成
            const string APPID = "2016091500513966";
            //开发者应用私钥,由开发者自己生成  开发者私钥到底是什么玩意  原来开发者私钥就是商户应用私钥
            const string APP_PRIVATE_KEY = "MIIEowIBAAKCAQEArVWg55eFMf7rFLVpFAxGgMQfxGWd7swqxNkOu1Y/0Wt14HZik4+U0kycQuYtOFBbwael8vlr/Q+BaqtpwwI+g+yJVma+uLYkmVaWHqswh1XocX3gOfLWxFp1DwPcNesFpbZ9wndxrZL9+wWMtbiB4TV3jBAcFbAzOgLvH4+IveS88H6jjTTpHeogxJpZ0EU37Nucpsae2yiJJyACmgZDlY3qEABkFpiaD2Kc+EvGDPXyEKSufv8f+GxUTKgE25c0NhP9hSJPND1+reygiJy4sFIEuZ5960LRd/1kJgUIuW+JgA50AXI/SXEzHqBJO0ZvT9hZjSIbOtvGjbQp+d9azwIDAQABAoIBAHQjJn9l13nLKqmibzhejTKjtgE6cNpac+GW6bb9sB7aGI3/5EaocneBm0V7whq0RPZ5JMiq8/8Hz5ewKFnf/BEagF6i0vEiIV2YVVdRLl/PYMICLCXHnrzLOxmHZZm+0fbZUmPk8gbxsTjq2/+6E1PZJjNza83gVEJvStbjriRErp5LwMYCO3Qz3KDaPHFUaP5IRR6b+qJeLbrArFNv3zKV9b3TRe1loSIqrUfgSfW7Qh8rEjTub0BxjFqkOeVUrCPlrNz4NqTjOmPBf1tJ+xLFXsYlom4mGoaXKx9UIQgirLkh++HM+fHHrsICg3CA1tKBjf6OYXqLsvsXCd7T0okCgYEA4Yrrhzgmp9OWt1HS5HkAAlErYQoal6JrmfWd5cZOMwgp5YqmfXoV/QgwC0mbXun01JshgnOsmKy2GiOeUlsCRLhGJCm0piI/o9pSwiUyhe65AFLltyQJXmAVWsCeXjyEDDXSheZ1dL6akjVcs4dKSA+E3+lYs+m3mHBy7cXD8esCgYEAxL3bFNAe3iYqnt0/Ncv1SM7cxYJTZMjtEOiVp3sMvcgQCPPzl5CONkIuNKT5F4o8BCMQU0AzzDHxyxAuaspT4EcXQvCm5UIi5BioYnq0IEVVxuRa+AT6bHLxdyd0wsAzEhbrncUGe2ncQ1SKLuKy7UygCA3DBn++v0aqPrGX3a0CgYBPKtAZmqAW8LJKjrIT+FUEezFa0o0bBKv4Urql2MHCL+9k3xIpoRzuwFz82U1sN3r01a8hdzDyNk2FR1NfXQqizHvyXaFHX2YvQYcjFqNxV6YgcvinHEMdmWRlgo8UTPGcx5ep4IcB/5WKFKkBa0+rk6b0YZf9LuB+5Zmx1GU/GQKBgQCufahp7DAEXRtd7OJcBznTykx6DB2EfMPtRCs+8F6bj23RUvQPz9ChhM7QOCUIYLzb+nFHNOD70KwfqolQg4QinUqfPyr2mFKztL7bIPLS0EvEa9HWuSuVtdg9Esx20do5yARO2GjoWjpVqQwpizygRF6G5hW7lN8LbFQf6IjFvQKBgBdlb1h1rfJcPjkFGyIgr7B36eCrKdlRvNVsnMiqXi+3z5kbYXyePEiIfRYolg7UZI2tAAuHFZmxWwSFccREwKvs1rXSqWs0LqvaR7UizGxDq6AUdtz60jfsnkq6RAqwlA2m5ZW0Kf0QivElWxV1pM71ddU7evUNZTOgwL6qX1oG";
            //参数返回格式,只支持json
            const string FORMAT = "json";
            //请求和签名使用的字符编码格式,支持GBK和UTF-8
            const string CHARSET = "UTF-8";
            //支付宝公钥,由支付宝生成     到蚂蚁金服复制
            const string ALIPAY_PUBLIC_KEY = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEApdBe/PUjBBEwYM4/H9clg0yrD1f8KoFusXqgiL4OegnizB2M4lGq7kCkXgwTIxJcOnaLTq2PsE/f0DFNq9GW3xxuLeioh0pjUqG4KV7bFhNy2Wipeja6A+IX1wbhH1AcHYfoGBVjfqEPvqvNWJPCE2ClAZLkNv2pwbC1cKXG48jKX9iVcCmJBl/qgMAcYfgdm37zjcdcgsd/EfHGT8HtiYb08UR+olsxG6Pi7nfc+yLaqGNJyhu6L6lgnQBUxD+fjrFFwPrF6fE0MMm7dljWRO8HiZTTjt8ia4rs8Be05dkd3IDRCoWTcNAd9+tTxV62gcw6rMM92zXMWlzWePk4NQIDAQAB";


            DefaultAopClient client = new DefaultAopClient(URL, APPID, APP_PRIVATE_KEY, FORMAT, "1.0", "RSA2", ALIPAY_PUBLIC_KEY, CHARSET, false);
            AlipayTradeQueryRequest request = new AlipayTradeQueryRequest();
          
            StringBuilder content = new StringBuilder();
            //支付宝订单号和 商户订单号可以 任填其一 也可以两个都填, 填两个的情况优先用 trade_no 
            content.Append("{");
            content.AppendFormat("\"out_trade_no\":\"{0}\",", out_trade_no.Trim());
           /* content.AppendFormat("\"trade_no\":\"{0}\"", trade_no.Trim());*/ //这一步是不可能得到trade_no的
            content.Append("}");
            request.BizContent = content.ToString();

            AlipayTradeQueryResponse response = client.Execute(request);
            return Json(response.Body);
        }

如上代码  我注释了  trade_no   这导致了  返回的结果一直是参数错误


我到处找错误 ,最后发现相当重要:
  trade_no  即便是空你也得写上   不能省略

我们再来看一下 取消注释的结果:


这就成功了.

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 9
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值