商户订单号查询订单

更新时间:2024.12.27

订单支付成功后,商户可使用微信订单号查询订单或商户订单号查询订单;若订单未支付,则只能使用商户订单号查询订单。

接口说明

支持商户:【普通商户】

请求方式:【GET】/v3/pay/transactions/out-trade-no/{out_trade_no}

请求域名:【主域名】https://api.mch.weixin.qq.com 使用该域名将访问就近的接入点

     【备域名】https://api2.mch.weixin.qq.com 使用该域名将访问异地的接入点 ,指引点击查看

请求参数

Header HTTP头参数

Authorization  必填 string

请参考签名认证生成认证信息


Accept  必填 string

请设置为application/json


path 路径参数

out_trade_no  必填 string(32)

【商户订单号】 商户下单时传入的商户系统内部订单号。


query 查询参数

mchid  必填 string(32)

【商户号】商户下单时传入的商户号。

请求示例

Java
Go
curl

需配合微信支付工具库 WXPayUtility 使用,请参考 Java 

1package com.java.demo;
2
3import com.google.gson.annotations.Expose;
4import com.google.gson.annotations.SerializedName;
5import com.java.utils.WXPayUtility; // 引用微信支付工具库 参考:https://pay.weixin.qq.com/doc/v3/merchant/4014931831
6import java.io.IOException;
7import java.io.UncheckedIOException;
8import java.security.PrivateKey;
9import java.security.PublicKey;
10import java.util.ArrayList;
11import java.util.HashMap;
12import java.util.List;
13import java.util.Map;
14import okhttp3.MediaType;
15import okhttp3.OkHttpClient;
16import okhttp3.Request;
17import okhttp3.RequestBody;
18import okhttp3.Response;
19
20/**
21 * 微信支付商户订单号查询订单
22 */
23public class QueryByOutTradeNo {
24  private static String HOST = "https://api.mch.weixin.qq.com";
25  private static String METHOD = "GET";
26  private static String PATH = "/v3/pay/transactions/out-trade-no/{out_trade_no}";
27
28  public static void main(String[] args) {
29    // TODO: 请准备商户开发必要参数,参考:https://pay.weixin.qq.com/doc/v3/merchant/4013070756
30    QueryByOutTradeNo client = new QueryByOutTradeNo(
31        "填入 商户号",                  // 商户号,是由微信支付系统生成并分配给每个商户的唯一标识符,商户号获取方式参考https://pay.weixin.qq.com/doc/v3/merchant/4013070756
32        "填入 商户API证书序列号",       // 商户API证书序列号,如何获取请参考https://pay.weixin.qq.com/doc/v3/merchant/4013053053
33        "填入 商户API证书私钥文件路径", // 商户API证书私钥文件路径,本地文件路径
34        "填入 微信支付公钥ID",          // 微信支付公钥ID,如何获取请参考https://pay.weixin.qq.com/doc/v3/merchant/4013038816
35        "填入 微信支付公钥文件路径"     // 微信支付公钥文件路径,本地文件路径
36    );
37
38    QueryByOutTradeNoRequest request = new QueryByOutTradeNoRequest();
39    request.outTradeNo = "1217752501201407033233368018";
40    request.mchid = "1230000109";
41    try {
42      DirectAPIv3QueryResponse response = client.run(request);
43
44      // TODO: 请求成功,继续业务逻辑
45      System.out.println(response);
46    } catch (WXPayUtility.ApiException e) {
47      // TODO: 请求失败,根据状态码执行不同的逻辑
48      e.printStackTrace();
49    }
50  }
51
52  public DirectAPIv3QueryResponse run(QueryByOutTradeNoRequest request) {
53    String uri = PATH;
54    uri = uri.replace("{out_trade_no}", WXPayUtility.urlEncode(request.outTradeNo));
55    Map<String, Object> args = new HashMap<>();
56    args.put("mchid", request.mchid);
57    uri = uri + "?" + WXPayUtility.urlEncode(args);
58
59    Request.Builder reqBuilder = new Request.Builder().url(HOST + uri);
60    reqBuilder.addHeader("Accept", "application/json");
61    reqBuilder.addHeader("Wechatpay-Serial", wechatPayPublicKeyId);
62    reqBuilder.addHeader("Authorization", WXPayUtility.buildAuthorization(mchid, certificateSerialNo, privateKey, METHOD, uri, null));
63    reqBuilder.method(METHOD, null);
64    Request httpRequest = reqBuilder.build();
65
66    // 发送HTTP请求
67    OkHttpClient client = new OkHttpClient.Builder().build();
68    try (Response httpResponse = client.newCall(httpRequest).execute()) {
69      String respBody = WXPayUtility.extractBody(httpResponse);
70      if (httpResponse.code() >= 200 && httpResponse.code() < 300) {
71        // 2XX 成功,验证应答签名
72        WXPayUtility.validateResponse(this.wechatPayPublicKeyId, this.wechatPayPublicKey,
73                                      httpResponse.headers(), respBody);
74
75        // 从HTTP应答报文构建返回数据
76        return WXPayUtility.fromJson(respBody, DirectAPIv3QueryResponse.class);
77      } else {
78        throw new WXPayUtility.ApiException(httpResponse.code(), respBody, httpResponse.headers());
79      }
80    } catch (IOException e) {
81      throw new UncheckedIOException("Sending request to " + uri + " failed.", e);
82    }
83  }
84
85  private final String mchid;
86  private final String certificateSerialNo;
87  private final PrivateKey privateKey;
88  private final String wechatPayPublicKeyId;
89  private final PublicKey wechatPayPublicKey;
90
91  public QueryByOutTradeNo(String mchid, String certificateSerialNo, String privateKeyFilePath, String wechatPayPublicKeyId, String wechatPayPublicKeyFilePath) {
92    this.mchid = mchid;
93    this.certificateSerialNo = certificateSerialNo;
94    this.privateKey = WXPayUtility.loadPrivateKeyFromPath(privateKeyFilePath);
95    this.wechatPayPublicKeyId = wechatPayPublicKeyId;
96    this.wechatPayPublicKey = WXPayUtility.loadPublicKeyFromPath(wechatPayPublicKeyFilePath);
97  }
98
99  public static class DirectAPIv3QueryResponse {
100    @SerializedName("appid")
101    public String appid;
102
103    @SerializedName("mchid")
104    public String mchid;
105
106    @SerializedName("out_trade_no")
107    public String outTradeNo;
108
109    @SerializedName("transaction_id")
110    public String transactionId;
111
112    @SerializedName("trade_type")
113    public String tradeType;
114
115    @SerializedName("trade_state")
116    public String tradeState;
117
118    @SerializedName("trade_state_desc")
119    public String tradeStateDesc;
120
121    @SerializedName("bank_type")
122    public String bankType;
123
124    @SerializedName("attach")
125    public String attach;
126
127    @SerializedName("success_time")
128    public String successTime;
129
130    @SerializedName("payer")
131    public CommRespPayerInfo payer;
132
133    @SerializedName("amount")
134    public CommRespAmountInfo amount;
135
136    @SerializedName("scene_info")
137    public CommRespSceneInfo sceneInfo;
138
139    @SerializedName("promotion_detail")
140    public List<PromotionDetail> promotionDetail;
141  }
142
143  public static class CommRespAmountInfo {
144    @SerializedName("total")
145    public Long total;
146
147    @SerializedName("payer_total")
148    public Long payerTotal;
149
150    @SerializedName("currency")
151    public String currency;
152
153    @SerializedName("payer_currency")
154    public String payerCurrency;
155  }
156
157  public static class CommRespSceneInfo {
158    @SerializedName("device_id")
159    public String deviceId;
160
161    @SerializedName("store_info")
162    public StoreInfo storeInfo;
163  }
164
165  public static class CommRespPayerInfo {
166    @SerializedName("openid")
167    public String openid;
168  }
169
170  public static class QueryByOutTradeNoRequest {
171    @SerializedName("mchid")
172    @Expose(serialize = false)
173    public String mchid;
174
175    @SerializedName("out_trade_no")
176    @Expose(serialize = false)
177    public String outTradeNo;
178  }
179
180  public static class GoodsDetailInPromotion {
181    @SerializedName("goods_id")
182    public String goodsId;
183
184    @SerializedName("quantity")
185    public Integer quantity;
186
187    @SerializedName("unit_price")
188    public Long unitPrice;
189
190    @SerializedName("discount_amount")
191    public Long discountAmount;
192
193    @SerializedName("goods_remark")
194    public String goodsRemark;
195  }
196
197  public static class StoreInfo {
198    @SerializedName("id")
199    public String id;
200
201    @SerializedName("out_id")
202    public String outId;
203  }
204
205  public static class PromotionDetail {
206    @SerializedName("coupon_id")
207    public String couponId;
208
209    @SerializedName("name")
210    public String name;
211
212    @SerializedName("scope")
213    public String scope;
214
215    @SerializedName("type")
216    public String type;
217
218    @SerializedName("amount")
219    public Long amount;
220
221    @SerializedName("stock_id")
222    public String stockId;
223
224    @SerializedName("wechatpay_contribute")
225    public Long wechatpayContribute;
226
227    @SerializedName("merchant_contribute")
228    public Long merchantContribute;
229
230    @SerializedName("other_contribute")
231    public Long otherContribute;
232
233    @SerializedName("currency")
234    public String currency;
235
236    @SerializedName("goods_detail")
237    public List<GoodsDetailInPromotion> goodsDetail;
238  }
239}

 

