前情提要: 请把扫码支付分解为两步理解
扫码成功 : 客户的支付宝软件会发送支付宝(注这里不再经过我们开发的服务器)第一次请求创建订单,
支付成功 :客户的支付宝软件会发送到支付宝(注这里不再经过我们开发的服务器)请求改变之前创建订单的 状态 和 部分值
这个接口有个大坑
如下图
客户扫码前是得不到 trade_no的 , 客户未扫码就调用
{"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_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 这导致了 返回的结果一直是参数错误
我们再来看一下 取消注释的结果:
这就成功了.