07. 微信公众号客服信息

1. 官方文档
  1. 因为微信服务器发送消息时,5秒不回复则会重试,倘若我们的服务器处理数据或者网络的原因没有及时回复,将会造成不好的结果
  2. 可以选择给予微信服务器回复,再异步调客服接口给予用户回复
2. 实现
  1. 支持发送文本消息图片消息语音消息视频消息音乐消息图文消息菜单消息卡券等消息

    1. 发送的是 Json 数据

      • 文本消息示例

        {
            "touser":"OPENID",
            "msgtype":"text",
            "text":
            {
                 "content":"Hello World"
            }
        }
        
    2. 共有字段

      /**
       * 发送的用户
       */
      @JsonProperty("touser")
      protected String toUser;
      
      /**
       * 消息类型
       */
      @JsonProperty("msgtype")
      protected String msgType;
      
    3. 文本消息、图片消息示例

      import com.small.nine.wxmp.common.constant.WxConstant;
      import lombok.Data;
      import lombok.EqualsAndHashCode;
      
      import java.util.HashMap;
      import java.util.Map;
      
      /**
       * 客服发送 文本信息
       *
       * @author sheng_zs@126.com
       * @date 2021-08-06 16:54
       */
      @Data
      @EqualsAndHashCode(callSuper = true)
      public class WxKfTextMsgBean extends WxKfMsgBaseBean {
          private static final long serialVersionUID = 1L;
      
          /**
           * 消息内容<br>
           * 支持插入跳小程序的文字链:<br>
           * {@literal <a href="http://www.qq.com" data-miniprogram-appid="appid" data-miniprogram-path="pages/index/index">点击跳小程序</a>}
           * <ol>
           *     <li>data-miniprogram-appid 项,填写小程序appid,则表示该链接跳小程序;</li>
           *     <li>data-miniprogram-path项,填写小程序路径,路径与app.json中保持一致,可带参数;</li>
           *     <li>对于不支持data-miniprogram-appid 项的客户端版本,如果有herf项,则仍然保持跳 href 中的网页链接;</li>
           *     <li>data-miniprogram-appid对应的小程序必须与公众号有绑定关系。</li>
           * </ol>
           */
          private Map<String, String> text;
      
          /**
           * 初始化,并返回
           *
           * @param toUser  发送对象
           * @param content 消息内容
           * @return {@link WxKfTextMsgBean}
           */
          public static WxKfTextMsgBean getInstance(String toUser, String content) {
              WxKfTextMsgBean msgBean = new WxKfTextMsgBean();
              msgBean.setToUser(toUser);
              msgBean.setMsgType(WxConstant.MSG_TYPE_TEXT);
              Map<String, String> map = new HashMap<>();
              map.put(WxConstant.PARAM_CONTENT, content);
              msgBean.setText(map);
              return msgBean;
          }
      }
      
      import com.small.nine.wxmp.common.constant.WxConstant;
      import lombok.Data;
      import lombok.EqualsAndHashCode;
      
      import java.util.HashMap;
      import java.util.Map;
      
      /**
       * 客服返回 图片信息
       *
       * @author sheng_zs@126.com
       * @date 2021-08-06 17:00
       */
      @Data
      @EqualsAndHashCode(callSuper = true)
      public class WxKfImageMsgBean extends WxKfMsgBaseBean {
          private static final long serialVersionUID = 1L;
      
          /**
           * 图片内容
           */
          private Map<String, String> image;
      
          /**
           * 初始化,并返回
           *
           * @param toUser  发送对象
           * @param mediaId 图片 ID
           * @return {@link WxKfImageMsgBean}
           */
          public static WxKfImageMsgBean getInstance(String toUser, String mediaId) {
              WxKfImageMsgBean msgBean = new WxKfImageMsgBean();
              msgBean.setToUser(toUser);
              msgBean.setMsgType(WxConstant.MSG_TYPE_IMAGE);
              // 图片信息
              Map<String, String> map = new HashMap<>();
              map.put(WxConstant.PARAM_MEDIA_ID, mediaId);
              msgBean.setImage(map);
              return msgBean;
          }
      }
      
  2. serviceImpl

    import cn.hutool.http.HttpUtil;
    import com.small.nine.wxmp.common.constant.WxConstant;
    import com.small.nine.wxmp.domain.bean.wx.WxInMsgBean;
    import com.small.nine.wxmp.domain.bean.wx.kf.msg.WxKfImageMsgBean;
    import com.small.nine.wxmp.domain.bean.wx.kf.msg.WxKfNewsMsgBean;
    import com.small.nine.wxmp.domain.bean.wx.kf.msg.WxKfTextMsgBean;
    import com.small.nine.wxmp.service.WxAsyncService;
    import com.small.nine.wxmp.service.WxService;
    import com.small.nine.wxmp.utils.wx.JsonUtils;
    import lombok.extern.slf4j.Slf4j;
    import org.springframework.scheduling.annotation.Async;
    import org.springframework.stereotype.Service;
    
    import javax.annotation.Resource;
    
    /**
     * @author sheng_zs@126.com
     * @date 2021-08-06 17:40
     */
    @Slf4j
    @Service
    public class WxAsyncServiceImpl implements WxAsyncService {
        @Resource
        private WxService wxService;
    
        @Async
        @Override
        public void kfSend(WxInMsgBean msgBean) {
            String msg = "";
    
            log.info("微信+++++异步处理+++++ one +++++ WxInMsgBean: {}", msgBean.toString());
            switch (msgBean.getMsgType()) {
                case WxConstant.MSG_TYPE_TEXT:
                    // 处理 文本信息
                    msg = JsonUtils.writeValueAsString(WxKfTextMsgBean.getInstance(msgBean.getFromUserName(), msgBean.getContent()));
                    break;
                case WxConstant.MSG_TYPE_IMAGE:
                    // 处理图片信息
                    msg = JsonUtils.writeValueAsString(WxKfImageMsgBean.getInstance(msgBean.getFromUserName(), msgBean.getMediaId()));
                    break;
                case WxConstant.MSG_TYPE_EVENT:
                    // 处理事件
                    switch (msgBean.getEvent()) {
                        case WxConstant.EVENT_TYPE_SUBSCRIBE:
                            // 用户关注公众号
                            msg = JsonUtils.writeValueAsString(WxKfNewsMsgBean.getInstance(msgBean.getFromUserName(), "http://www.baidu.com", "http://mmbiz.qpic.cn/mmbiz_jpg/8IpUia88gYWiaj07aFP5jcHH5gDlicXhlgNwS2gxfEbC1T4NLGAr9qowOPLHIXBHFhewUxaogqcDMHgcmnZyt5MibA/0", "title", "说明"));
                            break;
                        case WxConstant.EVENT_TYPE_UNSUBSCRIBE:
                            // 用户取消关注
                            // 加入黑名单、删除数据库等操作
                            break;
                        default:
                            msg = JsonUtils.writeValueAsString(WxKfTextMsgBean.getInstance(msgBean.getFromUserName(), "事件推送:" + msgBean.getEvent()));
                            break;
                    }
                    break;
                default:
                    msg = JsonUtils.writeValueAsString(WxKfTextMsgBean.getInstance(msgBean.getFromUserName(), "请发送图片或者文字内容!"));
                    break;
            }
            log.info("回复信息 msg: {}", msg);
            // 调用接口
            final String url = String.format(WxConstant.URL_CUSTOM_SEND_POST, wxService.getAccessToken());
            String post = HttpUtil.post(url, msg);
            log.info("微信+++++异步处理+++++ end +++++ 发送结果:{}", post);
        }
    }    
    
  3. 源码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值