版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/cl11992/article/details/86577665
一、介绍
最近我在做一个微信卡券的项目,在微信公众号新建了卡券,在项目中领取了卡券,需要做核销动作,记录一下开发流程,省的以后走弯路
二、注意
调取卡券使用的access_token是普通access_token
获取普通access_token方法:https://blog.csdn.net/cl11992/article/details/86304653
三、代码实例
下面代码需要的类
AccessTokenUtils:https://blog.csdn.net/cl11992/article/details/86304653
UrlConUtil:https://blog.csdn.net/cl11992/article/details/86303800
/*
* 查询Code接口
* 我们强烈建议开发者在调用核销code接口之前调用查询code接口,
* 并在核销之前对非法状态的code(如转赠中、已删除、已核销等)做出处理。
* @param code 券号:单张卡券的唯一标准。
*/
private JSONObject check(final String code) {
JSONObject json = new JSONObject();
try {
CommonVO data = new CommonVO();
if (StringUtils.isBlank(code)) {
json.put("state", "2");// 1--成功,2--失败
json.put("msg", "缺少参数!");
return json;
}
//获取access_token
Map<String, String> accessTokenMap = AccessTokenUtils.getAccessToken;
String token = accessTokenMap("access_token");
String url = "https://api.weixin.qq.com/card/code/get?access_token=" + token;
JSONObject paramjson = new JSONObject();
paramjson.put("code", code);// 单张卡券的唯一标准。
paramjson.put("check_consume", false);// 是否校验code核销状态,是否校验code核销状态,填入true和false时的code异常状态返回数据不同。
JSONObject object = UrlConUtil.httpsRequest(url, "POST", paramjson.toString());
String user_card_status = (String) object.get("user_card_status");// 当前code对应卡券的状态
String info = null;
boolean status = true;
if ("NORMAL".equalsIgnoreCase(user_card_status)) {
// NORMAL 正常
status = true;
} else if ("CONSUMED".equalsIgnoreCase(user_card_status)) {
// CONSUMED 已核销
info = "操作失败:" + "卡券已被核销过";
status = false;
} else if ("EXPIRE".equalsIgnoreCase(user_card_status)) {
// EXPIRE 已过期
info = "操作失败:" + "卡券已过期";
status = false;
} else if ("GIFTING".equalsIgnoreCase(user_card_status)) {
// GIFTING 转赠中
info = "操作失败:" + "卡券已在转赠中";
status = false;
} else if ("GIFT_TIMEOUT".equalsIgnoreCase(user_card_status)) {
// GIFT_TIMEOUT 转赠超时
info = "操作失败:" + "卡券已转赠超时";
status = false;
} else if ("DELETE".equalsIgnoreCase(user_card_status)) {
// DELETE 已删除
info = "操作失败:" + "卡券已被删除";
status = false;
} else if ("UNAVAILABLE".equalsIgnoreCase(user_card_status)) {
// UNAVAILABLE 已失效
info = "操作失败:" + "卡券已失效";
status = false;
} else {
// code未被添加或被转赠领取的情况则统一报错:invalid serial code
info = "操作失败:" + "卡券未被添加或已被转赠领取";
status = false;
}
json.put("state", status == true ? "1" : "2");// 1--成功,2--失败
json.put("msg", info);
return json;
} catch (Exception e) {
logger.error("查询微信卡券报错:", e);
return json;
}
}
/**
* 核销Code接口
* 消耗code接口是核销卡券的唯一接口,开发者可以调用当前接口将用户的优惠券进行核销,该过程不可逆。
* @param cardId 卡券ID代表一类卡券。 (非必填)
* @param code 券号:单张卡券的唯一标准。
* @throws Exception
*/
private JSONObject consume(final String cardId, final String code) {
JSONObject json = new JSONObject();
try{
//获取access_token
Map<String, String> accessTokenMap = AccessTokenUtils.getAccessToken;
String token = accessTokenMap("access_token");
String url = "https://api.weixin.qq.com/card/code/consume?access_token=" + token;
JSONObject paramjson = new JSONObject();
// paramjson.put("card_id", cardId);//卡券ID代表一类卡券。非必填
paramjson.put("code", code);// 单张卡券的唯一标准。
JSONObject object = UrlConUtil.httpsRequest(url, "POST", json.toString());
int errcode = (int) object.get("errcode");
String errmsg = (String) object.get("errmsg");
if (errcode != 0) {
json.put("state", "2");// 1--成功,2--失败
json.put("msg", code+"调用核销Code接口异常,errcode=" + errcode + ",errmsg=" + errmsg);
return json;
}
json.put("state", "1");// 1--成功,2--失败
json.put("msg", "核销成功!");
return json;
}catch (Exception e) {
json.put("state", "2");// 1--成功,2--失败
json.put("msg", "核销失败!");
return json;
}
}