/**
* 创建支付后领取立减金活动接口
* 通过此接口创建立减金活动。
* 将已创建的代金券cardid、跳转小程序appid、发起支付的商户号等信息通过此接口创建立减金活动,成功返回活动id即为创建成功。
* 接口地址:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=21515658940X5pIn
*
* @param begin_time 活动开始时间,精确到秒
* @param end_time 活动结束时间,精确到秒
* @param gift_num 单个礼包社交立减金数量(3-15个)
* @param max_partic_times_act 每个用户活动期间最大领取次数,最大为50,默认为1
* @param max_partic_times_one_day 每个用户活动期间单日最大领取次数,最大为50,默认为1
* @param card_id 卡券ID
* @param min_amt 最少支付金额,单位是元
* @param membership_appid 奖品指定的会员卡appid。如用户标签有选择商户会员,则需要填写会员卡appid,该appid需要跟所有发放商户号有绑定关系。
* @param new_tinyapp_user 可以指定为是否小程序新用户(membership_appid为空、new_tinyapp_user为false时,指定为所有用户)
* @return json
* @author yclimb
* @date 2018/9/18
*/
public JSONObject createCardActivity(String begin_time, String end_time, int gift_num, int max_partic_times_act,
int max_partic_times_one_day, String card_id, String min_amt,
String membership_appid, boolean new_tinyapp_user) {
try {
// 创建活动接口之前的验证
String msg = checkCardActivity(begin_time, end_time, gift_num, max_partic_times_act, max_partic_times_one_day, min_amt);
if (null != msg) {
JSONObject resultJson = new JSONObject(2);
resultJson.put("errcode", "1");
resultJson.put("errmsg", msg);
return resultJson;
}
// 获取[商户名称]公众号的 access_token
String accessToken = this.getAccessToken(WXConstants.WX_MINI_PROGRAM_CODE);
// 调用接口传入参数
JSONObject paramJson = new JSONObject(1);
// info 包含 basic_info、card_info_list、custom_info
JSONObject info = new JSONObject(3);
// 基础信息对象
JSONObject basic_info = new JSONObject(8);
// activity_bg_color 是 活动封面的背景颜色,可参考:选取卡券背景颜色
basic_info.put("activity_bg_color", CardBgColorEnum.COLOR_090.getBgName());
// activity_tinyappid 是 用户点击链接后可静默添加到列表的小程序appid;
basic_info.put("activity_tinyappid", WXPayConstants.APP_ID);
// mch_code 是 支付商户号
basic_info.put("mch_code", WXPayConstants.MCH_ID);
// begin_time 是 活动开始时间,精确到秒(unix时间戳)
basic_info.put("begin_time", DateTimeUtil.getTenTimeByDate(begin_time));
// end_time 是 活动结束时间,精确到秒(unix时间戳)
basic_info.put("end_time", DateTimeUtil.getTenTimeByDate(end_time));
// gift_num 是 单个礼包社交立减金数量(3-15个)
basic_info.put("gift_num", gift_num);
// max_partic_times_act 否 每个用户活动期间最大领取次数,最大为50,不填默认为1
basic_info.put("max_partic_times_act", max_partic_times_act);
// max_partic_times_one_day 否 每个用户活动期间单日最大领取次数,最大为50,不填默认为1
basic_info.put("max_partic_times_one_day", max_partic_times_one_day);
// card_info_list 是 可以配置两种发放规则:小程序新老用户、新老会员
JSONArray card_info_list = new JSONArray(1);
JSONObject card_info = new JSONObject(3);
// card_id 是 卡券ID
card_info.put("card_id", card_id);
// min_amt 是 最少支付金额,单位是分
card_info.put("min_amt", String.valueOf(new BigDecimal(min_amt).multiply(new BigDecimal(100)).setScale(2, BigDecimal.ROUND_HALF_UP).intValue()));
/*
* membership_appid 是 奖品指定的会员卡appid。如用户标签有选择商户会员,则需要填写会员卡appid,该appid需要跟所有发放商户号有绑定关系。
* new_tinyapp_user 是 可以指定为是否小程序新用户
* total_user 是 可以指定为所有用户
* membership_appid、new_tinyapp_user、total_user以上字段3选1,未选择请勿填,不必故意填写false
*/
if (StringUtils.isNotBlank(membership_appid)) {
card_info.put("membership_appid", membership_appid);
} else {
if (new_tinyapp_user) {
card_info.put("new_tinyapp_user", true);
} else {
card_info.put("total_user", true);
}
}
card_info_list.add(card_info);
// 自定义字段,表示支付后领券
JSONObject custom_info = new JSONObject(1);
custom_info.put("type", "AFTER_PAY_PACKAGE");
// 拼装json对象
info.put("basic_info", basic_info);
info.put("card_info_list", card_info_list);
info.put("custom_info", custom_info);
paramJson.put("info", info);
// 请求微信接口,得到返回结果[json]
HttpEntity<JSONObject> entity = new HttpEntity<>(paramJson, this.getHttpHeadersUTF8JSON());
JSONObject resultJson = restTemplate.postForObject(WXURL.WX_CARD_ACTIVITY_CREATE_URL, entity, JSONObject.class, accessToken);
// {"errcode":0,"errmsg":"ok","activity_id":"4728935"}
System.out.println(resultJson.toJSONString());
return resultJson;
} catch (Exception e) {
WXPayUtil.getLogger().error(e.getMessage(), e);
}
return null;
}
/**
* 创建活动接口之前的验证
*
* @param begin_time 活动开始时间,精确到秒
* @param end_time 活动结束时间,精确到秒
* @param gift_num 单个礼包社交立减金数量(3-15个)
* @param max_partic_times_act 每个用户活动期间最大领取次数,最大为50,默认为1
* @param max_partic_times_one_day 每个用户活动期间单日最大领取次数,最大为50,默认为1
* @param min_amt 最少支付金额,单位是元
* @return msg str
* @author yclimb
* @date 2018/9/18
*/
public String checkCardActivity(String begin_time, String end_time, int gift_num, int max_partic_times_act,
int max_partic_times_one_day, String min_amt) {
// 开始时间不能小于结束时间
if (DateTimeUtil.latterThan(end_time, begin_time, DateTimeUtil.TIME_FORMAT_NORMAL)) {
return "活动开始时间不能小于活动结束时间";
}
// 单个礼包社交立减金数量(3-15个)
if (gift_num < 3 || gift_num > 15) {
return "单个礼包社交立减金数量(3-15个)";
}
// 每个用户活动期间最大领取次数,最大为50,默认为1
if (max_partic_times_act <= 0 || max_partic_times_act > 50) {
return "每个用户活动期间最大领取次数,最大为50,默认为1";
}
// 每个用户活动期间单日最大领取次数,最大为50,默认为1
if (max_partic_times_one_day <= 0 || max_partic_times_one_day > 50) {
return "每个用户活动期间单日最大领取次数,最大为50,默认为1";
}
// 最少支付金额,单位是元
if (BigDecimal.ONE.compareTo(new BigDecimal(min_amt)) > 0) {
return "最少支付金额必须大于1元";
}
return null;
}