查询用户在品牌下所有会员卡

更新时间:2025.06.22

查询用户在当前品牌下领取的会员卡列表

接口说明

支持商户:【普通服务商】

请求方式:【GET】/v3/brand/partner/card-member/user-cards

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

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

请求参数

Header  HTTP头参数

 Authorization  必填 string

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


 Accept  必填 string

请设置为application/json


query  查询参数

 brand_id  必填   string(32)

【品牌ID】 商家进驻微信支付品牌商家后获得的品牌ID(灰度期间联系微信支付运营获取),用于标记该会员卡的归属方


 openid  必填   string(128)

【用户标识】 用户在品牌商家会员卡模板AppID下的唯一标识


 user_card_state  选填   string

【用户会员卡状态】 用户当前的卡状态

可选取值

  • UNACTIVATED:  用户已领卡,但还未激活

  • EFFECTIVE:  用户的会员卡可正常使用

  • EXPIRED:  用户的会员卡已过期

  • INVALID:  用户的会员卡已失效


 offset  必填   integer

【分页开始位置】 该次请求的分页开始位置,从0开始计数,例如offset=10,表示从第11条记录开始返回。


 limit  必填   integer

【分页大小】 分页大小

请求示例

Java
Go
curl

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

1package com.java.demo;
2
3import com.java.utils.WXPayUtility; // 引用微信支付工具库,参考:https://pay.weixin.qq.com/doc/v3/partner/4014985777
4
5import com.google.gson.annotations.SerializedName;
6import com.google.gson.annotations.Expose;
7import okhttp3.MediaType;
8import okhttp3.OkHttpClient;
9import okhttp3.Request;
10import okhttp3.RequestBody;
11import okhttp3.Response;
12
13import java.io.IOException;
14import java.io.UncheckedIOException;
15import java.security.PrivateKey;
16import java.security.PublicKey;
17import java.util.ArrayList;
18import java.util.HashMap;
19import java.util.List;
20import java.util.Map;
21
22/**
23 * 查询用户在品牌下所有会员卡
24 */
25public class ListUserCard {
26  private static String HOST = "https://api.mch.weixin.qq.com";
27  private static String METHOD = "GET";
28  private static String PATH = "/v3/brand/partner/card-member/user-cards";
29
30  public static void main(String[] args) {
31    // TODO: 请准备商户开发必要参数,参考:https://pay.weixin.qq.com/doc/v3/partner/4013080340
32    ListUserCard client = new ListUserCard(
33      "19xxxxxxxx",                    // 商户号,是由微信支付系统生成并分配给每个商户的唯一标识符,商户号获取方式参考 https://pay.weixin.qq.com/doc/v3/partner/4013080340
34      "1DDE55AD98Exxxxxxxxxx",         // 商户API证书序列号,如何获取请参考 https://pay.weixin.qq.com/doc/v3/partner/4013058924
35      "/path/to/apiclient_key.pem",    // 商户API证书私钥文件路径,本地文件路径
36      "PUB_KEY_ID_xxxxxxxxxxxxx",      // 微信支付公钥ID,如何获取请参考 https://pay.weixin.qq.com/doc/v3/partner/4013038589
37      "/path/to/wxp_pub.pem"           // 微信支付公钥文件路径,本地文件路径
38    );
39
40    ListUserCardRequest request = new ListUserCardRequest();
41    request.brandId = "1004";
42    request.openid = "obLatjnx9gnqzS4myYGmLZ7LgLBA";
43    request.userCardState = UserCardState.EFFECTIVE;
44    request.offset = 0L;
45    request.limit = 20L;
46    try {
47      ListUserCardResponse response = client.run(request);
48
49      // TODO: 请求成功,继续业务逻辑
50      System.out.println(response);
51    } catch (WXPayUtility.ApiException e) {
52      // TODO: 请求失败,根据状态码执行不同的逻辑
53      e.printStackTrace();
54    }
55  }
56
57  public ListUserCardResponse run(ListUserCardRequest request) {
58    String uri = PATH;
59    Map<String, Object> args = new HashMap<>();
60    args.put("brand_id", request.brandId);
61    args.put("openid", request.openid);
62    args.put("user_card_state", request.userCardState);
63    args.put("offset", request.offset);
64    args.put("limit", request.limit);
65    uri = uri + "?" + WXPayUtility.urlEncode(args);
66
67    Request.Builder reqBuilder = new Request.Builder().url(HOST + uri);
68    reqBuilder.addHeader("Accept", "application/json");
69    reqBuilder.addHeader("Wechatpay-Serial", wechatPayPublicKeyId);
70    reqBuilder.addHeader("Authorization", WXPayUtility.buildAuthorization(mchid, certificateSerialNo, privateKey, METHOD, uri, null));
71    reqBuilder.method(METHOD, null);
72    Request httpRequest = reqBuilder.build();
73
74    // 发送HTTP请求
75    OkHttpClient client = new OkHttpClient.Builder().build();
76    try (Response httpResponse = client.newCall(httpRequest).execute()) {
77      String respBody = WXPayUtility.extractBody(httpResponse);
78      if (httpResponse.code() >= 200 && httpResponse.code() < 300) {
79        // 2XX 成功,验证应答签名
80        WXPayUtility.validateResponse(this.wechatPayPublicKeyId, this.wechatPayPublicKey,
81            httpResponse.headers(), respBody);
82
83        // 从HTTP应答报文构建返回数据
84        return WXPayUtility.fromJson(respBody, ListUserCardResponse.class);
85      } else {
86        throw new WXPayUtility.ApiException(httpResponse.code(), respBody, httpResponse.headers());
87      }
88    } catch (IOException e) {
89      throw new UncheckedIOException("Sending request to " + uri + " failed.", e);
90    }
91  }
92
93  private final String mchid;
94  private final String certificateSerialNo;
95  private final PrivateKey privateKey;
96  private final String wechatPayPublicKeyId;
97  private final PublicKey wechatPayPublicKey;
98
99  public ListUserCard(String mchid, String certificateSerialNo, String privateKeyFilePath, String wechatPayPublicKeyId, String wechatPayPublicKeyFilePath) {
100    this.mchid = mchid;
101    this.certificateSerialNo = certificateSerialNo;
102    this.privateKey = WXPayUtility.loadPrivateKeyFromPath(privateKeyFilePath);
103    this.wechatPayPublicKeyId = wechatPayPublicKeyId;
104    this.wechatPayPublicKey = WXPayUtility.loadPublicKeyFromPath(wechatPayPublicKeyFilePath);
105  }
106
107  public static class ListUserCardRequest {
108    @SerializedName("brand_id")
109    @Expose(serialize = false)
110    public String brandId;
111  
112    @SerializedName("openid")
113    @Expose(serialize = false)
114    public String openid;
115  
116    @SerializedName("offset")
117    @Expose(serialize = false)
118    public Long offset;
119  
120    @SerializedName("limit")
121    @Expose(serialize = false)
122    public Long limit;
123  
124    @SerializedName("user_card_state")
125    @Expose(serialize = false)
126    public UserCardState userCardState;
127  }
128  
129  public static class ListUserCardResponse {
130    @SerializedName("data")
131    public List<UserCard> data;
132  
133    @SerializedName("total_count")
134    public Long totalCount;
135  
136    @SerializedName("offset")
137    public Long offset;
138  
139    @SerializedName("limit")
140    public Long limit;
141  }
142  
143  public enum UserCardState {
144    @SerializedName("UNACTIVATED")
145    UNACTIVATED,
146    @SerializedName("EFFECTIVE")
147    EFFECTIVE,
148    @SerializedName("EXPIRED")
149    EXPIRED,
150    @SerializedName("INVALID")
151    INVALID
152  }
153  
154  public static class UserCard {
155    @SerializedName("user_card_code")
156    public String userCardCode;
157  
158    @SerializedName("card_id")
159    public String cardId;
160  
161    @SerializedName("openid")
162    public String openid;
163  
164    @SerializedName("card_color")
165    public String cardColor;
166  
167    @SerializedName("card_picture_url")
168    public String cardPictureUrl;
169  
170    @SerializedName("brand_id")
171    public String brandId;
172  
173    @SerializedName("card_type")
174    public CardType cardType;
175  
176    @SerializedName("phone_number")
177    public String phoneNumber;
178  
179    @SerializedName("level")
180    public String level;
181  
182    @SerializedName("valid_date_information")
183    public DateInfo validDateInformation;
184  
185    @SerializedName("pickup_time")
186    public String pickupTime;
187  
188    @SerializedName("user_information")
189    public UserInfo userInformation;
190  
191    @SerializedName("attach")
192    public String attach;
193  
194    @SerializedName("user_card_state")
195    public UserCardState userCardState;
196  
197    @SerializedName("invalid_reason")
198    public String invalidReason;
199  
200    @SerializedName("invalid_time")
201    public String invalidTime;
202  
203    @SerializedName("create_time")
204    public String createTime;
205  
206    @SerializedName("modify_time")
207    public String modifyTime;
208  }
209  
210  public enum CardType {
211    @SerializedName("PURCHASE")
212    PURCHASE,
213    @SerializedName("NORMAL")
214    NORMAL,
215    @SerializedName("BALANCE")
216    BALANCE
217  }
218  
219  public static class DateInfo {
220    @SerializedName("type")
221    public DateType type;
222  
223    @SerializedName("available_begin_time")
224    public String availableBeginTime;
225  
226    @SerializedName("available_end_time")
227    public String availableEndTime;
228  
229    @SerializedName("available_day_after_receive")
230    public Long availableDayAfterReceive;
231  }
232  
233  public static class UserInfo {
234    @SerializedName("common_field_list")
235    public List<UserInfoCommonField> commonFieldList;
236  
237    @SerializedName("custom_field_list")
238    public List<UserInfoCustomField> customFieldList;
239  }
240  
241  public enum DateType {
242    @SerializedName("FIX_TIME_RANGE")
243    FIX_TIME_RANGE,
244    @SerializedName("FIX_TERM")
245    FIX_TERM,
246    @SerializedName("PERMANENT")
247    PERMANENT
248  }
249  
250  public static class UserInfoCommonField {
251    @SerializedName("name")
252    public CommonFieldFlag name;
253  
254    @SerializedName("value")
255    public String value;
256  }
257  
258  public static class UserInfoCustomField {
259    @SerializedName("name")
260    public String name;
261  
262    @SerializedName("user_chosen_values")
263    public List<String> userChosenValues;
264  }
265  
266  public enum CommonFieldFlag {
267    @SerializedName("USER_FORM_FLAG_SEX")
268    USER_FORM_FLAG_SEX,
269    @SerializedName("USER_FORM_FLAG_NAME")
270    USER_FORM_FLAG_NAME,
271    @SerializedName("USER_FORM_FLAG_BIRTHDAY")
272    USER_FORM_FLAG_BIRTHDAY,
273    @SerializedName("USER_FORM_FLAG_ADDRESS")
274    USER_FORM_FLAG_ADDRESS,
275    @SerializedName("USER_FORM_FLAG_EMAIL")
276    USER_FORM_FLAG_EMAIL,
277    @SerializedName("USER_FORM_FLAG_CITY")
278    USER_FORM_FLAG_CITY
279  }
280  
281}
282

