JobPlus知识库 IT 大数据 文章
ASP.NET MVC 支付宝sdk 查询订单状态 填坑攻略

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

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

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

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


这个接口有个大坑

    如下图

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

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


[javascript] 

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


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

alipay.trade.query    会返回   "msg" :"Success"  但是值得注意的是receipt_amount 即 实际收到的钱 为 0  ,  trade_status 为 等待买家支付   
如下:

[javascript] 

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


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

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

[csharp] 

  1. //验证当前订单的状态  
  2.      [NoPermissionRequiredAttribute]  
  3.      public ActionResult GetOrderStatus(string out_trade_no, string trade_no="")  
  4.      {  
  5.          const string URL = "https://openapi.alipaydev.com/gateway.do";  //沙箱环境与正式环境不同 这里要用沙箱的 支付宝地址  
  6.          // APPID即创建应用后生成  
  7.          const string APPID = "2016091500513966";  
  8.          //开发者应用私钥,由开发者自己生成  开发者私钥到底是什么玩意  原来开发者私钥就是商户应用私钥  
  9.          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";  
  10.          //参数返回格式,只支持json  
  11.          const string FORMAT = "json";  
  12.          //请求和签名使用的字符编码格式,支持GBK和UTF-8  
  13.          const string CHARSET = "UTF-8";  
  14.          //支付宝公钥,由支付宝生成     到蚂蚁金服复制  
  15.          const string ALIPAY_PUBLIC_KEY = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEApdBe/PUjBBEwYM4/H9clg0yrD1f8KoFusXqgiL4OegnizB2M4lGq7kCkXgwTIxJcOnaLTq2PsE/f0DFNq9GW3xxuLeioh0pjUqG4KV7bFhNy2Wipeja6A+IX1wbhH1AcHYfoGBVjfqEPvqvNWJPCE2ClAZLkNv2pwbC1cKXG48jKX9iVcCmJBl/qgMAcYfgdm37zjcdcgsd/EfHGT8HtiYb08UR+olsxG6Pi7nfc+yLaqGNJyhu6L6lgnQBUxD+fjrFFwPrF6fE0MMm7dljWRO8HiZTTjt8ia4rs8Be05dkd3IDRCoWTcNAd9+tTxV62gcw6rMM92zXMWlzWePk4NQIDAQAB";  
  16.   
  17.   
  18.          DefaultAopClient client = new DefaultAopClient(URL, APPID, APP_PRIVATE_KEY, FORMAT, "1.0", "RSA2", ALIPAY_PUBLIC_KEY, CHARSET, false);  
  19.          AlipayTradeQueryRequest request = new AlipayTradeQueryRequest();  
  20.          
  21.          StringBuilder content = new StringBuilder();  
  22.          //支付宝订单号和 商户订单号可以 任填其一 也可以两个都填, 填两个的情况优先用 trade_no   
  23.          content.Append("{");  
  24.          content.AppendFormat("\"out_trade_no\":\"{0}\",", out_trade_no.Trim());  
  25.         /* content.AppendFormat("\"trade_no\":\"{0}\"", trade_no.Trim());*/ //这一步是不可能得到trade_no的  
  26.          content.Append("}");  
  27.          request.BizContent = content.ToString();  
  28.   
  29.          AlipayTradeQueryResponse response = client.Execute(request);  
  30.          return Json(response.Body);  
  31.      }  

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

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


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

这就成功了.


如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!

¥ 打赏支持
344人赞 举报
分享到
用户评价(0)

暂无评价,你也可以发布评价哦:)

扫码APP

扫描使用APP

扫码使用

扫描使用小程序