应答参数

200 OK

appid  必填 string(32)

【公众账号ID】商户下单时传入的公众账号ID。


mchid  必填 string(32)

【商户号】商户下单时传入的商户号。


out_trade_no  必填 string(32)

【商户订单号】 商户下单时传入的商户系统内部订单号。


transaction_id  选填 string(32)

【微信支付订单号】 微信支付侧订单的唯一标识,订单支付成功后返回。


trade_type  选填 string(16)

【交易类型】 返回当前订单的交易类型,枚举值:

  • JSAPI:公众号支付、小程序支付

  • NATIVE:Native支付

  • APP:APP支付

  • MICROPAY:付款码支付

  • MWEB:H5支付

  • FACEPAY:刷脸支付


trade_state  必填 string(32)

【交易状态】 交易状态,详细业务流转状态处理请参考开发指引-订单状态流转图。枚举值:

  • SUCCESS:支付成功

  • REFUND:转入退款

  • NOTPAY:未支付

  • CLOSED:已关闭

  • REVOKED:已撤销(仅付款码支付会返回)

  • USERPAYING:用户支付中(仅付款码支付会返回)

  • PAYERROR:支付失败(仅付款码支付会返回)


trade_state_desc  必填 string(256)

【交易状态描述】 对交易状态的详细说明。