应答参数

200 OK

 data  选填   array[object]

【会员卡列表】 符合条件的会员卡列表

属性

 total_count  必填   integer

【总数量】 总数量


 offset  必填   integer

【分页开始位置】 该次请求的分页开始位置,从0开始计数,例如offset=10,表示从第11条记录开始返回。


 limit  必填   integer

【分页大小】 分页大小

应答示例

200 OK

1{
2  "data" : [
3    {
4      "user_card_code" : "478515832665",
5      "card_id" : "pbLatjvWOibDc5-TBnbUk1pD12o0",
6      "openid" : "obLatjnx9gnqzS4myYGmLZ7LgLBA",
7      "card_color" : "#FFFF00",
8      "card_picture_url" : "https://wxpaylogo.qpic.cn/wxpaylogo/PiajxSqBRaEIPAeia7Imvtsn7sYGNcEj33YzVvJF88ECQ19LXId8ZL2Q/0",
9      "brand_id" : "1001622624",
10      "card_type" : "NORMAL",
11      "phone_number" : "vvysDQeEaH3I+wRh14St0abIkvQyFgh/fbWYSs2bLtG9tj+bdJn4WSCPzLhShNHgujZzseiL6sYmT7E65mv/eFeTa7yslYfrX0hrhHazSM/+tfvN/C3OZwiBbcrF9LTIIdBVhGOqhCx0gK5YAVZc8dbW/yJqC5i79PDfVYJtpQe3A4v/GiDa2Q+Mv03taxgnEkzqlSPjkXiCYBj9UaFJ4bqCTXiO2Kt6TpczvAaZW+9/blxiJwqEFXe78LbrIQvkDUmVdZbqBdPQ+QGQgc/2Ea4IbP/EEt1qSyXnFbzaaKSE2j4mAFON3kzNexb/SYkHZNJAuCittaW4wpGj7U+h9A==",
12      "level" : "钻石会员",
13      "valid_date_information" : {
14        "type" : "PERMANENT",
15        "available_begin_time" : "2020-05-20T13:29:35.120+08:00",
16        "available_end_time" : "2020-05-20T13:29:35.120+08:00",
17        "available_day_after_receive" : 30
18      },
19      "pickup_time" : "2020-05-20T13:29:35.120+08:00",
20      "user_information" : {
21        "common_field_list" : [
22          {
23            "name" : "USER_FORM_FLAG_BIRTHDAY",
24            "value" : "vvysDQeEaH3I+wRh14St0abIkvQyFgh/fbWYSs2bLtG9tj+bdJn4WSCPzLhShNHgujZzseiL6sYmT7E65mv/eFeTa7yslYfrX0hrhHazSM/+tfvN/C3OZwiBbcrF9LTIIdBVhGOqhCx0gK5YAVZc8dbW/yJqC5i79PDfVYJtpQe3A4v/GiDa2Q+Mv03taxgnEkzqlSPjkXiCYBj9UaFJ4bqCTXiO2Kt6TpczvAaZW+9/blxiJwqEFXe78LbrIQvkDUmVdZbqBdPQ+QGQgc/2Ea4IbP/EEt1qSyXnFbzaaKSE2j4mAFON3kzNexb/SYkHZNJAuCittaW4wpGj7U+h9A=="
25          }
26        ],
27        "custom_field_list" : [
28          {
29            "name" : "喜欢的运动",
30            "user_chosen_values" : [
31              "vvysDQeEaH3I+wRh14St0abIkvQyFgh/fbWYSs2bLtG9tj+bdJn4WSCPzLhShNHgujZzseiL6sYmT7E65mv/eFeTa7yslYfrX0hrhHazSM/+tfvN/C3OZwiBbcrF9LTIIdBVhGOqhCx0gK5YAVZc8dbW/yJqC5i79PDfVYJtpQe3A4v/GiDa2Q+Mv03taxgnEkzqlSPjkXiCYBj9UaFJ4bqCTXiO2Kt6TpczvAaZW+9/blxiJwqEFXe78LbrIQvkDUmVdZbqBdPQ+QGQgc/2Ea4IbP/EEt1qSyXnFbzaaKSE2j4mAFON3kzNexb/SYkHZNJAuCittaW4wpGj7U+h9A=="
32            ]
33          }
34        ]
35      },
36      "attach" : "自定义数据说明",
37      "user_card_state" : "EFFECTIVE",
38      "invalid_reason" : "传入的自定义作废原因",
39      "invalid_time" : "2020-05-20T13:29:35.120+08:00",
40      "create_time" : "2020-05-20T13:29:35.120+08:00",
41      "modify_time" : "2020-05-20T13:29:35.120+08:00"
42    }
43  ],
44  "total_count" : 20,
45  "offset" : 0,
46  "limit" : 20
47}
48

 

错误码

公共错误码

状态码

错误码

描述

解决方案

400

PARAM_ERROR

参数错误

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

400

INVALID_REQUEST

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

请参阅 接口规则

401

SIGN_ERROR

验证不通过

请参阅 签名常见问题

500

SYSTEM_ERROR

系统异常,请稍后重试

请稍后重试

业务错误码

状态码

错误码

描述

解决方案

400

PARAM_ERROR

OpenID有误

请使用正确的OpenID重新调用

 

反馈
咨询
目录
置顶