微信卡券的領取簽名參照 https://blog.csdn.net/SongJingzhou/article/details/105517841
package com.yzf.mall.services.support.wxpay.service.impl;
import cn.hutool.core.lang.Dict;
import com.google.common.collect.Lists;
import com.yzf.mall.core.utils.JsonUtils;
import com.yzf.mall.services.support.util.HttpClient;
import java.io.IOException;
import java.util.List;
import java.util.Objects;
import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
public class WxCoupon {
private String logoUrl = "http://mmbiz.qpic.cn/mmbiz/iaL1LJM1mF9aRKPZJkmG8xXhiaHqkKSVMMWeN3hLut7X7hicFNjakmxibMLGWpXrEXB33367o7zHN0CwngnQY7zb7g/0";
private String brandName = "某某商家";
private static CloseableHttpClient httpclient = HttpClients.createDefault();
private static String CHAR_SET = "UTF-8";
/**
* 解密微信卡券code
*/
public String _decryptWxCardCode(String code) throws IOException {
String url = "https://api.weixin.qq.com/card/code/decrypt?access_token="
+ "獲取微信accessToken"; //_getAccessToken();
try {
String res = doPostString(url, "{\"encrypt_code\":\"" + code + "\"}",
ContentType.APPLICATION_JSON);
return Objects.requireNonNull(JsonUtils.parseBean(res, Dict.class)).getStr("code");
} catch (IOException e) {
throw e;
}
}
/**
* 創建微信卡券
*
* @param wxCardInfo 需要的參數信息
* @return 微信端生成的卡券Id,經過重新簽名可用於前端領取優惠券,簽名參考 https://blog.csdn.net/SongJingzhou/article/details/105517841
*/
public String createWxCard(WxCardInfo wxCardInfo) throws IOException {
String url = "https://api.weixin.qq.com/card/create?access_token="
+ "獲取微信accessToken"; //_getAccessToken();
try {
String body = _packageWxCardInfo(wxCardInfo);
String res = doPostString(url, body, ContentType.APPLICATION_JSON);
return Objects.requireNonNull(JsonUtils.parseBean(res, Dict.class)).getStr("card_id");
} catch (IOException e) {
throw e;
}
}
private String _packageWxCardInfo(WxCardInfo wxCardInfo) {
Dict coupon = Dict.create();
coupon.put("base_info", _packageWxCardBaseInfo(wxCardInfo));
coupon.put("advanced_info", _packageWxCardAdvancedInfo());
coupon.put("default_detail", wxCardInfo.getDefaultDetail());
Dict card = Dict.create();
card.put("card_type", "GENERAL_COUPON");
card.put("general_coupon", coupon);
return JsonUtils.toString(Dict.create().set("card", card));
}
private Dict _packageWxCardBaseInfo(WxCardInfo wxCardInfo) {
Dict baseInfo = Dict.create();
// 可以通過接口上傳至微信服務器
baseInfo.put("logo_url", logoUrl);
baseInfo.put("brand_name", brandName);
/*
* 碼型: "CODE_TYPE_TEXT"文 本 "CODE_TYPE_BARCODE"一維碼 "CODE_TYPE_QRCODE"二維碼
* "CODE_TYPE_ONLY_QRCODE",二維碼無code顯示 "CODE_TYPE_ONLY_BARCODE" 一維碼無code顯示 CODE_TYPE_NONE,
* 不顯示code和條形碼類型
*/
baseInfo.put("code_type", "CODE_TYPE_ONLY_BARCODE");
baseInfo.put("title", wxCardInfo.getTitle());
baseInfo.put("color", "Color010");
baseInfo.put("notice", "使用提示");
baseInfo.put("description", wxCardInfo.getDescription());
Dict dateInfo = Dict.create();
dateInfo.put("type", wxCardInfo.getTimeType());
dateInfo.put("begin_timestamp", wxCardInfo.getStartTimeStamp());
dateInfo.put("end_timestamp", wxCardInfo.getEndTimeStamp());
dateInfo.put("fixed_term", wxCardInfo.getFixedTerm());
dateInfo.put("fixed_begin_term", wxCardInfo.getFixedBeginTerm());
baseInfo.put("date_info", dateInfo);
baseInfo.put("sku", Dict.create().set("quantity", wxCardInfo.getNum()));
// 每人領取數量由系統控制,此處不限制每人可領取數量,非零時限制每人的領取數量
baseInfo.put("get_limit", 0);
baseInfo.put("use_custom_code", false);
baseInfo.put("bind_openid", false);
baseInfo.put("can_share", false);
baseInfo.put("can_give_friend", false);
return baseInfo;
}
/**
* 爲了讓用戶領取的優惠券能看到使用有效期設置,也可不設置
*/
private Dict _packageWxCardAdvancedInfo() {
Dict advanced = Dict.create();
List<String> days = Lists
.newArrayList("MONDAY", "TUESDAY", "WEDNESDAY", "THURSDAY", "FRIDAY", "SATURDAY", "SUNDAY");
List<Dict> timeLimit = Lists.newArrayList();
for (String day : days) {
Dict item = Dict.create();
item.put("begin_hour", 0);
item.put("begin_minute", 0);
item.put("end_hour", 59);
item.put("end_minute", 59);
item.put("type", day);
timeLimit.add(item);
}
advanced.put("time_limit", timeLimit);
return advanced;
}
/**
* 覈銷客戶領取後的優惠券
*
* @param code 客戶領取時的優惠券code
*/
public void consumeWxCardCode(String code) throws IOException {
String url = "https://api.weixin.qq.com/card/code/consume?access_token="
+ "獲取微信accessToken"; //_getAccessToken();
try {
String res = HttpClient.doPostString(url, "{\"code\":\"" + _decryptWxCardCode(code) + "\"}",
ContentType.APPLICATION_JSON);
} catch (IOException e) {
throw e;
}
}
public static String doGetString(String url) throws IOException {
HttpGet httpGet = new HttpGet(url);
try (CloseableHttpResponse response = httpclient.execute(httpGet)) {
HttpEntity entity = response.getEntity();
return EntityUtils.toString(entity, CHAR_SET);
}
}
public static String doPostString(String url, String body, ContentType contentType)
throws IOException {
HttpPost httpPost = new HttpPost(url);
if (body != null) {
httpPost.setEntity(new StringEntity(body, contentType));
}
try (CloseableHttpResponse response = httpclient.execute(httpPost)) {
HttpEntity entity = response.getEntity();
return EntityUtils.toString(entity, CHAR_SET);
}
}
}
class WxCardInfo {
/**
* 最長支持九個漢字
*/
private String title;
private String description;
/**
* DATE_TYPE_FIX_TIME_RANGE 表示固定日期區間,DATE_TYPE_FIX_TERM 表示固定時長,自領取後按天算。
*/
private String timeType;
private Integer fixedTerm;
private Integer fixedBeginTerm;
private Long startTimeStamp;
private Long endTimeStamp;
/**
* 優惠券數量
*/
private Integer num;
private String defaultDetail;
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public String getTimeType() {
return timeType;
}
public void setTimeType(String timeType) {
this.timeType = timeType;
}
public Integer getFixedTerm() {
return fixedTerm;
}
public void setFixedTerm(Integer fixedTerm) {
this.fixedTerm = fixedTerm;
}
public Integer getFixedBeginTerm() {
return fixedBeginTerm;
}
public void setFixedBeginTerm(Integer fixedBeginTerm) {
this.fixedBeginTerm = fixedBeginTerm;
}
public Long getStartTimeStamp() {
return startTimeStamp;
}
public void setStartTimeStamp(Long startTimeStamp) {
this.startTimeStamp = startTimeStamp;
}
public Long getEndTimeStamp() {
return endTimeStamp;
}
public void setEndTimeStamp(Long endTimeStamp) {
this.endTimeStamp = endTimeStamp;
}
public Integer getNum() {
return num;
}
public void setNum(Integer num) {
this.num = num;
}
public String getDefaultDetail() {
return defaultDetail;
}
public void setDefaultDetail(String defaultDetail) {
this.defaultDetail = defaultDetail;
}
}
測試數據示例:
{
"card": {
"card_type": "GENERAL_COUPON",
"general_coupon": {
"base_info": {
"logo_url": "http://mmbiz.qpic.cn/mmbiz/iaL1LJM1mF9aRKPZJkmG8xXhiaHqkKSVMMWeN3hLut7X7hicFNjakmxibMLGWpXrEXB33367o7zHN0CwngnQY7zb7g/0",
"brand_name": "主題",
"code_type": "CODE_TYPE_NONE",
"title": "當天生效",
"sub_title": "無門檻",
"color": "Color010",
"notice": "請儘快使用",
"description": "描述唄 ",
"date_info": {
"type": "DATE_TYPE_FIX_TERM",
"begin_timestamp": null,
"end_timestamp": null,
"fixed_term": 1,
"fixed_begin_term": 0
},
"sku": {
"quantity": 10
},
"get_limit": 1,
"use_custom_code": false,
"bind_openid": false,
"can_share": false,
"can_give_friend": false
},
"advanced_info": {
"time_limit": [
{
"type": "MONDAY",
"begin_hour":0,
"end_hour":10,
"begin_minute":10,
"end_minute":59
},
{
"type": "TUESDAY",
"begin_hour":0,
"end_hour":10,
"begin_minute":10,
"end_minute":59
},
{
"type": "WEDNESDAY",
"begin_hour":0,
"end_hour":10,
"begin_minute":10,
"end_minute":59
},
{
"type": "THURSDAY",
"begin_hour":0,
"end_hour":10,
"begin_minute":10,
"end_minute":59
},
{
"type": "FRIDAY",
"begin_hour":0,
"end_hour":10,
"begin_minute":10,
"end_minute":59
},
{
"type": "SATURDAY",
"begin_hour":0,
"end_hour":10,
"begin_minute":10,
"end_minute":59
},
{
"type": "SUNDAY",
"begin_hour":0,
"end_hour":10,
"begin_minute":10,
"end_minute":59
}
]
},
"default_detail": "優惠券詳情說明"
}
}
}