bank_type  选填 string(32)

【银行类型】 用户支付方式说明,订单支付成功后返回,格式为银行简码_具体类型(DEBIT借记卡/CREDIT信用卡/ECNY数字人民币),例如ICBC_DEBIT代表工商银行借记卡,非银行卡支付类型(例如余额/零钱通等)统一为OTHERS,具体请参考《银行类型对照表》。


attach  选填 string(128)

【商户数据包】商户下单时传入的自定义数据包,用户不可见,长度不超过128字符,若下单传入该参数,则订单支付成功后此接口和支付成功回调通知以及交易账单中会原样返回;若下单未传该参数,则不会返回。


success_time  选填 string(64)

【支付完成时间】

1、定义:用户完成订单支付的时间。该参数在订单支付成功后返回。

2、格式遵循rfc3339标准格式:yyyy-MM-DDTHH:mm:ss+TIMEZONEyyyy-MM-DD 表示年月日;T 字符用于分隔日期和时间部分;HH:mm:ss 表示具体的时分秒;TIMEZONE 表示时区(例如,+08:00 对应东八区时间,即北京时间)。

示例:2015-05-20T13:29:35+08:00 表示北京时间2015年5月20日13点29分35秒。


payer  选填 object

【支付者信息】 订单的支付者信息,订单支付成功后返回

