content: /*
   * 微信公众平台(JAVA) SDK
   *
   * Copyright (c) 2014, Ansitech Network Technology Co.,Ltd All rights reserved.
   * 
   * http://www.weixin4j.org/
   *
   * Licensed under the Apache License, Version 2.0 (the "License");
   * you may not use this file except in compliance with the License.
   * You may obtain a copy of the License at
   *
   *      http://www.apache.org/licenses/LICENSE-2.0
   *
   * Unless required by applicable law or agreed to in writing, software
   * distributed under the License is distributed on an "AS IS" BASIS,
   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   * See the License for the specific language governing permissions and
   * limitations under the License.
   */
  package org.weixin4j.component;
  
  import com.alibaba.fastjson.JSONObject;
  import java.util.List;
  import org.weixin4j.Configuration;
  import org.weixin4j.Weixin;
  import org.weixin4j.WeixinException;
  import org.weixin4j.http.HttpsClient;
  import org.weixin4j.http.Response;
  import org.weixin4j.model.message.Articles;
  import org.weixin4j.model.message.template.Miniprogram;
  import org.weixin4j.model.message.template.TemplateData;
  import org.weixin4j.model.message.template.TemplateMessage;
  
  /**
   * 消息管理组件
   *
   * @author yangqisheng
   * @since 0.1.0
   */
  public class MessageComponent extends AbstractComponent {
  
      public MessageComponent(Weixin weixin) {
          super(weixin);
      }
  
      /**
       * 根据openid列表群发文本消息
       *
       * @param openids 粉丝openid集合
       * @param txtContent 文本消息内容
       * @return 发送成功则返回群发消息Id，否则返回null
       * @throws org.weixin4j.WeixinException 微信操作异常
       */
      public String massSendContent(String[] openids, String txtContent) throws WeixinException {
          JSONObject json = new JSONObject();
          JSONObject text = new JSONObject();
          text.put("content", txtContent);
          json.put("touser", openids);
          json.put("text", text);
          json.put("msgtype", "text");
          //创建请求对象
          HttpsClient http = new HttpsClient();
          Response res = http.post("https://api.weixin.qq.com/cgi-bin/message/mass/send?access_token=" + weixin.getToken().getAccess_token(), json);
          //根据请求结果判定，是否验证成功
          JSONObject jsonObj = res.asJSONObject();
          if (jsonObj != null) {
              if (Configuration.isDebug()) {
                  System.out.println("群发文本消息返回json：" + jsonObj.toString());
              }
              Object errcode = jsonObj.get("errcode");
              if (errcode != null && !errcode.toString().equals("0")) {
                  //返回异常信息
                  throw new WeixinException(getCause(jsonObj.getIntValue("errcode")));
              } else {
                  //返回群发消息id
                  return jsonObj.getString("msg_id");
              }
          }
          return null;
      }
  
      /**
       * 根据openid列表群发文本消息
       *
       * @param openids 粉丝openid集合
       * @param mediaId 图文消息素材Id
       * @return 发送成功则返回群发消息Id，否则返回null
       * @throws org.weixin4j.WeixinException 微信操作异常
       */
      public String massSendNews(String[] openids, String mediaId) throws WeixinException {
          JSONObject json = new JSONObject();
          JSONObject media_id = new JSONObject();
          media_id.put("media_id", mediaId);
          json.put("touser", openids);
          json.put("mpnews", media_id);
          json.put("msgtype", "mpnews");
          //创建请求对象
          HttpsClient http = new HttpsClient();
          Response res = http.post("https://api.weixin.qq.com/cgi-bin/message/mass/send?access_token=" + weixin.getToken().getAccess_token(), json);
          //根据请求结果判定，是否验证成功
          JSONObject jsonObj = res.asJSONObject();
          if (jsonObj != null) {
              if (Configuration.isDebug()) {
                  System.out.println("/message/mass/send返回json：" + jsonObj.toString());
              }
              Object errcode = jsonObj.get("errcode");
              if (errcode != null && !errcode.toString().equals("0")) {
                  //返回异常信息
                  throw new WeixinException(getCause(jsonObj.getIntValue("errcode")));
              } else {
                  //返回群发图文id
                  return jsonObj.getString("msg_id");
              }
          }
          return null;
      }
  
      /**
       * 发送客服文本消息
       *
       * @param openid 粉丝openid
       * @param txtContent 文本消息内容
       * @throws org.weixin4j.WeixinException 微信操作异常
       */
      public void customSendContent(String openid, String txtContent) throws WeixinException {
          JSONObject json = new JSONObject();
          JSONObject text = new JSONObject();
          text.put("content", txtContent);
          json.put("touser", openid);
          json.put("text", text);
          json.put("msgtype", "text");
          //创建请求对象
          HttpsClient http = new HttpsClient();
          Response res = http.post("https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token=" + weixin.getToken().getAccess_token(), json);
          //根据请求结果判定，是否验证成功
          JSONObject jsonObj = res.asJSONObject();
          if (jsonObj != null) {
              if (Configuration.isDebug()) {
                  System.out.println("customSendContent返回json：" + jsonObj.toString());
              }
              Object errcode = jsonObj.get("errcode");
              if (errcode != null && !errcode.toString().equals("0")) {
                  //返回异常信息
                  throw new WeixinException(getCause(jsonObj.getIntValue("errcode")));
              }
          }
      }
  
      /**
       * 发送客服图文消息
       *
       * @param openid 粉丝openid
       * @param articles 图文消息，一个图文消息支持1到10条图文
       * @throws org.weixin4j.WeixinException 微信操作异常
       */
      public void customSendNews(String openid, List<Articles> articles) throws WeixinException {
          JSONObject json = new JSONObject();
          json.put("touser", openid);
          json.put("msgtype", "news");
          JSONObject news = new JSONObject();
          news.put("articles", articles);
          json.put("news", news);
          //创建请求对象
          HttpsClient http = new HttpsClient();
          Response res = http.post("https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token=" + weixin.getToken().getAccess_token(), json);
          //根据请求结果判定，是否验证成功
          JSONObject jsonObj = res.asJSONObject();
          if (jsonObj != null) {
              if (Configuration.isDebug()) {
                  System.out.println("customSendNews返回json：" + jsonObj.toString());
              }
              Object errcode = jsonObj.get("errcode");
              if (errcode != null && !errcode.toString().equals("0")) {
                  //返回异常信息
                  throw new WeixinException(getCause(jsonObj.getIntValue("errcode")));
              }
          }
      }
  
      /**
       * 发送模板消息
       *
       * @param openid 接收者
       * @param templateId 模板消息ID
       * @param datas 模板数据
       * @throws org.weixin4j.WeixinException 微信操作异常
       */
      public void sendTemplateMessage(String openid, String templateId, List<TemplateData> datas) throws WeixinException {
          sendTemplateMessage(openid, templateId, datas, null, null);
      }
  
      /**
       * 发送模板消息(带跳转链接)
       *
       * @param openid 接收者
       * @param templateId 模板消息ID
       * @param datas 模板数据
       * @param miniprogram 跳小程序所需数据，不需跳小程序可不用传该数据
       * @throws org.weixin4j.WeixinException 微信操作异常
       */
      public void sendTemplateMessage(String openid, String templateId, List<TemplateData> datas, Miniprogram miniprogram) throws WeixinException {
          sendTemplateMessage(openid, templateId, datas, miniprogram, null);
      }
  
      /**
       * 发送模板消息(带跳转链接)
       *
       * @param openid 接收者
       * @param templateId 模板消息ID
       * @param datas 模板数据
       * @param url 模板跳转链接
       * @throws org.weixin4j.WeixinException 微信操作异常
       */
      public void sendTemplateMessage(String openid, String templateId, List<TemplateData> datas, String url) throws WeixinException {
          sendTemplateMessage(openid, templateId, datas, null, url);
      }
  
      /**
       * 发送模板消息(带跳转小程序或链接)
       *
       * <p>
       * 注：url和miniprogram都是非必填字段，若都不传则模板无跳转；若都传，会优先跳转至小程序。开发者可根据实际需要选择其中一种跳转方式即可。当用户的微信客户端版本不支持跳小程序时，将会跳转至url。</p>
       *
       * @param openid 接收者
       * @param templateId 模板消息ID
       * @param datas 模板数据
       * @param miniprogram 跳小程序所需数据，不需跳小程序可不用传该数据
       * @param url 模板跳转链接
       * @throws org.weixin4j.WeixinException 微信操作异常
       */
      public void sendTemplateMessage(String openid, String templateId, List<TemplateData> datas, Miniprogram miniprogram, String url) throws WeixinException {
          //内部业务验证
          if (openid == null || openid.equals("")) {
              throw new IllegalStateException("openid can not be null or empty");
          }
          if (templateId == null || templateId.equals("")) {
              throw new IllegalStateException("templateId can not be null or empty");
          }
          if (datas == null || datas.isEmpty()) {
              throw new IllegalStateException("datas can not be null or empty");
          }
          JSONObject json = new JSONObject();
          json.put("touser", openid);
          json.put("template_id", templateId);
          //添加模板跳转链接
          if (url != null && !url.equals("")) {
              json.put("url", url);
          }
          //添加小程序
          if (miniprogram != null) {
              JSONObject program = new JSONObject();
              program.put("appid", miniprogram.getAppid());
              program.put("pagepath", miniprogram.getPagepath());
              json.put("miniprogram", program);
          }
          //添加模板数据
          JSONObject data = new JSONObject();
          for (TemplateData templateData : datas) {
              JSONObject dataContent = new JSONObject();
              dataContent.put("value", templateData.getValue());
              dataContent.put("color", templateData.getColor());
              data.put(templateData.getKey(), dataContent);
          }
          json.put("data", data);
          //创建请求对象
          HttpsClient http = new HttpsClient();
          Response res = http.post("https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + weixin.getToken().getAccess_token(), json);
          //根据请求结果判定，是否验证成功
          JSONObject jsonObj = res.asJSONObject();
          if (jsonObj != null) {
              if (Configuration.isDebug()) {
                  System.out.println("sendTemplateMessage返回json：" + jsonObj.toString());
              }
              Object errcode = jsonObj.get("errcode");
              if (errcode != null && !errcode.toString().equals("0")) {
                  //返回异常信息
                  throw new WeixinException(getCause(jsonObj.getIntValue("errcode")));
              }
          }
      }
  
      /**
       * 发送模板消息
       *
       * @param templateMessage 模板消息
       * @throws org.weixin4j.WeixinException 微信操作异常
       */
      public void sendTemplateMessage(TemplateMessage templateMessage) throws WeixinException {
          sendTemplateMessage(templateMessage.getOpenid(), templateMessage.getTemplateId(), templateMessage.getData(), templateMessage.getMiniprogram(), templateMessage.getUrl());
      }
  }
  