微信卡券的創建、領取、覈銷

微信卡券的領取簽名參照 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": "優惠券詳情說明"
       }
   }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章