Quellcode durchsuchen

微信公众号服务配置-功能优化2

chao vor 3 Jahren
Ursprung
Commit
f1068190b5

+ 2 - 0
src/main/java/com/caimei365/wechat/WechatApplication.java

@@ -2,6 +2,8 @@ package com.caimei365.wechat;
 
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.context.annotation.Bean;
+import org.springframework.web.client.RestTemplate;
 
 /**
  * @author Administrator

+ 1 - 0
src/main/java/com/caimei365/wechat/controller/WechatDebugApi.java

@@ -62,6 +62,7 @@ public class WechatDebugApi {
 
     /**
      * 公众号迁移后更新OpenId
+     * 帐号迁移15天后,该转换接口将会失效、无法拉取到数据
      */
     @PostMapping("/wechat/debug/change/openid")
     public String changeOpenId(@RequestBody String json) {

+ 45 - 56
src/main/java/com/caimei365/wechat/controller/WechatServerApi.java

@@ -50,66 +50,55 @@ public class WechatServerApi {
             // 消息类型
             String msgType = requestMap.get(WeChatConstant.MSG_TYPE);
             // 消息类型:事件推送
-            if (msgType.equals(WeChatConstant.MESSAGE_TYPE_EVENT)) {
-                // 事件类型
-                String eventType = requestMap.get(WeChatConstant.EVENT);
-                // subscribe(订阅/关注)
-                if (eventType.equals(WeChatConstant.EVENT_TYPE_SUBSCRIBE)) {
-                    respXml = wechatServerService.handleSubscribeMsg(requestMap);
-                }
-                // unsubscribe(取消订阅),取消订阅后用户不会再收到公众账号发送的消息,因此回复"success"
-                else if (eventType.equals(WeChatConstant.EVENT_TYPE_UNSUBSCRIBE)) {
+            switch (msgType) {
+                case WeChatConstant.MESSAGE_TYPE_EVENT:
+                    // 事件类型
+                    String eventType = requestMap.get(WeChatConstant.EVENT);
+                    // subscribe(订阅/关注)
+                    switch (eventType) {
+                        case WeChatConstant.EVENT_TYPE_SUBSCRIBE:
+                            respXml = wechatServerService.handleSubscribeMsg(requestMap);
+                            break;
+                        // unsubscribe(取消订阅),取消订阅后用户不会再收到公众账号发送的消息,因此回复"success"
+                        case WeChatConstant.EVENT_TYPE_UNSUBSCRIBE:
+                            respXml = "success";
+                            break;
+                        // 扫描带参数二维码
+                        case WeChatConstant.EVENT_TYPE_SCAN:
+                            respXml = wechatServerService.handleScanMsg(requestMap);
+                            break;
+                        // 上报地理位置
+                        case WeChatConstant.EVENT_TYPE_LOCATION:
+                            respXml = wechatServerService.handleLocationMsg(requestMap);
+                            break;
+                        // 点击自定义菜单
+                        case WeChatConstant.EVENT_TYPE_CLICK:
+                            respXml = wechatServerService.handleClickMenuMsg(requestMap);
+                            break;
+                        default:
+                            break;
+                    }
+                // 图片消息
+                case WeChatConstant.MESSAGE_TYPE_IMAGE:
+                // 语音消息
+                case WeChatConstant.MESSAGE_TYPE_VOICE:
+                // 视频消息
+                case WeChatConstant.MESSAGE_TYPE_VIDEO:
+                // 地理位置消息
+                case WeChatConstant.MESSAGE_TYPE_LOCATION:
+                // 链接消息
+                case WeChatConstant.MESSAGE_TYPE_LINK:
+                    // TODO 暂未开发, 直接返回success
                     respXml = "success";
-                }
-                // 扫描带参数二维码
-                else if (eventType.equals(WeChatConstant.EVENT_TYPE_SCAN)) {
-                    respXml = wechatServerService.handleScanMsg(requestMap);
-                }
-                // 上报地理位置
-                else if (eventType.equals(WeChatConstant.EVENT_TYPE_LOCATION)) {
-                    respXml = wechatServerService.handleLocationMsg(requestMap);
-                }
-                // 点击自定义菜单
-                else if (eventType.equals(WeChatConstant.EVENT_TYPE_CLICK)) {
-                    respXml = wechatServerService.handleClickMenuMsg(requestMap);
-                }
-            }
-            // 图片消息
-            else if (msgType.equals(WeChatConstant.MESSAGE_TYPE_IMAGE)) {
-                // TODO 暂未开发
-                respXml = "success";
-            }
-            // 语音消息
-            else if (msgType.equals(WeChatConstant.MESSAGE_TYPE_VOICE)) {
-                // TODO 暂未开发
-                respXml = "success";
-            }
-            // 视频消息
-            else if (msgType.equals(WeChatConstant.MESSAGE_TYPE_VIDEO)) {
-                // TODO 暂未开发
-                respXml = "success";
-            }
-            // 地理位置消息
-            else if (msgType.equals(WeChatConstant.MESSAGE_TYPE_LOCATION)) {
-                // TODO 暂未开发
-                respXml = "success";
-            }
-            // 链接消息
-            else if (msgType.equals(WeChatConstant.MESSAGE_TYPE_LINK)) {
-                // TODO 暂未开发
-                respXml = "success";
-            }
-            // 文本消息
-            else if (msgType.equals(WeChatConstant.MESSAGE_TYPE_TEXT)) {
-                respXml = wechatServerService.handleTextMsg(requestMap);
-            }
-            // 默认文本消息
-            else {
-                respXml = wechatServerService.handleTextMsg(requestMap);
+                    break;
+                // 默认文本消息
+                default:
+                    respXml = wechatServerService.handleTextMsg(requestMap);
+                    break;
             }
             if (respXml == null) { respXml = "success"; }
         } catch (Exception e) {
-            log.info("微信公众号消息处理时出现异常:" + e.getMessage());
+            log.info(">>>>>>>>>>微信公众号消息处理时出现异常:" + e);
         }
         log.info(">>>>>>>>>>微信回复用户消息:" + respXml);
         long endProcessTime = System.currentTimeMillis();

+ 35 - 32
src/main/java/com/caimei365/wechat/service/impl/WechatServerServiceImpl.java

@@ -1,11 +1,13 @@
 package com.caimei365.wechat.service.impl;
 
+import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import com.caimei365.wechat.dao.WeChatDao;
 import com.caimei365.wechat.entity.WeChatConstant;
 import com.caimei365.wechat.entity.WechatArticleDetail;
 import com.caimei365.wechat.entity.WechatReply;
 import com.caimei365.wechat.service.WechatServerService;
+import com.caimei365.wechat.utils.HttpUtil;
 import com.caimei365.wechat.utils.MessageUtil;
 import com.caimei365.wechat.utils.SignUtil;
 import lombok.extern.slf4j.Slf4j;
@@ -96,43 +98,42 @@ public class WechatServerServiceImpl implements WechatServerService {
         }
         // 根据keyword匹配数据库回复配置
         WechatReply reply = weChatDao.getReplyByParams("input", keyword, wxType);
-//        if (null == reply) {
-//            reply = weChatDao.getReplyByParams("input", "autoReply", wxType);
-//        }
-//        if (null == reply) {
-//            // 将消息转发到到客服系统
-//            return MessageUtil.setCustomerXml(openid, wxType);
-//        }
-        log.info(">>>>>>>>>>匹配已配置关键词:" + keyword);
-        String replyXml = setXmlByDatabaseReply(openid, wxType, reply);
-        if (replyXml != null) {
-            return replyXml;
+        if (null != reply) {
+            log.info(">>>>>>>>>>匹配已配置关键词:" + keyword);
+            String replyXml = setXmlByDatabaseReply(openid, wxType, reply);
+            if (StringUtils.hasLength(replyXml)) {
+                return replyXml;
+            }
         }
         log.info(">>>>>>>>>>模糊搜索:" + keyword);
         WechatArticleDetail article = null;
         RestTemplate restTemplate = new RestTemplate();
         // https://core.caimei365.com/commodity/search/query/product?keyword=
-        String uri = coreDomain + "commodity/search/query/product?keyword="+keyword;
-        JSONObject forObject = restTemplate.getForObject(uri, JSONObject.class);
-        if(forObject != null){
-            String data = forObject.getString("data");
-            if(StringUtils.hasLength(data)){
-                JSONObject parse = JSONObject.parseObject(data);
-                if(parse != null){
-                    Integer total = parse.getInteger("total");
-                    if(total>0){
-                        article = new WechatArticleDetail();
-                        article.setTitle("帮您匹配到"+ total + "个商品,点击查看");
-                        article.setPicUrl(imageDomain + "/group1/M00/03/EC/rB-lGGHg9ZOAe8VdAAJevlD1ofg562.png");
-                        String url = wwwDomain + "product/list.html?keyword="+keyword;
-                        try {
-                            url = URLEncoder.encode(url, "UTF-8");
-                        } catch (UnsupportedEncodingException ignored) {}
-                        article.setUrl("https://open.weixin.qq.com/connect/oauth2/authorize?appid=" + caimeiAppid + "&redirect_uri=" + url +"&response_type=code&scope=snsapi_base&state=reLogin#wechat_redirect");
+        String uri = coreDomain + "/commodity/search/query/product?keyword="+keyword;
+        try {
+            String jsonResult = HttpUtil.httpRequest(URLEncoder.encode(uri, "UTF-8"), "GET", null);
+            log.info(">>>>>>>>>>uri:" + uri + ",jsonResult:" + jsonResult);
+            if(StringUtils.hasLength(jsonResult)){
+                JSONObject jsonObject = JSON.parseObject(jsonResult);
+                String data = jsonObject.getString("data");
+                if(StringUtils.hasLength(data)){
+                    JSONObject parse = JSONObject.parseObject(data);
+                    if(parse != null){
+                        Integer total = parse.getInteger("total");
+                        if(total>0){
+                            article = new WechatArticleDetail();
+                            article.setTitle("帮您匹配到"+ total + "个商品,点击查看");
+                            article.setPicUrl(imageDomain + "/group1/M00/03/EC/rB-lGGHg9ZOAe8VdAAJevlD1ofg562.png");
+                            String url = wwwDomain + "product/list.html?keyword="+keyword;
+                            try {
+                                url = URLEncoder.encode(url, "UTF-8");
+                            } catch (UnsupportedEncodingException ignored) {}
+                            article.setUrl("https://open.weixin.qq.com/connect/oauth2/authorize?appid=" + caimeiAppid + "&redirect_uri=" + url +"&response_type=code&scope=snsapi_base&state=reLogin#wechat_redirect");
+                        }
                     }
                 }
             }
-        }
+        } catch (Exception ignored) {}
         if (null != article) {
             List<WechatArticleDetail> articles = new ArrayList<>();
             articles.add(article);
@@ -140,10 +141,11 @@ public class WechatServerServiceImpl implements WechatServerService {
         }
         log.info(">>>>>>>>>>默认无关键字匹配回复图文1220");
         List<WechatArticleDetail> defaultList = weChatDao.getArticleDetailList(1220);
-        if (CollectionUtils.isEmpty(defaultList)) {
+        if (!CollectionUtils.isEmpty(defaultList)) {
             return MessageUtil.setArticleXml(openid, wxType, defaultList);
         }
-        return null;
+        // 将消息转发到到客服系统
+        return MessageUtil.setCustomerXml(openid, wxType);
     }
 
     /**
@@ -277,7 +279,8 @@ public class WechatServerServiceImpl implements WechatServerService {
         if ("news".equals(reply.getResponseType())) {
             // 回复图文
             List<WechatArticleDetail> articleList = weChatDao.getArticleDetailList(reply.getRelateId());
-            if (CollectionUtils.isEmpty(articleList)) {
+            log.info(">>>>>>>>>>匹配到图文内容数量:" + articleList.size());
+            if (!CollectionUtils.isEmpty(articleList)) {
                 return MessageUtil.setArticleXml(openid, wxType, articleList);
             }
         } else {

+ 1 - 93
src/main/java/com/caimei365/wechat/utils/MessageUtil.java

@@ -4,14 +4,12 @@ import com.caimei365.wechat.entity.WeChatConstant;
 import com.caimei365.wechat.entity.WechatArticleDetail;
 import lombok.extern.slf4j.Slf4j;
 import org.dom4j.Document;
-import org.dom4j.DocumentHelper;
 import org.dom4j.Element;
 import org.dom4j.io.SAXReader;
 
 import javax.servlet.http.HttpServletRequest;
 import java.io.InputStream;
 import java.util.HashMap;
-import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 
@@ -123,102 +121,12 @@ public class MessageUtil {
                 content.append("<item>");
                 content.append("<Title><![CDATA[").append(article.getTitle()).append("]]></Title>");
                 content.append("<Description><![CDATA[").append(article.getDescription()).append("]]></Description>");
-                content.append("<Url><![CDATA[").append(article.getUrl()).append("]]></Url>");
                 content.append("<PicUrl><![CDATA[").append(article.getPicUrl()).append("]]></PicUrl>");
+                content.append("<Url><![CDATA[").append(article.getUrl()).append("]]></Url>");
                 content.append("</item>");
             }
         }
         content.append("</Articles>");
         return setRootXml(toUser, fromUser, content.toString());
     }
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-//    /**
-//     * (多层)map转换为xml格式字符串
-//     *
-//     * @param map 需要转换为xml的map
-//     * @param isCDATA 是否加入CDATA标识符 true:加入 false:不加入
-//     * @return xml字符串
-//     */
-//    public static String multiMapToXml(Map<String, Object> map, boolean isCDATA){
-//        String parentName = "xml";
-//        Document doc = DocumentHelper.createDocument();
-//        doc.addElement(parentName);
-//        return recursionMapToXml(doc.getRootElement(), parentName, map, isCDATA);
-//    }
-//
-//    /**
-//     * multilayerMapToXml核心方法,递归调用
-//     *
-//     * @param element 节点元素
-//     * @param parentName 根元素属性名
-//     * @param map 需要转换为xml的map
-//     * @param isCDATA 是否加入CDATA标识符 true:加入 false:不加入
-//     * @return xml字符串
-//     */
-//    private static String recursionMapToXml(Element element, String parentName, Map<String, Object> map, boolean isCDATA) {
-//        Element xmlElement = element.addElement(parentName);
-//        map.keySet().forEach(key -> {
-//            Object obj = map.get(key);
-//            if (obj instanceof Map) {
-//                recursionMapToXml(xmlElement, key, (Map<String, Object>)obj, isCDATA);
-//            } else {
-//                String value = obj == null ? "" : obj.toString();
-//                if (isCDATA) {
-//                    xmlElement.addElement(key).addCDATA(value);
-//                } else {
-//                    xmlElement.addElement(key).addText(value);
-//                }
-//            }
-//        });
-//        return xmlElement.asXML();
-//    }
-
-
-//    /**
-//     * 格式化xml,显示为容易看的XML格式
-//     *
-//     * @param xml 需要格式化的xml字符串
-//     * @return
-//     */
-//    public static String formatXML(String xml) {
-//        String requestXML = null;
-//        try {
-//            // 拿取解析器
-//            SAXReader reader = new SAXReader();
-//            Document document = reader.read(new StringReader(xml));
-//            if (null != document) {
-//                StringWriter stringWriter = new StringWriter();
-//                // 格式化,每一级前的空格
-//                OutputFormat format = new OutputFormat("    ", true);
-//                // xml声明与内容是否添加空行
-//                format.setNewLineAfterDeclaration(false);
-//                // 是否设置xml声明头部
-//                format.setSuppressDeclaration(false);
-//                // 是否分行
-//                format.setNewlines(true);
-//                XMLWriter writer = new XMLWriter(stringWriter, format);
-//                writer.write(document);
-//                writer.flush();
-//                writer.close();
-//                requestXML = stringWriter.getBuffer().toString();
-//            }
-//            return requestXML;
-//        } catch (Exception e) {
-//            log.error("格式化xml,失败 --> {0}", e);
-//            return null;
-//        }
-//    }
 }