属性

amount  选填 object

【订单金额】 订单金额信息。

属性

scene_info  选填 object

【场景信息】 下单时传入的支付场景描述,若下单传入该参数,则原样返回;若下单未传该参数,则不会返回。

属性

promotion_detail  选填 array[object]

【优惠功能】 代金券信息,当订单支付时,有使用代金券时,该字段将返回所使用的代金券信息。

属性

应答示例

200 OK

1{
2  "appid" : "wxd678efh567hg6787",
3  "mchid" : "1230000109",
4  "out_trade_no" : "1217752501201407033233368018",
5  "transaction_id" : "1217752501201407033233368018",
6  "trade_type" : "APP",
7  "trade_state" : "SUCCESS",
8  "trade_state_desc" : "支付成功",
9  "bank_type" : "CMC",
10  "attach" : "自定义数据",
11  "success_time" : "2018-06-08T10:34:56+08:00",
12  "payer" : {
13    "openid" : "oUpF8uMuAJO_M2pxb1Q9zNjWeS6o\t"
14  },
15  "amount" : {
16    "total" : 100,
17    "payer_total" : 90,
18    "currency" : "CNY",
19    "payer_currency" : "CNY"
20  },
21  "scene_info" : {
22    "device_id" : "013467007045764"
23  },
24  "promotion_detail" : [
25    {
26      "coupon_id" : "109519",
27      "name" : "单品惠-6",
28      "scope" : "SINGLE",
29      "type" : "CASH",
30      "amount" : 10,
31      "stock_id" : "931386",
32      "wechatpay_contribute" : 0,
33      "merchant_contribute" : 10,
34      "other_contribute" : 0,
35      "currency" : "CNY",
36      "goods_detail" : [
37        {
38          "goods_id" : "M1006",
39          "quantity" : 1,
40          "unit_price" : 100,
41          "discount_amount" : 10,
42          "goods_remark" : "商品备注信息"
43        }
44      ]
45    }
46  ]
47}
48

 

错误码

公共错误码

状态码

错误码

描述

解决方案

400

PARAM_ERROR

参数错误

请根据错误提示正确传入参数

400

INVALID_REQUEST

HTTP 请求不符合微信支付 APIv3 接口规则

请参阅 接口规则 检查

401

SIGN_ERROR

验证不通过

请参阅 签名常见问题 排查

500

SYSTEM_ERROR

系统异常,请稍后重试

请稍后重试

业务错误码

状态码

错误码

描述

解决方案

400

INVALID_REQUEST

无效请求

请根据接口返回的详细信息检查

400

MCH_NOT_EXISTS

商户号不存在

请检查商户号是否正确,商户号获取方式请参考普通商户模式开发必要参数说明

401

SIGN_ERROR

签名错误

请检查签名参数和方法是否都符合签名算法要求,参考:如何生成签名

403

RULE_LIMIT

业务规则限制

因业务规则限制请求频率,请查看接口返回的详细信息

403

TRADE_ERROR

交易错误

因业务原因交易失败,请查看接口返回的详细信息

404

ORDER_NOT_EXIST

订单不存在

请检查商户订单号是否下单成功

429

FREQUENCY_LIMITED

频率超限

请降低请求接口频率

500

SYSTEM_ERROR

系统错误

系统异常,请用相同参数重新调用

 

 

反馈
咨询
目录
置顶