From 3eb85106bc0f9962a297a3fb2a25072fde59c9aa Mon Sep 17 00:00:00 2001 From: "lewis.lynn" Date: Fri, 23 Feb 2018 18:13:50 +0800 Subject: [PATCH 1/6] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=B0=8F=E7=A8=8B?= =?UTF-8?q?=E5=BA=8F=E6=A8=A1=E6=9D=BF=E9=85=8D=E7=BD=AE=E7=9B=B8=E5=85=B3?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../wx/miniapp/api/WxMaService.java | 6 ++ .../wx/miniapp/api/WxMaTemplateService.java | 89 +++++++++++++++ .../wx/miniapp/api/impl/WxMaServiceImpl.java | 6 ++ .../api/impl/WxMaTemplateServiceImpl.java | 101 ++++++++++++++++++ .../bean/template/WxMaTemplateAddResult.java | 20 ++++ .../WxMaTemplateLibraryGetResult.java | 31 ++++++ .../WxMaTemplateLibraryListResult.java | 28 +++++ .../bean/template/WxMaTemplateListResult.java | 29 +++++ .../api/impl/WxMaTemplateServiceImplTest.java | 70 ++++++++++++ .../src/test/resources/test-config.sample.xml | 11 -- 10 files changed, 380 insertions(+), 11 deletions(-) create mode 100644 weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaTemplateService.java create mode 100644 weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaTemplateServiceImpl.java create mode 100644 weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/template/WxMaTemplateAddResult.java create mode 100644 weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/template/WxMaTemplateLibraryGetResult.java create mode 100644 weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/template/WxMaTemplateLibraryListResult.java create mode 100644 weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/template/WxMaTemplateListResult.java create mode 100644 weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaTemplateServiceImplTest.java delete mode 100644 weixin-java-miniapp/src/test/resources/test-config.sample.xml diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaService.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaService.java index 9098d4ac48..beaa96a896 100644 --- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaService.java +++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaService.java @@ -121,6 +121,12 @@ public interface WxMaService { */ WxMaQrcodeService getQrcodeService(); + /** + * 返回模板配置相关接口方法的实现类对象, 以方便调用其各个接口 + * @return WxMaTemplateService + */ + WxMaTemplateService getTemplateService(); + /** * 初始化http请求对象 */ diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaTemplateService.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaTemplateService.java new file mode 100644 index 0000000000..62be40ed83 --- /dev/null +++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaTemplateService.java @@ -0,0 +1,89 @@ +package cn.binarywang.wx.miniapp.api; + +import cn.binarywang.wx.miniapp.bean.template.WxMaTemplateAddResult; +import cn.binarywang.wx.miniapp.bean.template.WxMaTemplateLibraryGetResult; +import cn.binarywang.wx.miniapp.bean.template.WxMaTemplateLibraryListResult; +import cn.binarywang.wx.miniapp.bean.template.WxMaTemplateListResult; +import me.chanjar.weixin.common.exception.WxErrorException; + +import java.util.List; + +public interface WxMaTemplateService { + + //获取小程序模板库标题列表 + String TEMPLATE_LIBRARY_LIST_URL = "https://api.weixin.qq.com/cgi-bin/wxopen/template/library/list"; + + //获取模板库某个模板标题下关键词库 + String TEMPLATE_LIBRARY_KEYWORD_URL = "https://api.weixin.qq.com/cgi-bin/wxopen/template/library/get"; + + //组合模板并添加至帐号下的个人模板库 + String TEMPLATE_ADD_URL = "https://api.weixin.qq.com/cgi-bin/wxopen/template/add"; + + //获取帐号下已存在的模板列表 + String TEMPLATE_LIST_URL = "https://api.weixin.qq.com/cgi-bin/wxopen/template/list"; + + //删除帐号下的某个模板 + String TEMPLATE_DEL_URL = "https://api.weixin.qq.com/cgi-bin/wxopen/template/del"; + + /** + *
+   * 获取小程序模板库标题列表
+   *
+   * 详情请见: 获取小程序模板库标题列表
+   * 接口url格式: https://api.weixin.qq.com/cgi-bin/wxopen/template/library/list?access_token=ACCESS_TOKEN
+   * 
+ * @param offset + * @param count + * @return + */ + WxMaTemplateLibraryListResult findTemplateLibraryList(int offset, int count) throws WxErrorException; + + /** + *
+   * 获取模板库某个模板标题下关键词库
+   *
+   * 详情请见: 获取小程序模板库标题列表
+   * 接口url格式: https://api.weixin.qq.com/cgi-bin/wxopen/template/library/get?access_token=ACCESS_TOKEN
+   * 
+ * @param id + * @return + */ + WxMaTemplateLibraryGetResult findTemplateLibraryKeywordList(String id) throws WxErrorException; + + /** + *
+   * 组合模板并添加至帐号下的个人模板库
+   *
+   * 详情请见: 获取小程序模板库标题列表
+   * 接口url格式: https://api.weixin.qq.com/cgi-bin/wxopen/template/add?access_token=ACCESS_TOKEN
+   * 
+ * @param id + * @param keywordIdList + * @return + */ + WxMaTemplateAddResult addTemplate(String id, List keywordIdList) throws WxErrorException; + + /** + *
+   * 获取帐号下已存在的模板列表
+   *
+   * 详情请见: 获取小程序模板库标题列表
+   * 接口url格式: https://api.weixin.qq.com/cgi-bin/wxopen/template/list?access_token=ACCESS_TOKEN
+   * 
+ * @param offset + * @param count + * @return + */ + WxMaTemplateListResult findTemplateList(int offset, int count) throws WxErrorException; + + /** + *
+   * 删除帐号下的某个模板
+   *
+   * 详情请见: 获取小程序模板库标题列表
+   * 接口url格式: https://api.weixin.qq.com/cgi-bin/wxopen/template/list?access_token=ACCESS_TOKEN
+   * 
+ * @param templateId + */ + boolean delTemplate(String templateId) throws WxErrorException; +} diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaServiceImpl.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaServiceImpl.java index df3fad8efb..380a15a1df 100644 --- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaServiceImpl.java +++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaServiceImpl.java @@ -38,6 +38,7 @@ public class WxMaServiceImpl implements WxMaService, RequestHttp params = new HashMap<>(); + params.put("offset", offset); + params.put("count", count); + + String responseText = this.wxMaService.post(TEMPLATE_LIBRARY_LIST_URL, WxGsonBuilder.create().toJson(params)); + WxError wxError = WxError.fromJson(responseText); + if(wxError.getErrorCode() == 0){ + return WxMaTemplateLibraryListResult.fromJson(responseText); + }else { + throw new WxErrorException(wxError); + } + } + + @Override + public WxMaTemplateLibraryGetResult findTemplateLibraryKeywordList(String id) throws WxErrorException { + + Map params = new HashMap<>(); + params.put("id", id); + + String responseText = this.wxMaService.post(TEMPLATE_LIBRARY_KEYWORD_URL, WxGsonBuilder.create().toJson(params)); + WxError wxError = WxError.fromJson(responseText); + if(wxError.getErrorCode() == 0){ + return WxMaTemplateLibraryGetResult.fromJson(responseText); + }else { + throw new WxErrorException(wxError); + } + } + + @Override + public WxMaTemplateAddResult addTemplate(String id, List keywordIdList) throws WxErrorException { + + Map params = new HashMap<>(); + params.put("id", id); + params.put("keyword_id_list", keywordIdList.toArray()); + + String responseText = this.wxMaService.post(TEMPLATE_ADD_URL, WxGsonBuilder.create().toJson(params)); + WxError wxError = WxError.fromJson(responseText); + if(wxError.getErrorCode() == 0){ + return WxMaTemplateAddResult.fromJson(responseText); + }else { + throw new WxErrorException(wxError); + } + } + + @Override + public WxMaTemplateListResult findTemplateList(int offset, int count) throws WxErrorException { + + Map params = new HashMap<>(); + params.put("offset", offset); + params.put("count", count); + + String responseText = this.wxMaService.post(TEMPLATE_LIST_URL, WxGsonBuilder.create().toJson(params)); + WxError wxError = WxError.fromJson(responseText); + if(wxError.getErrorCode() == 0){ + return WxMaTemplateListResult.fromJson(responseText); + }else { + throw new WxErrorException(wxError); + } + } + + @Override + public boolean delTemplate(String templateId) throws WxErrorException { + Map params = new HashMap<>(); + params.put("template_id", templateId); + + String responseText = this.wxMaService.post(TEMPLATE_DEL_URL, WxGsonBuilder.create().toJson(params)); + WxError wxError = WxError.fromJson(responseText); + if(wxError.getErrorCode() == 0){ + return true; + }else { + throw new WxErrorException(wxError); + } + } +} diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/template/WxMaTemplateAddResult.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/template/WxMaTemplateAddResult.java new file mode 100644 index 0000000000..4b30870d60 --- /dev/null +++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/template/WxMaTemplateAddResult.java @@ -0,0 +1,20 @@ +package cn.binarywang.wx.miniapp.bean.template; + +import com.google.gson.annotations.SerializedName; +import lombok.Data; +import me.chanjar.weixin.common.util.json.WxGsonBuilder; + +import java.io.Serializable; + +@Data +public class WxMaTemplateAddResult implements Serializable{ + + private static final long serialVersionUID = 872250961973834465L; + + @SerializedName("template_id") + private String templateId; + + public static WxMaTemplateAddResult fromJson(String json){ + return WxGsonBuilder.create().fromJson(json, WxMaTemplateAddResult.class); + } +} diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/template/WxMaTemplateLibraryGetResult.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/template/WxMaTemplateLibraryGetResult.java new file mode 100644 index 0000000000..e55ed0d563 --- /dev/null +++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/template/WxMaTemplateLibraryGetResult.java @@ -0,0 +1,31 @@ +package cn.binarywang.wx.miniapp.bean.template; + +import com.google.gson.annotations.SerializedName; +import lombok.Data; +import me.chanjar.weixin.common.util.json.WxGsonBuilder; + +import java.io.Serializable; +import java.util.List; + +@Data +public class WxMaTemplateLibraryGetResult implements Serializable{ + + private static final long serialVersionUID = -190847592776636744L; + private String id; + private String title; + @SerializedName("keyword_list") + private List keywordList; + + @Data + public static class KeywordInfo{ + + @SerializedName("keyword_id") + private int keywordId; + private String name; + private String example; + } + + public static WxMaTemplateLibraryGetResult fromJson(String json){ + return WxGsonBuilder.create().fromJson(json, WxMaTemplateLibraryGetResult.class); + } +} diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/template/WxMaTemplateLibraryListResult.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/template/WxMaTemplateLibraryListResult.java new file mode 100644 index 0000000000..1926971b65 --- /dev/null +++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/template/WxMaTemplateLibraryListResult.java @@ -0,0 +1,28 @@ +package cn.binarywang.wx.miniapp.bean.template; + +import com.google.gson.annotations.SerializedName; +import lombok.Data; +import me.chanjar.weixin.common.util.json.WxGsonBuilder; + +import java.io.Serializable; +import java.util.List; + +@Data +public class WxMaTemplateLibraryListResult implements Serializable{ + private static final long serialVersionUID = -2780782521447602209L; + + @SerializedName("total_count") + private int totalCount; + private List list; + + public static WxMaTemplateLibraryListResult fromJson(String json){ + return WxGsonBuilder.create().fromJson(json, WxMaTemplateLibraryListResult.class); + } + + @Data + public static class TemplateItem{ + + private String id; + private String title; + } +} diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/template/WxMaTemplateListResult.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/template/WxMaTemplateListResult.java new file mode 100644 index 0000000000..0537fefcc5 --- /dev/null +++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/template/WxMaTemplateListResult.java @@ -0,0 +1,29 @@ +package cn.binarywang.wx.miniapp.bean.template; + +import com.google.gson.annotations.SerializedName; +import lombok.Data; +import me.chanjar.weixin.common.util.json.WxGsonBuilder; + +import java.io.Serializable; +import java.util.List; + +@Data +public class WxMaTemplateListResult implements Serializable{ + + private static final long serialVersionUID = -7430535579782184537L; + private List list; + + public static WxMaTemplateListResult fromJson(String json){ + return WxGsonBuilder.create().fromJson(json, WxMaTemplateListResult.class); + } + + @Data + public static class TemplateInfo{ + + @SerializedName("template_id") + private String templateId; + private String title; + private String content; + private String example; + } +} diff --git a/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaTemplateServiceImplTest.java b/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaTemplateServiceImplTest.java new file mode 100644 index 0000000000..5dfa86a8b0 --- /dev/null +++ b/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaTemplateServiceImplTest.java @@ -0,0 +1,70 @@ +package cn.binarywang.wx.miniapp.api.impl; + +import cn.binarywang.wx.miniapp.api.WxMaService; +import cn.binarywang.wx.miniapp.bean.template.WxMaTemplateAddResult; +import cn.binarywang.wx.miniapp.bean.template.WxMaTemplateLibraryGetResult; +import cn.binarywang.wx.miniapp.bean.template.WxMaTemplateLibraryListResult; +import cn.binarywang.wx.miniapp.bean.template.WxMaTemplateListResult; +import cn.binarywang.wx.miniapp.test.ApiTestModule; +import com.google.inject.Inject; +import org.assertj.core.util.Lists; +import org.testng.Assert; +import org.testng.annotations.Guice; +import org.testng.annotations.Test; + +import java.util.List; + +@Test +@Guice(modules = ApiTestModule.class) +public class WxMaTemplateServiceImplTest { + + @Inject + protected WxMaService wxService; + + @Test + public void testFindTemplateLibraryList() throws Exception { + WxMaTemplateLibraryListResult result = this.wxService.getTemplateService().findTemplateLibraryList(0, 20); + Assert.assertEquals(20, result.getList().size()); + } + + @Test + public void testFindTemplateLibraryKeywordList() throws Exception { + WxMaTemplateLibraryGetResult result = this.wxService.getTemplateService().findTemplateLibraryKeywordList("AT0004"); + Assert.assertEquals("AT0004", result.getId()); + Assert.assertEquals("交易提醒", result.getTitle()); + Assert.assertEquals(100, result.getKeywordList().size()); + } + + @Test + public void testAddTemplate() throws Exception{ + List list = Lists.newArrayList(); + list.add(1); + list.add(20); + list.add(84); + + WxMaTemplateAddResult result = this.wxService.getTemplateService().addTemplate("AT0004", list); + Assert.assertNotNull(result.getTemplateId()); + System.out.println(result); + } + + @Test + public void testFindTemplateList() throws Exception{ + WxMaTemplateListResult result = this.wxService.getTemplateService().findTemplateList(0, 20); + System.out.println(result); + } + + @Test + public void testDelTemplate() throws Exception { + + //add + List list = Lists.newArrayList(); + list.add(1); + list.add(20); + list.add(84); + + WxMaTemplateAddResult result = this.wxService.getTemplateService().addTemplate("AT0004", list); + + //delete + this.wxService.getTemplateService().delTemplate(result.getTemplateId()); + } +} diff --git a/weixin-java-miniapp/src/test/resources/test-config.sample.xml b/weixin-java-miniapp/src/test/resources/test-config.sample.xml deleted file mode 100644 index 1f6cc38887..0000000000 --- a/weixin-java-miniapp/src/test/resources/test-config.sample.xml +++ /dev/null @@ -1,11 +0,0 @@ - - JSON或者XML - appid - secret - Token - EncodingAESKey - 可以不填写 - 可以不填写 - 某个用户的openId - 模版消息的模版ID - From 74468a6898973c22f3c3b04c267b5cc95fe34b9b Mon Sep 17 00:00:00 2001 From: "lewis.lynn" Date: Mon, 26 Feb 2018 16:44:10 +0800 Subject: [PATCH 2/6] add test-config-sample.xml file --- .../src/test/resources/test-config-sample.xml | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 weixin-java-miniapp/src/test/resources/test-config-sample.xml diff --git a/weixin-java-miniapp/src/test/resources/test-config-sample.xml b/weixin-java-miniapp/src/test/resources/test-config-sample.xml new file mode 100644 index 0000000000..1f6cc38887 --- /dev/null +++ b/weixin-java-miniapp/src/test/resources/test-config-sample.xml @@ -0,0 +1,11 @@ + + JSON或者XML + appid + secret + Token + EncodingAESKey + 可以不填写 + 可以不填写 + 某个用户的openId + 模版消息的模版ID + From 97c0f5611934f87bf545e12a0a43474498a49572 Mon Sep 17 00:00:00 2001 From: lewis lynn Date: Thu, 18 Oct 2018 17:09:17 +0800 Subject: [PATCH 3/6] =?UTF-8?q?=E7=AC=AC=E4=B8=89=E6=96=B9=E5=B9=B3?= =?UTF-8?q?=E5=8F=B0=20=E5=A2=9E=E5=8A=A0=E5=88=9B=E5=BB=BA=E5=BC=80?= =?UTF-8?q?=E6=94=BE=E5=B9=B3=E5=8F=B0=E5=B8=90=E5=8F=B7=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../open/api/WxOpenComponentService.java | 14 ++++++++ .../api/impl/WxOpenComponentServiceImpl.java | 11 ++++++ .../weixin/open/bean/WxOpenCreateResult.java | 36 +++++++++++++++++++ 3 files changed, 61 insertions(+) create mode 100644 weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/WxOpenCreateResult.java diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/WxOpenComponentService.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/WxOpenComponentService.java index 69a3aeba56..0ae803fccf 100644 --- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/WxOpenComponentService.java +++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/WxOpenComponentService.java @@ -4,6 +4,7 @@ import me.chanjar.weixin.common.error.WxErrorException; import me.chanjar.weixin.mp.api.WxMpService; import me.chanjar.weixin.mp.bean.result.WxMpOAuth2AccessToken; +import me.chanjar.weixin.open.bean.WxOpenCreateResult; import me.chanjar.weixin.open.bean.WxOpenMaCodeTemplate; import me.chanjar.weixin.open.bean.message.WxOpenXmlMessage; import me.chanjar.weixin.open.bean.result.WxOpenAuthorizerInfoResult; @@ -42,6 +43,8 @@ public interface WxOpenComponentService { String MINIAPP_JSCODE_2_SESSION = "https://api.weixin.qq.com/sns/component/jscode2session?appid=%s&js_code=%s&grant_type=authorization_code&component_appid=%s"; + String CREATE_OPEN_URL= "https://api.weixin.qq.com/cgi-bin/open/create"; + WxMpService getWxMpServiceByAppid(String appid); /** @@ -168,4 +171,15 @@ public interface WxOpenComponentService { * @see #getTemplateList */ void deleteTemplate(long templateId) throws WxErrorException; + + /** + * https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1498704199_1bcax&token=6df5e3650041eff2cd3ec3662425ad8d7beec8d9&lang=zh_CN + * 创建 开放平台帐号并绑定公众号/小程序 + * + * https://api.weixin.qq.com/cgi-bin/open/create + * + * @param appId 公众号/小程序的appId + * @return + */ + WxOpenCreateResult createOpenAccount(String appId) throws WxErrorException; } diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenComponentServiceImpl.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenComponentServiceImpl.java index 93155690c9..8bc62a7773 100644 --- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenComponentServiceImpl.java +++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenComponentServiceImpl.java @@ -17,6 +17,7 @@ import me.chanjar.weixin.open.api.WxOpenService; import me.chanjar.weixin.open.bean.WxOpenAuthorizerAccessToken; import me.chanjar.weixin.open.bean.WxOpenComponentAccessToken; +import me.chanjar.weixin.open.bean.WxOpenCreateResult; import me.chanjar.weixin.open.bean.WxOpenMaCodeTemplate; import me.chanjar.weixin.open.bean.auth.WxOpenAuthorizationInfo; import me.chanjar.weixin.open.bean.message.WxOpenXmlMessage; @@ -387,4 +388,14 @@ public void deleteTemplate(long templateId) throws WxErrorException { param.addProperty("template_id", templateId); post(DELETE_TEMPLATE_URL, param.toString(), "access_token"); } + + @Override + public WxOpenCreateResult createOpenAccount(String appId) throws WxErrorException { + JsonObject param = new JsonObject(); + param.addProperty("appid", appId); + + String json = post(CREATE_OPEN_URL, param.toString()); + + return WxOpenCreateResult.fromJson(json); + } } diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/WxOpenCreateResult.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/WxOpenCreateResult.java new file mode 100644 index 0000000000..6e06a16d4a --- /dev/null +++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/WxOpenCreateResult.java @@ -0,0 +1,36 @@ +package me.chanjar.weixin.open.bean; + +import cn.binarywang.wx.miniapp.util.json.WxMaGsonBuilder; +import com.google.gson.annotations.SerializedName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import me.chanjar.weixin.common.util.json.WxGsonBuilder; + +import java.io.Serializable; + +/** + *
+ * code换取session_key接口的响应
+ * 文档地址:https://mp.weixin.qq.com/debug/wxadoc/dev/api/api-login.html#wxloginobject
+ * 微信返回报文:{"session_key":"nzoqhc3OnwHzeTxJs+inbQ==","openid":"oVBkZ0aYgDMDIywRdgPW8-joxXc4"}
+ * 
+ * @author Binary Wang + */ +@Data +@EqualsAndHashCode(callSuper = false) +public class WxOpenCreateResult implements Serializable { + + @SerializedName("open_appid") + private String openAppid; + + @SerializedName("errcode") + private String errcode; + + @SerializedName("errmsg") + private String errmsg; + + public static WxOpenCreateResult fromJson(String json) { + return WxGsonBuilder.create().fromJson(json, WxOpenCreateResult.class); + } + +} From 46464a3c8da5d1ff4106b22e710280c81bd7c3bf Mon Sep 17 00:00:00 2001 From: lewis lynn Date: Fri, 19 Oct 2018 15:40:46 +0800 Subject: [PATCH 4/6] =?UTF-8?q?=E4=BF=AE=E6=94=B9createOpenAccount?= =?UTF-8?q?=E7=9A=84accessTokenKey?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../weixin/open/api/impl/WxOpenComponentServiceImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenComponentServiceImpl.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenComponentServiceImpl.java index 8bc62a7773..4c2a0ee275 100644 --- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenComponentServiceImpl.java +++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenComponentServiceImpl.java @@ -394,7 +394,7 @@ public WxOpenCreateResult createOpenAccount(String appId) throws WxErrorExceptio JsonObject param = new JsonObject(); param.addProperty("appid", appId); - String json = post(CREATE_OPEN_URL, param.toString()); + String json = post(CREATE_OPEN_URL, param.toString(), "access_token"); return WxOpenCreateResult.fromJson(json); } From 69b5d62031d5f0a023897c89a9433dccad120bcc Mon Sep 17 00:00:00 2001 From: Binary Wang Date: Wed, 26 Dec 2018 16:24:30 +0800 Subject: [PATCH 5/6] =?UTF-8?q?=E4=BC=81=E4=B8=9A=E5=BE=AE=E4=BF=A1?= =?UTF-8?q?=E9=83=A8=E9=97=A8=E5=88=9B=E5=BB=BA=E6=8E=A5=E5=8F=A3create?= =?UTF-8?q?=E8=BF=94=E5=9B=9E=E5=80=BC=E6=94=B9=E4=B8=BAlong=E7=B1=BB?= =?UTF-8?q?=E5=9E=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/me/chanjar/weixin/cp/api/WxCpDepartmentService.java | 2 +- .../chanjar/weixin/cp/api/impl/WxCpDepartmentServiceImpl.java | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpDepartmentService.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpDepartmentService.java index 8a8ca054d3..82e571ac5b 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpDepartmentService.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpDepartmentService.java @@ -26,7 +26,7 @@ public interface WxCpDepartmentService { * @return 部门id * @throws WxErrorException 异常 */ - Integer create(WxCpDepart depart) throws WxErrorException; + Long create(WxCpDepart depart) throws WxErrorException; /** *
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpDepartmentServiceImpl.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpDepartmentServiceImpl.java
index 5d623b2ad4..481115fa51 100644
--- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpDepartmentServiceImpl.java
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpDepartmentServiceImpl.java
@@ -28,11 +28,11 @@ public WxCpDepartmentServiceImpl(WxCpService mainService) {
   }
 
   @Override
-  public Integer create(WxCpDepart depart) throws WxErrorException {
+  public Long create(WxCpDepart depart) throws WxErrorException {
     String url = "https://qyapi.weixin.qq.com/cgi-bin/department/create";
     String responseContent = this.mainService.post(url, depart.toJson());
     JsonElement tmpJsonElement = new JsonParser().parse(responseContent);
-    return GsonHelper.getAsInteger(tmpJsonElement.getAsJsonObject().get("id"));
+    return GsonHelper.getAsLong(tmpJsonElement.getAsJsonObject().get("id"));
   }
 
   @Override

From 08d27a85328b9fcbe7376bf2d486056c7eb67428 Mon Sep 17 00:00:00 2001
From: lewis lynn 
Date: Sat, 29 Dec 2018 17:29:33 +0800
Subject: [PATCH 6/6] =?UTF-8?q?WxMpCardService=E5=A2=9E=E5=8A=A0=E6=96=B0?=
 =?UTF-8?q?=E5=A2=9E=E4=BC=98=E6=83=A0=E5=88=B8=E6=8E=A5=E5=8F=A3createCar?=
 =?UTF-8?q?d()?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../weixin/mp/api/WxMpCardService.java        | 13 ++-
 .../mp/api/impl/WxMpCardServiceImpl.java      | 11 ++-
 .../me/chanjar/weixin/mp/bean/card/Card.java  | 31 ++++++
 .../mp/bean/card/CardCreateRequest.java       | 13 +++
 .../chanjar/weixin/mp/bean/card/CashCard.java | 39 ++++++++
 .../mp/bean/card/CashCardCreateRequest.java   | 25 +++++
 .../weixin/mp/bean/card/DiscountCard.java     | 32 +++++++
 .../bean/card/DiscountCardCreateRequest.java  | 25 +++++
 .../weixin/mp/bean/card/GeneralCard.java      | 33 +++++++
 .../bean/card/GeneralCardCreateRequest.java   | 26 +++++
 .../chanjar/weixin/mp/bean/card/GiftCard.java | 32 +++++++
 .../mp/bean/card/GiftCardCreateRequest.java   | 25 +++++
 .../weixin/mp/bean/card/GrouponCard.java      | 33 +++++++
 .../bean/card/GrouponCardCreateRequest.java   | 25 +++++
 .../mp/bean/card/WxMpCardCreateMessage.java   | 23 +++++
 .../mp/api/impl/WxMpCardServiceImplTest.java  | 96 +++++++++++++++++++
 16 files changed, 476 insertions(+), 6 deletions(-)
 create mode 100644 weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/Card.java
 create mode 100644 weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/CardCreateRequest.java
 create mode 100644 weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/CashCard.java
 create mode 100644 weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/CashCardCreateRequest.java
 create mode 100644 weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/DiscountCard.java
 create mode 100644 weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/DiscountCardCreateRequest.java
 create mode 100644 weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/GeneralCard.java
 create mode 100644 weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/GeneralCardCreateRequest.java
 create mode 100644 weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/GiftCard.java
 create mode 100644 weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/GiftCardCreateRequest.java
 create mode 100644 weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/GrouponCard.java
 create mode 100644 weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/GrouponCardCreateRequest.java
 create mode 100644 weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/WxMpCardCreateMessage.java

diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpCardService.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpCardService.java
index af6cefcff8..d0f06c13b8 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpCardService.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpCardService.java
@@ -2,9 +2,7 @@
 
 import me.chanjar.weixin.common.bean.WxCardApiSignature;
 import me.chanjar.weixin.common.error.WxErrorException;
-import me.chanjar.weixin.mp.bean.card.WxMpCardLandingPageCreateRequest;
-import me.chanjar.weixin.mp.bean.card.WxMpCardLandingPageCreateResult;
-import me.chanjar.weixin.mp.bean.card.WxMpCardQrcodeCreateResult;
+import me.chanjar.weixin.mp.bean.card.*;
 import me.chanjar.weixin.mp.bean.result.WxMpCardResult;
 
 /**
@@ -14,6 +12,7 @@
  * @author yuanqixun 2018-08-29
  */
 public interface WxMpCardService {
+  String CARD_CREATE = "https://api.weixin.qq.com/card/create";
   String CARD_GET = "https://api.weixin.qq.com/card/get";
   String CARD_GET_TICKET = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?type=wx_card";
   String CARD_CODE_DECRYPT = "https://api.weixin.qq.com/card/code/decrypt";
@@ -142,6 +141,14 @@ void markCardCode(String code, String cardId, String openId, boolean isMark) thr
    */
   String addTestWhiteList(String openid) throws WxErrorException;
 
+  /**
+   *
+   * @param cardCreateMessage
+   * @return
+   * @throws WxErrorException
+   */
+  WxMpCardCreateResult createCard(WxMpCardCreateMessage cardCreateMessage) throws WxErrorException;
+
   /**
    * 创建卡券二维码
    *
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpCardServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpCardServiceImpl.java
index bfd58856d0..5237fd6d2a 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpCardServiceImpl.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpCardServiceImpl.java
@@ -3,6 +3,7 @@
 import java.util.Arrays;
 import java.util.concurrent.locks.Lock;
 
+import me.chanjar.weixin.mp.bean.card.*;
 import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -22,9 +23,6 @@
 import me.chanjar.weixin.common.util.http.SimpleGetRequestExecutor;
 import me.chanjar.weixin.mp.api.WxMpCardService;
 import me.chanjar.weixin.mp.api.WxMpService;
-import me.chanjar.weixin.mp.bean.card.WxMpCardLandingPageCreateRequest;
-import me.chanjar.weixin.mp.bean.card.WxMpCardLandingPageCreateResult;
-import me.chanjar.weixin.mp.bean.card.WxMpCardQrcodeCreateResult;
 import me.chanjar.weixin.mp.bean.result.WxMpCardResult;
 import me.chanjar.weixin.mp.enums.TicketType;
 import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
@@ -265,6 +263,13 @@ public String addTestWhiteList(String openid) throws WxErrorException {
     return respone;
   }
 
+  @Override
+  public WxMpCardCreateResult createCard(WxMpCardCreateMessage cardCreateMessage) throws WxErrorException {
+
+    String response = this.wxMpService.post(CARD_CREATE, GSON.toJson(cardCreateMessage));
+    return WxMpCardCreateResult.fromJson(response);
+  }
+
   /**
    * 创建卡券二维码.
    */
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/Card.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/Card.java
new file mode 100644
index 0000000000..c97f88f2fc
--- /dev/null
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/Card.java
@@ -0,0 +1,31 @@
+package me.chanjar.weixin.mp.bean.card;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
+
+import java.io.Serializable;
+
+/**
+ * .
+ * @author leeis
+ * @Date 2018/12/29
+ */
+@Data
+public class Card implements Serializable {
+
+  private static final long serialVersionUID = -3697110761983756780L;
+
+  /**
+   * 基本信息.
+   */
+  @SerializedName("base_info")
+  private BaseInfo baseInfo;
+
+  /**
+   * 创建优惠券特有的高级字段.
+   */
+  @SerializedName("advanced_info")
+  private AdvancedInfo advancedInfo;
+
+}
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/CardCreateRequest.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/CardCreateRequest.java
new file mode 100644
index 0000000000..8cb16bc7b2
--- /dev/null
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/CardCreateRequest.java
@@ -0,0 +1,13 @@
+package me.chanjar.weixin.mp.bean.card;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @Author leeis
+ * @Date 2018/12/29
+ */
+@Data
+public class CardCreateRequest implements Serializable {
+}
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/CashCard.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/CashCard.java
new file mode 100644
index 0000000000..3d4de40c0b
--- /dev/null
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/CashCard.java
@@ -0,0 +1,39 @@
+package me.chanjar.weixin.mp.bean.card;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
+
+import java.io.Serializable;
+
+/**
+ * .
+ * @author leeis
+ * @Date 2018/12/29
+ */
+@Data
+public final class CashCard extends Card implements Serializable {
+
+  private static final long serialVersionUID = 6965491956462769745L;
+
+  /**
+   * 代金券专用,表示起用金额(单位为分),如果无起用门槛则填0
+   */
+  @SerializedName("least_cost")
+  private int leastCost;
+
+  /**
+   * 代金券专用,表示减免金额。(单位为分)
+   */
+  @SerializedName("reduce_cost")
+  private int reduceCost;
+
+  @Override
+  public String toString() {
+    return WxMpGsonBuilder.create().toJson(this);
+  }
+
+  public static CashCard fromJson(String json) {
+    return WxMpGsonBuilder.create().fromJson(json, CashCard.class);
+  }
+}
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/CashCardCreateRequest.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/CashCardCreateRequest.java
new file mode 100644
index 0000000000..dcefab0e29
--- /dev/null
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/CashCardCreateRequest.java
@@ -0,0 +1,25 @@
+package me.chanjar.weixin.mp.bean.card;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
+
+import java.io.Serializable;
+
+/**
+ * .
+ * @author leeis
+ * @Date 2018/12/29
+ */
+@Data
+public class CashCardCreateRequest extends CardCreateRequest implements Serializable {
+  @SerializedName("card_type")
+  private String cardType = "CASH";
+
+  private CashCard cash;
+
+  @Override
+  public String toString() {
+    return WxMpGsonBuilder.create().toJson(this);
+  }
+}
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/DiscountCard.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/DiscountCard.java
new file mode 100644
index 0000000000..b2c3a13ffc
--- /dev/null
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/DiscountCard.java
@@ -0,0 +1,32 @@
+package me.chanjar.weixin.mp.bean.card;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
+
+import java.io.Serializable;
+
+/**
+ * .
+ * @author leeis
+ * @Date 2018/12/29
+ */
+@Data
+public final class DiscountCard extends Card implements Serializable {
+
+  private static final long serialVersionUID = 1704610082472315077L;
+
+  /**
+   * 折扣券专用,表示打折额度(百分比)。填30就是七折。
+   */
+  private int discount;
+
+  @Override
+  public String toString() {
+    return WxMpGsonBuilder.create().toJson(this);
+  }
+
+  public static DiscountCard fromJson(String json) {
+    return WxMpGsonBuilder.create().fromJson(json, DiscountCard.class);
+  }
+}
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/DiscountCardCreateRequest.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/DiscountCardCreateRequest.java
new file mode 100644
index 0000000000..869c487c92
--- /dev/null
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/DiscountCardCreateRequest.java
@@ -0,0 +1,25 @@
+package me.chanjar.weixin.mp.bean.card;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
+
+import java.io.Serializable;
+
+/**
+ * .
+ * @author leeis
+ * @Date 2018/12/29
+ */
+@Data
+public class DiscountCardCreateRequest extends CardCreateRequest implements Serializable {
+  @SerializedName("card_type")
+  private String cardType = "DISCOUNT";
+
+  private DiscountCard discount;
+
+  @Override
+  public String toString() {
+    return WxMpGsonBuilder.create().toJson(this);
+  }
+}
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/GeneralCard.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/GeneralCard.java
new file mode 100644
index 0000000000..dcfba74da7
--- /dev/null
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/GeneralCard.java
@@ -0,0 +1,33 @@
+package me.chanjar.weixin.mp.bean.card;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
+
+import java.io.Serializable;
+
+/**
+ * .
+ * @author leeis
+ * @Date 2018/12/29
+ */
+@Data
+public final class GeneralCard extends Card implements Serializable {
+
+  private static final long serialVersionUID = -1577656733441132585L;
+
+  /**
+   * 兑换券专用,填写兑换内容的名称。
+   */
+  @SerializedName("default_detail")
+  private String defaultDetail;
+
+  @Override
+  public String toString() {
+    return WxMpGsonBuilder.create().toJson(this);
+  }
+
+  public static GeneralCard fromJson(String json) {
+    return WxMpGsonBuilder.create().fromJson(json, GeneralCard.class);
+  }
+}
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/GeneralCardCreateRequest.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/GeneralCardCreateRequest.java
new file mode 100644
index 0000000000..8a9c3d1801
--- /dev/null
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/GeneralCardCreateRequest.java
@@ -0,0 +1,26 @@
+package me.chanjar.weixin.mp.bean.card;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
+
+import java.io.Serializable;
+
+/**
+ * .
+ * @author leeis
+ * @Date 2018/12/29
+ */
+@Data
+public class GeneralCardCreateRequest extends CardCreateRequest implements Serializable {
+  @SerializedName("card_type")
+  private String cardType = "GENERAL_COUPON";
+
+  @SerializedName("general_coupon")
+  private GeneralCard generalCoupon;
+
+  @Override
+  public String toString() {
+    return WxMpGsonBuilder.create().toJson(this);
+  }
+}
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/GiftCard.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/GiftCard.java
new file mode 100644
index 0000000000..0bfb5359ba
--- /dev/null
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/GiftCard.java
@@ -0,0 +1,32 @@
+package me.chanjar.weixin.mp.bean.card;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
+
+import java.io.Serializable;
+
+/**
+ * .
+ * @author leeis
+ * @Date 2018/12/29
+ */
+@Data
+public final class GiftCard extends Card implements Serializable {
+
+  private static final long serialVersionUID = -6168739707511792266L;
+
+  /**
+   * 兑换券专用,填写兑换内容的名称。
+   */
+  private String gift;
+
+  @Override
+  public String toString() {
+    return WxMpGsonBuilder.create().toJson(this);
+  }
+
+  public static GiftCard fromJson(String json) {
+    return WxMpGsonBuilder.create().fromJson(json, GiftCard.class);
+  }
+}
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/GiftCardCreateRequest.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/GiftCardCreateRequest.java
new file mode 100644
index 0000000000..8791b70a9d
--- /dev/null
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/GiftCardCreateRequest.java
@@ -0,0 +1,25 @@
+package me.chanjar.weixin.mp.bean.card;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
+
+import java.io.Serializable;
+
+/**
+ * .
+ * @author leeis
+ * @Date 2018/12/29
+ */
+@Data
+public class GiftCardCreateRequest extends CardCreateRequest implements Serializable {
+  @SerializedName("card_type")
+  private String cardType = "GIFT";
+
+  private GiftCard gift;
+
+  @Override
+  public String toString() {
+    return WxMpGsonBuilder.create().toJson(this);
+  }
+}
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/GrouponCard.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/GrouponCard.java
new file mode 100644
index 0000000000..b0df7262bb
--- /dev/null
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/GrouponCard.java
@@ -0,0 +1,33 @@
+package me.chanjar.weixin.mp.bean.card;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
+
+import java.io.Serializable;
+
+/**
+ * .
+ * @author leeis
+ * @Date 2018/12/29
+ */
+@Data
+public final class GrouponCard extends Card implements Serializable {
+
+  private static final long serialVersionUID = 3221312561666697005L;
+
+  /**
+   * 团购券专用,团购详情
+   */
+  @SerializedName("deal_detail")
+  private String dealDetail;
+
+  @Override
+  public String toString() {
+    return WxMpGsonBuilder.create().toJson(this);
+  }
+
+  public static GrouponCard fromJson(String json) {
+    return WxMpGsonBuilder.create().fromJson(json, GrouponCard.class);
+  }
+}
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/GrouponCardCreateRequest.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/GrouponCardCreateRequest.java
new file mode 100644
index 0000000000..48b1e3e7da
--- /dev/null
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/GrouponCardCreateRequest.java
@@ -0,0 +1,25 @@
+package me.chanjar.weixin.mp.bean.card;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
+
+import java.io.Serializable;
+
+/**
+ * .
+ * @author leeis
+ * @Date 2018/12/29
+ */
+@Data
+public class GrouponCardCreateRequest extends CardCreateRequest implements Serializable {
+  @SerializedName("card_type")
+  private String cardType = "GROUPON";
+
+  private GrouponCard groupon;
+
+  @Override
+  public String toString() {
+    return WxMpGsonBuilder.create().toJson(this);
+  }
+}
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/WxMpCardCreateMessage.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/WxMpCardCreateMessage.java
new file mode 100644
index 0000000000..760002cb52
--- /dev/null
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/WxMpCardCreateMessage.java
@@ -0,0 +1,23 @@
+package me.chanjar.weixin.mp.bean.card;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
+
+import java.io.Serializable;
+
+@Data
+public final class WxMpCardCreateMessage implements Serializable {
+
+  @SerializedName("card")
+  private CardCreateRequest cardCreateRequest;
+
+  @Override
+  public String toString() {
+    return WxMpGsonBuilder.create().toJson(this);
+  }
+
+  public static WxMpCardCreateMessage fromJson(String json) {
+    return WxMpGsonBuilder.create().fromJson(json, WxMpCardCreateMessage.class);
+  }
+}
diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpCardServiceImplTest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpCardServiceImplTest.java
index 06945d9a08..5623299394 100644
--- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpCardServiceImplTest.java
+++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpCardServiceImplTest.java
@@ -2,8 +2,10 @@
 
 import com.google.inject.Inject;
 import me.chanjar.weixin.common.bean.WxCardApiSignature;
+import me.chanjar.weixin.common.error.WxErrorException;
 import me.chanjar.weixin.mp.api.WxMpService;
 import me.chanjar.weixin.mp.api.test.ApiTestModule;
+import me.chanjar.weixin.mp.bean.card.*;
 import me.chanjar.weixin.mp.bean.result.WxMpCardResult;
 import org.testng.annotations.*;
 
@@ -100,4 +102,98 @@ public void testUnavailableCardCode() throws Exception {
     assertNotNull(result);
     System.out.println(result);
   }
+
+  @Test
+  public void testCreateGrouponCard() throws WxErrorException {
+
+    BaseInfo base = new BaseInfo();
+    base.setLogoUrl("http://mmbiz.qpic.cn/mmbiz/iaL1LJM1mF9aRKPZJkmG8xXhiaHqkKSVMMWeN3hLut7X7hicFNjakmxibMLGWpXrEXB33367o7zHN0CwngnQY7zb7g/0");
+    base.setBrandName("测试优惠券");
+    base.setCodeType("CODE_TYPE_QRCODE");
+    base.setTitle("测试标题");
+    base.setColor("Color010");
+    base.setNotice("测试Notice");
+    base.setServicePhone("020-88888888");
+    base.setDescription("不可与其他优惠同享\\n如需团购券发票,请在消费时向商户提出\\n店内均可使用,仅限堂食");
+    DateInfo info = new DateInfo();
+    info.setType("DATE_TYPE_FIX_TERM");
+    info.setFixedBeginTerm(0);
+    info.setFixedTerm(30);
+    base.setDateInfo(info);
+    Sku sku = new Sku();
+    sku.setQuantity(100);
+    base.setSku(sku);
+    base.setGetLimit(1);
+    base.setCanShare(true);
+    base.setCanGiveFriend(true);
+    base.setUseAllLocations(true);
+    base.setCenterTitle("顶部居中按钮");
+    base.setCenterSubTitle("按钮下方的wording");
+    base.setCenterUrl("www.qq.com");
+    base.setCustomUrl("http://www.qq.com");
+    base.setCustomUrlName("立即使用");
+    base.setCustomUrlSubTitle("副标题tip");
+    base.setPromotionUrlName("更多优惠");
+    base.setPromotionUrl("http://www.qq.com");
+    base.setLocationIdList("1234");
+
+    //团购券
+    WxMpCardCreateMessage grouponMessage = new WxMpCardCreateMessage();
+    GrouponCardCreateRequest grouponCardCreateRequest = new GrouponCardCreateRequest();
+    GrouponCard grouponCard = new GrouponCard();
+    grouponCard.setBaseInfo(base);
+    grouponCard.setDealDetail("deal detail");
+
+    grouponCardCreateRequest.setGroupon(grouponCard);
+    grouponMessage.setCardCreateRequest(grouponCardCreateRequest);
+
+    System.out.println(this.wxService.getCardService().createCard(grouponMessage));
+
+    //现金券
+    WxMpCardCreateMessage cashMessage = new WxMpCardCreateMessage();
+    CashCardCreateRequest cashCardCreateRequest = new CashCardCreateRequest();
+    CashCard cashCard = new CashCard();
+    cashCard.setBaseInfo(base);
+    cashCard.setLeastCost(1000);
+    cashCard.setReduceCost(100);
+
+    cashCardCreateRequest.setCash(cashCard);
+    cashMessage.setCardCreateRequest(cashCardCreateRequest);
+
+    System.out.println(this.wxService.getCardService().createCard(cashMessage));
+
+    //折扣券
+    WxMpCardCreateMessage discountMessage = new WxMpCardCreateMessage();
+    DiscountCardCreateRequest discountCardCreateRequest = new DiscountCardCreateRequest();
+    DiscountCard discountCard = new DiscountCard();
+    discountCard.setBaseInfo(base);
+    discountCard.setDiscount(30);
+
+    discountCardCreateRequest.setDiscount(discountCard);
+    discountMessage.setCardCreateRequest(discountCardCreateRequest);
+
+    System.out.println(this.wxService.getCardService().createCard(discountMessage));
+
+    //兑换券
+    WxMpCardCreateMessage giftMessage = new WxMpCardCreateMessage();
+    GiftCardCreateRequest giftCardCreateRequest = new GiftCardCreateRequest();
+    GiftCard giftCard = new GiftCard();
+    giftCard.setBaseInfo(base);
+    giftCard.setGift("星巴克雪瑞纳咖啡大杯");
+
+    giftCardCreateRequest.setGift(giftCard);
+    giftMessage.setCardCreateRequest(giftCardCreateRequest);
+    System.out.println(this.wxService.getCardService().createCard(giftMessage));
+
+    //普通兑换券
+    WxMpCardCreateMessage generalMessage = new WxMpCardCreateMessage();
+    GeneralCardCreateRequest generalCardCreateRequest = new GeneralCardCreateRequest();
+    GeneralCard generalCard = new GeneralCard();
+    generalCard.setBaseInfo(base);
+    generalCard.setDefaultDetail("音乐木盒");
+
+    generalCardCreateRequest.setGeneralCoupon(generalCard);
+    generalMessage.setCardCreateRequest(generalCardCreateRequest);
+    System.out.println(this.wxService.getCardService().createCard(generalMessage));
+  }
 }