diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpCommentService.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpCommentService.java index 2ba7a092..423f61a7 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpCommentService.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpCommentService.java @@ -1,9 +1,11 @@ package me.chanjar.weixin.mp.api; import me.chanjar.weixin.common.error.WxErrorException; +import me.chanjar.weixin.mp.bean.comment.WxMpCommentListVo; /** - * 评论数据管理. + * 图文消息留言管理接口. + * https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1494572718_WzHIY * * @author Binary Wang * @date 2019-06-16 @@ -12,11 +14,34 @@ public interface WxMpCommentService { /** * 打开已群发文章评论. * https://api.weixin.qq.com/cgi-bin/comment/open?access_token=ACCESS_TOKEN - * 参数 是否必须 类型 说明 * * @param msgDataId 群发返回的msg_data_id * @param index 多图文时,用来指定第几篇图文,从0开始,不带默认操作该msg_data_id的第一篇图文 * @throws WxErrorException 异常 */ void open(Integer msgDataId, Integer index) throws WxErrorException; + + /** + * 关闭已群发文章评论. + * https://api.weixin.qq.com/cgi-bin/comment/close?access_token=ACCESS_TOKEN + * + * @param msgDataId 群发返回的msg_data_id + * @param index 多图文时,用来指定第几篇图文,从0开始,不带默认操作该msg_data_id的第一篇图文 + * @throws WxErrorException 异常 + */ + void close(Integer msgDataId, Integer index) throws WxErrorException; + + /** + * 查看指定文章的评论数据. + * https://api.weixin.qq.com/cgi-bin/comment/list?access_token=ACCESS_TOKEN + * + * @param msgDataId 群发返回的msg_data_id + * @param index 多图文时,用来指定第几篇图文,从0开始,不带默认操作该msg_data_id的第一篇图文 + * @param begin 起始位置 + * @param count 获取数目(>=50会被拒绝) + * @param type type=0 普通评论&精选评论 type=1 普通评论 type=2 精选评论 + * @return 评论列表数据 + * @throws WxErrorException 异常 + */ + WxMpCommentListVo list(Integer msgDataId, Integer index, int begin, int count, int type) throws WxErrorException; } diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpCommentServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpCommentServiceImpl.java index f58280ae..8d97af36 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpCommentServiceImpl.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpCommentServiceImpl.java @@ -5,7 +5,9 @@ import lombok.RequiredArgsConstructor; import me.chanjar.weixin.common.error.WxErrorException; import me.chanjar.weixin.mp.api.WxMpCommentService; import me.chanjar.weixin.mp.api.WxMpService; -import me.chanjar.weixin.mp.enums.WxMpApiUrl; +import me.chanjar.weixin.mp.bean.comment.WxMpCommentListVo; + +import static me.chanjar.weixin.mp.enums.WxMpApiUrl.Comment.*; /** * @author Binary Wang @@ -22,6 +24,33 @@ public class WxMpCommentServiceImpl implements WxMpCommentService { if (index != null) { json.addProperty("index", index); } - this.wxMpService.post(WxMpApiUrl.Comment.OPEN, json.toString()); + + this.wxMpService.post(OPEN, json.toString()); + } + + @Override + public void close(Integer msgDataId, Integer index) throws WxErrorException { + JsonObject json = new JsonObject(); + json.addProperty("msg_data_id", msgDataId); + if (index != null) { + json.addProperty("index", index); + } + + this.wxMpService.post(CLOSE, json.toString()); + } + + @Override + public WxMpCommentListVo list(Integer msgDataId, Integer index, int begin, int count, int type) throws WxErrorException { + JsonObject json = new JsonObject(); + json.addProperty("msg_data_id", msgDataId); + json.addProperty("begin", begin); + json.addProperty("count", count); + json.addProperty("type", type); + + if (index != null) { + json.addProperty("index", index); + } + + return WxMpCommentListVo.fromJson(this.wxMpService.post(LIST, json.toString())); } } diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/comment/WxMpCommentListVo.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/comment/WxMpCommentListVo.java new file mode 100644 index 00000000..21105465 --- /dev/null +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/comment/WxMpCommentListVo.java @@ -0,0 +1,89 @@ +package me.chanjar.weixin.mp.bean.comment; + +import com.google.gson.annotations.SerializedName; +import lombok.Data; +import me.chanjar.weixin.common.util.xml.IntegerArrayConverter; +import me.chanjar.weixin.mp.bean.device.WxDeviceQrCodeResult; +import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder; + +import java.io.Serializable; +import java.util.List; + +/** + * 群发图文评论数据. + * + * @author Binary Wang + * @date 2019-08-30 + */ +@Data +public class WxMpCommentListVo implements Serializable { + private static final long serialVersionUID = 7604754799359751247L; + + /** + * 总数,非comment的size. + */ + private Integer total; + + /** + * 评论列表. + */ + private List comment; + + @Data + public static class Reply implements Serializable { + private static final long serialVersionUID = 9174739515408520429L; + + /** + * 作者回复时间 . + */ + @SerializedName("create_time") + private String createTime; + + /** + * 作者回复内容. + */ + private String content; + } + + @Data + public static class WxMpComment implements Serializable { + private static final long serialVersionUID = 5401188720891942634L; + + /** + * 用户评论id . + */ + @SerializedName("user_comment_id") + private Integer userCommentId; + + /** + * 用户openid. + */ + private String openid; + + /** + * 评论时间. + */ + @SerializedName("create_time") + private String createTime; + + /** + * 评论内容. + */ + private String content; + + /** + * 是否精选评论,0为即非精选,1为true,即精选. + */ + @SerializedName("comment_type") + private Integer commentType; + + /** + * 作者回复. + */ + private Reply reply; + } + + public static WxMpCommentListVo fromJson(String json) { + return WxMpGsonBuilder.create().fromJson(json, WxMpCommentListVo.class); + } +} diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/enums/WxMpApiUrl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/enums/WxMpApiUrl.java index 503183cf..d85c74f4 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/enums/WxMpApiUrl.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/enums/WxMpApiUrl.java @@ -875,7 +875,17 @@ public interface WxMpApiUrl { /** * 打开已群发文章评论. */ - OPEN(API_DEFAULT_HOST_URL, "/cgi-bin/comment/open"); + OPEN(API_DEFAULT_HOST_URL, "/cgi-bin/comment/open"), + + /** + * 关闭已群发文章评论. + */ + CLOSE(API_DEFAULT_HOST_URL, "/cgi-bin/comment/close"), + + /** + * 查看指定文章的评论数据. + */ + LIST(API_DEFAULT_HOST_URL, "/cgi-bin/comment/list"); private String prefix; private String path; diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpCommentServiceImplTest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpCommentServiceImplTest.java index 60551c32..efbf6e18 100644 --- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpCommentServiceImplTest.java +++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpCommentServiceImplTest.java @@ -2,11 +2,20 @@ package me.chanjar.weixin.mp.api.impl; import com.google.inject.Inject; import me.chanjar.weixin.common.error.WxErrorException; +import me.chanjar.weixin.mp.api.WxMpCommentService; import me.chanjar.weixin.mp.api.WxMpService; import me.chanjar.weixin.mp.api.test.ApiTestModule; +import me.chanjar.weixin.mp.bean.comment.WxMpCommentListVo; import org.testng.annotations.Guice; import org.testng.annotations.Test; +import static me.chanjar.weixin.mp.enums.WxMpApiUrl.Comment.LIST; +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Matchers.any; +import static org.mockito.Matchers.anyString; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.spy; + /** * 测试类. * @@ -25,4 +34,44 @@ public class WxMpCommentServiceImplTest { this.wxService.getCommentService().open(1, null); this.wxService.getCommentService().open(1, 0); } + + @Test + public void testClose() throws WxErrorException { + this.wxService.getCommentService().close(1000000001, null); + this.wxService.getCommentService().close(1, 0); + } + + @Test + public void testList() throws WxErrorException { + String expectedResponse = "{\n" + + " \"errcode\": 0,\n" + + " \"errmsg\": \"ok\",\n" + + " \"total\": 1,\n" + + " \"comment\": [\n" + + " {\n" + + " \"user_comment_id\": 1,\n" + + " \"openid\": \"OPENID\",\n" + + " \"create_time\": \"CREATE_TIME\",\n" + + " \"content\": \"CONTENT\",\n" + + " \"comment_type\": 1,\n" + + " \"reply\": {\n" + + " \"content\": \"CONTENT\",\n" + + " \"create_time\": \"CREATE_TIME\"\n" + + " }\n" + + " }\n" + + " ]\n" + + "}"; + + wxService = spy(wxService); + WxMpCommentService commentService = new WxMpCommentServiceImpl(wxService); + doReturn(expectedResponse).when(wxService).post(anyString(), anyString()); + + final WxMpCommentListVo commentListVo = commentService.list(1, 1, 1, 1, 1); + assertThat(commentListVo).isNotNull(); + System.out.println(commentListVo); + assertThat(commentListVo.getTotal()).isEqualTo(1); + assertThat(commentListVo.getComment()).isNotEmpty(); + + assertThat(commentListVo.getComment().get(0).getReply()).isNotNull(); + } }