Browse Source

Merge branch 'featrue/微信注册和消息推送0529' of qng/wxservice into master

杨波 3 years ago
parent
commit
44657a63bf
24 changed files with 665 additions and 45 deletions
  1. 2 1
      src/main/java/com/ematou/wxservice/common/constant/WeChatConstant.java
  2. 3 1
      src/main/java/com/ematou/wxservice/common/utils/SignUtil.java
  3. 4 0
      src/main/java/com/ematou/wxservice/common/xml/builder/NewsBuilder.java
  4. 2 2
      src/main/java/com/ematou/wxservice/controller/UserInfoController.java
  5. 16 1
      src/main/java/com/ematou/wxservice/controller/WeChatMessageController.java
  6. 75 8
      src/main/java/com/ematou/wxservice/controller/WeChatViewController.java
  7. 59 0
      src/main/java/com/ematou/wxservice/entity/pojo/ScannVO.java
  8. 2 1
      src/main/java/com/ematou/wxservice/entity/pojo/UserInfo.java
  9. 3 0
      src/main/java/com/ematou/wxservice/mapper/UserInfoMapper.java
  10. 51 0
      src/main/java/com/ematou/wxservice/mp/handler/WeChatScannHandler.java
  11. 8 10
      src/main/java/com/ematou/wxservice/mp/handler/WeChatSubscribeEventHandler.java
  12. 26 0
      src/main/java/com/ematou/wxservice/mp/handler/WeChatUnsubscribeHandler.java
  13. 5 1
      src/main/java/com/ematou/wxservice/mp/router/WeChatMessageHandlerRouter.java
  14. 38 2
      src/main/java/com/ematou/wxservice/service/UserInfoService.java
  15. 33 2
      src/main/java/com/ematou/wxservice/service/WeChatMessageService.java
  16. 3 2
      src/main/java/com/ematou/wxservice/service/WeChatService.java
  17. 242 0
      src/main/java/com/ematou/wxservice/utils/HttpUtils.java
  18. 3 3
      src/main/resources/application.yml
  19. 8 0
      src/main/resources/mybatis/UserInfoMapper.xml
  20. BIN
      src/main/resources/static/images/emtnew.png
  21. 3 4
      src/main/resources/static/js/clean.js
  22. 4 4
      src/main/resources/templates/binding.html
  23. 72 0
      src/main/resources/templates/qrcode.html
  24. 3 3
      src/main/resources/templates/return.html

+ 2 - 1
src/main/java/com/ematou/wxservice/common/constant/WeChatConstant.java

@@ -11,6 +11,7 @@ public class WeChatConstant {
     public static final String RESPONSE_OK = "ok";
     public static final String RESPONSE_ERROR_CODE = "errcode";
     public static final String RESPONSE_ERROR_MSG = "errmsg";
+    public static final String TOKEN = "rv978qwd";
 
 
     /**
@@ -60,7 +61,7 @@ public class WeChatConstant {
     public static class EventType {
         public static final String SUBSCRIBE = "subscribe";
         public static final String UNSUBSCRIBE = "unsubscribe";
-        public static final String SCAN = "SCAN";
+        public static final String SCAN = "scan";
         public static final String LOCATION = "LOCATION";
         public static final String CLICK = "CLICK";
         public static final String VIEW = "VIEW";

+ 3 - 1
src/main/java/com/ematou/wxservice/common/utils/SignUtil.java

@@ -1,5 +1,7 @@
 package com.ematou.wxservice.common.utils;
 
+import com.ematou.wxservice.common.constant.WeChatConstant;
+
 import java.security.MessageDigest;
 import java.security.NoSuchAlgorithmException;
 import java.util.Arrays;
@@ -11,7 +13,7 @@ import java.util.Arrays;
  * 2021-05-11 11:49
  */
 public class SignUtil {
-    private static final String token = "rv978qwd";// 服务器配置中的令牌
+    private static final String token = WeChatConstant.TOKEN;// 服务器配置中的令牌
 
     /**
      * 校验签名

+ 4 - 0
src/main/java/com/ematou/wxservice/common/xml/builder/NewsBuilder.java

@@ -35,4 +35,8 @@ public class NewsBuilder extends BaseBuilder<NewsBuilder, WeChatMpXmlOutNewsMess
         return m;
     }
 
+    public String XMLmsg(String msg){
+        return msg;
+    }
+
 }

+ 2 - 2
src/main/java/com/ematou/wxservice/controller/UserInfoController.java

@@ -33,8 +33,8 @@ public class UserInfoController {
     }
 
     @GetMapping("/user/send")
-    public R<?> sendMsg(String phoneNumber) {
-        String msg = userInfoService.sendMsg(phoneNumber);
+    public R<?> sendMsg(String phoneNumber,String openId) {
+        String msg = userInfoService.sendMsg(phoneNumber,openId);
         return new R<>().success(msg);
     }
 

+ 16 - 1
src/main/java/com/ematou/wxservice/controller/WeChatMessageController.java

@@ -1,9 +1,10 @@
 package com.ematou.wxservice.controller;
 
+import com.alibaba.fastjson.JSONObject;
 import com.ematou.wxservice.common.utils.SignUtil;
+import com.ematou.wxservice.common.web.R;
 import com.ematou.wxservice.mp.message.WeChatMessage;
 import com.ematou.wxservice.mp.message.WeChatMpXmlOutMessage;
-import com.ematou.wxservice.mp.message.WeChatMpXmlOutTextMessage;
 import com.ematou.wxservice.service.WeChatMessageService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
@@ -55,6 +56,7 @@ public class WeChatMessageController {
             ServletInputStream inputStream = request.getInputStream();
 
             WeChatMessage weChatMessage = WeChatMessage.fromXml(inputStream);
+            //消息分发
             WeChatMpXmlOutMessage outTextMessage = weChatMessageService.handleMessage(weChatMessage);
             return null == outTextMessage ? "" : outTextMessage.toXml();
         } catch (IOException e) {
@@ -62,4 +64,17 @@ public class WeChatMessageController {
         }
         return "";
     }
+
+
+
+    /**
+     * 生成二维码信息
+     * @return
+     */
+    @PostMapping("/generateqRcode")
+    public R<Object> generateqRcode(@RequestBody JSONObject msg){
+
+        return new R<>().success(weChatMessageService.generateqRcodeService(msg));
+    }
+
 }

+ 75 - 8
src/main/java/com/ematou/wxservice/controller/WeChatViewController.java

@@ -1,17 +1,21 @@
 package com.ematou.wxservice.controller;
 
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.ematou.wxservice.entity.pojo.ScannVO;
+import com.ematou.wxservice.entity.pojo.UserInfo;
 import com.ematou.wxservice.entity.vo.BindingInfo;
 import com.ematou.wxservice.service.UserInfoService;
+import com.google.gson.annotations.JsonAdapter;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Controller;
 import org.springframework.ui.Model;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.*;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
-import java.io.IOException;
+import java.util.HashMap;
+import java.util.Map;
 
 /**
  * @author lhm
@@ -21,18 +25,28 @@ import java.io.IOException;
 @Controller
 public class WeChatViewController {
 
+    @Autowired
+    UserInfoService userInfoService;
+
+
     @GetMapping("/view/")
     public String main(){
         return "hello";
     }
 
     @GetMapping("/view/binding")
-    public String binding(){
-        return "binding";
+    public String binding(HttpServletRequest request,HttpServletResponse response){
+        //判断是否注册
+        UserInfo msg = userInfoService.queryUserInfoByOpenId(request.getParameter("openid"));
+        if(msg!=null){
+            return "qrcode";
+        }else{
+            return "binding";
+        }
+
     }
 
-    @Autowired
-    UserInfoService userInfoService;
+
 
     @PostMapping("/binding")
     public String binding(HttpServletRequest request, Model model) {
@@ -53,4 +67,57 @@ public class WeChatViewController {
         return "binding";
     }
 
+    /**
+     * 扫一扫
+     * @param request
+     * @param model
+     * @return
+     */
+    @PostMapping("/scanning")
+    public String getScanningture(HttpServletRequest request, Model model) {
+        ScannVO scannVO = userInfoService.getScanningture();
+        return JSONObject.toJSONString(scannVO);
+    }
+
+
+//
+//    /**
+//     * 获取微信签名signature
+//     * @param url jsapi_ticket
+//     * add by zl on 2016-2-2
+//     * @return signature
+//     * @throws
+//     */
+//    public Map<String, Object> getSignature(String url)  {
+//        Map<String, Object> wxMap = new HashMap<String, Object>();
+//        String jsapi_ticket = "";
+//        Long timeJt = (Long) map.get("timeJt");
+//        jsapi_ticket = (String) map.get("jsapi_ticket");
+//        Long nowDateJt = new Date().getTime();
+//        if (jsapi_ticket != null && timeJt != null && ((nowDateJt - timeJt) < 7200 * 1000L)) {
+//            System.out.println("jsapi_ticket 存在");
+//            System.out.println("nowDateJt - timeJt=="+(nowDateJt - timeJt));
+//        } else {
+//            jsapi_ticket = getJsapiTicket();
+//            System.out.println("jsapi_ticket 获取");
+//            map.put("jsapi_ticket",jsapi_ticket);
+//            map.put("timeJt",nowDateJt);
+//        }
+//
+//        //随机字符串和时间戳
+//        String new_novestr = RandomStringUtils.randomAlphanumeric(16); //随机字符串
+//        String timestamp = String.valueOf(System.currentTimeMillis() / 1000);//时间戳
+//        String signature = "";
+//        // 拼接字符串
+//        String string1 = "jsapi_ticket=" + jsapi_ticket + "&noncestr=" + new_novestr + "&timestamp=" + timestamp + "&url=" + url;
+//        signature = CheckUtil.SHA1(string1);
+//        System.out.println("签名=="+signature);
+//
+//        wxMap.put("noncestr", new_novestr);
+//        wxMap.put("timesTamp", timestamp);
+//        wxMap.put("signature", signature);
+//        return wxMap;
+//    }
+
+
 }

+ 59 - 0
src/main/java/com/ematou/wxservice/entity/pojo/ScannVO.java

@@ -0,0 +1,59 @@
+package com.ematou.wxservice.entity.pojo;
+
+public class ScannVO {
+
+    //  公众号的唯一标识
+    public String appId;
+
+    //    必填,生成签名的时间戳
+    public Long timestamp;
+
+    //    必填,生成签名的随机串
+    public String noncestr;
+
+    //    必填,签名
+    public String signature;
+
+
+    public String getAppId() {
+        return appId;
+    }
+
+    public void setAppId(String appId) {
+        this.appId = appId;
+    }
+
+    public Long getTimestamp() {
+        return timestamp;
+    }
+
+    public void setTimestamp(Long timestamp) {
+        this.timestamp = timestamp;
+    }
+
+    public String getNoncestr() {
+        return noncestr;
+    }
+
+    public void setNoncestr(String noncestr) {
+        this.noncestr = noncestr;
+    }
+
+    public String getSignature() {
+        return signature;
+    }
+
+    public void setSignature(String signature) {
+        this.signature = signature;
+    }
+
+    @Override
+    public String toString() {
+        return "scannVO{" +
+                "appId='" + appId + '\'' +
+                ", timestamp=" + timestamp +
+                ", noncestr='" + noncestr + '\'' +
+                ", signature='" + signature + '\'' +
+                '}';
+    }
+}

+ 2 - 1
src/main/java/com/ematou/wxservice/entity/pojo/UserInfo.java

@@ -42,9 +42,10 @@ public class UserInfo {
     public UserInfo() {
     }
 
-    public UserInfo(String tellPhoneNumber, String validateCode) {
+    public UserInfo(String tellPhoneNumber, String validateCode,String openId) {
         this.tellPhoneNumber = tellPhoneNumber;
         this.validateCode = validateCode;
+        this.openId = openId;
     }
 
     public Integer getSubscribe() {

+ 3 - 0
src/main/java/com/ematou/wxservice/mapper/UserInfoMapper.java

@@ -24,4 +24,7 @@ public interface UserInfoMapper {
 
     UserInfo queryUserInfoByPhoneNumber(@Param("phoneNumber") String phoneNumber);
 
+    UserInfo queryUserInfoByOpenId(@Param("openId") String openId);
+
+    void deleUserInfoService(@Param("openId") String openId);
 }

+ 51 - 0
src/main/java/com/ematou/wxservice/mp/handler/WeChatScannHandler.java

@@ -0,0 +1,51 @@
+package com.ematou.wxservice.mp.handler;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.ematou.wxservice.entity.pojo.UserInfo;
+import com.ematou.wxservice.mp.message.WeChatMessage;
+import com.ematou.wxservice.mp.message.WeChatMpXmlOutMessage;
+import com.ematou.wxservice.service.UserInfoService;
+import com.ematou.wxservice.utils.HttpUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@Component
+public class WeChatScannHandler  implements WeChatMessageHandler {
+
+    @Autowired
+    UserInfoService userInfoService;
+
+    @Override
+    public WeChatMpXmlOutMessage handlerMessage(WeChatMessage weChatMessage) {
+        return WeChatMpXmlOutMessage.TEXT().content(scannMsg(weChatMessage)).toUser(weChatMessage.getFromUser()).fromUser(weChatMessage.getToUser()).build();
+    }
+
+    private String scannMsg(WeChatMessage weChatMessage) {
+        Map<String, Object> mapMsg = JSONObject.toJavaObject(JSON.parseObject(weChatMessage.getEventKey()), Map.class);
+        Map<String,String> map = new HashMap<>();
+        map.put("clientId",mapMsg.get("clientId").toString());
+        UserInfo userInfo = userInfoService.queryUserInfoByOpenId(weChatMessage.getFromUser());
+        map.put("phone",userInfo.getTellPhoneNumber());
+        map.put("openId",weChatMessage.getFromUser());
+        String wxMpTake = HttpUtils.sendPost("http://68rfyvi.nat.ipyingshe.com/order/collect/wxMpTakeObject",JSON.toJSONString(map));
+
+        Map<String, Object> weChatMapMsg = JSONObject.toJavaObject(JSON.parseObject(weChatMessage.getEventKey()), Map.class);
+        if(weChatMapMsg.get("code").equals("50009")){
+            return weChatMapMsg.get("msg").toString();
+        }else{
+            StringBuffer stringBuffer = new StringBuffer();
+            List<JSONObject> data = JSON.parseArray(weChatMapMsg.get("data").toString(), JSONObject.class);
+            for(JSONObject jsonObject : data){
+                stringBuffer.append("\n").append("订单编号:"+jsonObject.get("orderSn")).append("柜子编号"+jsonObject.get("lockerName")).append("\n");
+            }
+            return wxMpTake;
+        }
+
+    }
+}

+ 8 - 10
src/main/java/com/ematou/wxservice/mp/handler/WeChatSubscribeEventHandler.java

@@ -2,6 +2,7 @@ package com.ematou.wxservice.mp.handler;
 
 import com.ematou.wxservice.mp.message.WeChatMessage;
 import com.ematou.wxservice.mp.message.WeChatMpXmlOutMessage;
+import com.ematou.wxservice.mp.message.WeChatMpXmlOutNewsMessage;
 import org.springframework.stereotype.Component;
 
 /**
@@ -21,16 +22,13 @@ public class WeChatSubscribeEventHandler implements WeChatMessageHandler {
      */
     @Override
     public WeChatMpXmlOutMessage handlerMessage(WeChatMessage weChatMessage) {
-        return WeChatMpXmlOutMessage.TEXT().content(content(weChatMessage.getFromUser())).toUser(weChatMessage.getFromUser()).fromUser(weChatMessage.getToUser()).build();
-    }
 
-    private String content(String openId) {
-        // TODO openId需要做加密,传到
-        return "哈喽!欢迎关注【e码头智能柜】!\n" +
-                "\n" +
-                "关注e码头,第一时间接收您的快件物流提醒,提供24H自助寄取快递服务!\n" +
-                "\n" +
-                "<a link='http://f3dhion.nat.ipyingshe.com/view/binding?openid="+ openId +"' >>>点击绑定手机号,立即取件/寄件!</a>\n";
-    }
+        WeChatMpXmlOutNewsMessage.Item item = new WeChatMpXmlOutNewsMessage.Item();
+        item.setTitle("欢迎关注【e码头】");
+        item.setDescription(">>>点击绑定手机号,立即取件/寄件!");
+        item.setPicUrl("http://mb6x1jv.nat.ipyingshe.com/images/emtnew.png");
+        item.setUrl("http://mb6x1jv.nat.ipyingshe.com/view/binding?openid="+weChatMessage.getFromUser());
+        return WeChatMpXmlOutMessage.NEWS().addArticle(item).toUser(weChatMessage.getFromUser()).fromUser(weChatMessage.getToUser()).build();
+       }
 
 }

+ 26 - 0
src/main/java/com/ematou/wxservice/mp/handler/WeChatUnsubscribeHandler.java

@@ -0,0 +1,26 @@
+package com.ematou.wxservice.mp.handler;
+
+import com.ematou.wxservice.mp.message.WeChatMessage;
+import com.ematou.wxservice.mp.message.WeChatMpXmlOutMessage;
+import com.ematou.wxservice.service.UserInfoService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+@Component
+public class WeChatUnsubscribeHandler implements WeChatMessageHandler {
+
+    @Autowired
+    UserInfoService userInfoService;
+
+    /**
+     *
+     * 清除已关注用户信息
+     * @param weChatMessage 接收到的消息
+     * @return
+     */
+    @Override
+    public WeChatMpXmlOutMessage handlerMessage(WeChatMessage weChatMessage) {
+        userInfoService.deleUserInfoService(weChatMessage.getFromUser());
+        return null;
+    }
+}

+ 5 - 1
src/main/java/com/ematou/wxservice/mp/router/WeChatMessageHandlerRouter.java

@@ -27,13 +27,17 @@ public class WeChatMessageHandlerRouter {
             WeChatClickEventMessageHandler weChatClickEventMessageHandler,
             WeChatViewEventMessageHandler weChatViewEventMessageHandler,
             WeChatNewsMessageHandler weChatNewsMessageHandler,
-            WeChatSubscribeEventHandler weChatSubscribeEventHandler
+            WeChatSubscribeEventHandler weChatSubscribeEventHandler,
+            WeChatScannHandler weChatScannHandler,
+            WeChatUnsubscribeHandler weChatUnsubscribeHandler
     ){
         map.put(WeChatConstant.XmlMsgType.TEXT, weChatTextMessageHandler);
         map.put(WeChatConstant.EventType.CLICK.toLowerCase(), weChatClickEventMessageHandler);
         map.put(WeChatConstant.EventType.VIEW.toLowerCase(), weChatViewEventMessageHandler);
         map.put(WeChatConstant.XmlMsgType.NEWS, weChatNewsMessageHandler);
         map.put(WeChatConstant.EventType.SUBSCRIBE, weChatSubscribeEventHandler);
+        map.put(WeChatConstant.EventType.SCAN, weChatScannHandler);
+        map.put(WeChatConstant.EventType.UNSUBSCRIBE, weChatUnsubscribeHandler);
     }
 
     public static WeChatMessageHandler router(WeChatMessage weChatMessage){

+ 38 - 2
src/main/java/com/ematou/wxservice/service/UserInfoService.java

@@ -1,10 +1,17 @@
 package com.ematou.wxservice.service;
 
+import com.alibaba.fastjson.JSON;
+import com.ematou.wxservice.api.WeChatApi;
+import com.ematou.wxservice.api.WeChatApiRestTemplate;
 import com.ematou.wxservice.common.utils.SmsUtil;
 import com.ematou.wxservice.config.SmsConfig;
+import com.ematou.wxservice.entity.pojo.ScannVO;
 import com.ematou.wxservice.entity.pojo.UserInfo;
+import com.ematou.wxservice.entity.vo.AccessToken;
 import com.ematou.wxservice.entity.vo.BindingInfo;
 import com.ematou.wxservice.mapper.UserInfoMapper;
+import org.apache.ibatis.annotations.Param;
+import org.omg.IOP.Encoding;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -33,6 +40,9 @@ public class UserInfoService {
     @Autowired
     UserInfoMapper userInfoMapper;
 
+    @Autowired
+    WeChatApiRestTemplate weChatApiRestTemplate;
+
     public UserInfo get(String openId, String phoneNumber){
 
         if (!StringUtils.hasLength(openId) && !StringUtils.hasLength(phoneNumber)) {
@@ -45,7 +55,7 @@ public class UserInfoService {
         return userInfoMapper.queryUserInfoByOpenIdOrPhoneNumber(map);
     }
 
-    public String sendMsg(String phoneNumber){
+    public String sendMsg(String phoneNumber,String openId){
         long time = System.currentTimeMillis();
         if (StringUtils.hasLength(phoneNumber)) {
             // 一分钟内不允许再次发送
@@ -60,7 +70,7 @@ public class UserInfoService {
                 return "短信发送失败,请重新发送!";
             }
             SmsUtil.map.remove(phoneNumber);
-            updateOrInsertUserInfo(new UserInfo(phoneNumber, code));
+            updateOrInsertUserInfo(new UserInfo(phoneNumber, code, openId));
             return "";
         }
         SmsUtil.map.remove(phoneNumber);
@@ -114,4 +124,30 @@ public class UserInfoService {
         return true;
     }
 
+    public ScannVO getScanningture() {
+        ScannVO scannVO = new ScannVO();
+        scannVO.setAppId("wxf9360d70bc1406ee");
+        return scannVO;
+    }
+
+    public UserInfo queryUserInfoByOpenId(String openId){
+        return userInfoMapper.queryUserInfoByOpenId(openId);
+    }
+
+
+
+    /**
+     * 获取签名
+     * @param url
+     * @return
+     */
+    public  Map<String, String> sign(String url) {
+        Map<String, String> resultMap = new HashMap<>(16);
+
+        return resultMap;
+    }
+
+    public void deleUserInfoService(String openId) {
+         userInfoMapper.deleUserInfoService(openId);
+    }
 }

+ 33 - 2
src/main/java/com/ematou/wxservice/service/WeChatMessageService.java

@@ -1,13 +1,24 @@
 package com.ematou.wxservice.service;
 
 import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.ematou.wxservice.api.WeChatApi;
+import com.ematou.wxservice.api.WeChatApiRestTemplate;
+import com.ematou.wxservice.config.WeChatGeneralConfig;
+import com.ematou.wxservice.entity.vo.AccessToken;
 import com.ematou.wxservice.mp.message.WeChatMessage;
 import com.ematou.wxservice.mp.handler.WeChatMessageHandler;
 import com.ematou.wxservice.mp.message.WeChatMpXmlOutMessage;
 import com.ematou.wxservice.mp.router.WeChatMessageHandlerRouter;
+import com.ematou.wxservice.utils.HttpUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.web.client.RestTemplate;
+
+import java.util.HashMap;
+import java.util.Map;
 
 /**
  * @author lhm
@@ -17,6 +28,14 @@ import org.springframework.stereotype.Service;
 @Service
 public class WeChatMessageService {
 
+    @Autowired
+    WeChatGeneralConfig weChatGeneralConfig;
+
+    @Autowired
+    RestTemplate restTemplate;
+    @Autowired
+    WeChatApiRestTemplate weChatApiRestTemplate;
+
     private static final Logger logger = LoggerFactory.getLogger(WeChatMessageHandlerRouter.class);
 
     /**
@@ -33,12 +52,24 @@ public class WeChatMessageService {
             logger.warn("暂不支持" + weChatMessage.getMsgType() + "类型或事件的处理");
             return null;
         }
-
         WeChatMpXmlOutMessage outMessage = handler.handlerMessage(weChatMessage);
-
         logger.info("wxservice处理完响应给用户的消息:" + JSON.toJSONString(outMessage));
         return outMessage;
 
     }
 
+    /**
+     * 生成二维码信息
+     */
+    public String generateqRcodeService(JSONObject msgmap) {
+        String response = weChatApiRestTemplate.getForOther(WeChatApi.GET_TOKEN.getUrl());
+        AccessToken accessToken = JSON.parseObject(response).getObject("data", AccessToken.class);
+        String msg = HttpUtils.sendPost(" https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token="+accessToken.getAccessToken(),msgmap.toJSONString());
+        return msg;
+
+    }
+
+
+
+
 }

+ 3 - 2
src/main/java/com/ematou/wxservice/service/WeChatService.java

@@ -38,6 +38,8 @@ public class WeChatService {
 
     @Autowired
     UserInfoMapper userInfoMapper;
+    @Autowired
+    WeChatMessageService weChatMessageService;
 
     /**
      * 获取普通AccessToken
@@ -47,7 +49,6 @@ public class WeChatService {
     public AccessToken getAccessToken() throws RuntimeException {
         String response = weChatApiRestTemplate.getForOther(WeChatApi.GET_TOKEN.getUrl());
         AccessToken accessToken = JSON.parseObject(response).getObject("data", AccessToken.class);
-
         if (null == accessToken) {
             response = weChatApiRestTemplate.getForOther(WeChatApi.GENERAL_TOKEN.getUrl());
             accessToken = JSON.parseObject(response).getObject("data", AccessToken.class);
@@ -80,6 +81,7 @@ public class WeChatService {
             userInfo = JSON.parseObject(response, UserInfo.class);
             userInfo.setTellPhoneNumber(bindingInfo.getTellPhoneNumber());
             userInfo.setValidateCode(bindingInfo.getValidateCode());
+            userInfo.setTagidList(null);
             userInfoMapper.updateOrInsertUserInfo(userInfo);
         } catch (RuntimeException e) {
             logger.error("请求微信平台获取用户信息出错!response:" + response + ",error message:" + e.getMessage());
@@ -193,7 +195,6 @@ public class WeChatService {
                 logger.error("授权出现错误! 错误信息: " + res);
             }
         }
-
         return map;
     }
 }

+ 242 - 0
src/main/java/com/ematou/wxservice/utils/HttpUtils.java

@@ -0,0 +1,242 @@
+package com.ematou.wxservice.utils;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import javax.net.ssl.*;
+import java.io.*;
+import java.net.ConnectException;
+import java.net.SocketTimeoutException;
+import java.net.URL;
+import java.net.URLConnection;
+import java.security.cert.X509Certificate;
+
+/**
+ * 通用http发送方法
+ * 
+ * @author icsp
+ */
+public class HttpUtils
+{
+    private static final Logger log = LoggerFactory.getLogger(HttpUtils.class);
+
+    /**
+     * 向指定 URL 发送GET方法的请求
+     *
+     * @param url 发送请求的 URL
+     * @param param 请求参数,请求参数应该是 name1=value1&name2=value2 的形式。
+     * @param contentType 编码类型
+     * @return 所代表远程资源的响应结果
+     */
+    public static String sendGet(String url, String param, String contentType)
+    {
+        StringBuilder result = new StringBuilder();
+        BufferedReader in = null;
+        try
+        {
+            String urlNameString = url + "?" + param;
+            log.info("sendGet - {}", urlNameString);
+            URL realUrl = new URL(urlNameString);
+            URLConnection connection = realUrl.openConnection();
+            connection.setRequestProperty("accept", "*/*");
+            connection.setRequestProperty("connection", "Keep-Alive");
+            connection.setRequestProperty("Content-Type","application/x-www-form-urlencoded;charset=UTF-8");
+            connection.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
+            connection.connect();
+            in = new BufferedReader(new InputStreamReader(connection.getInputStream(), contentType));
+            String line;
+            while ((line = in.readLine()) != null)
+            {
+                result.append(line);
+            }
+            log.info("recv - {}", result);
+        }
+        catch (ConnectException e)
+        {
+            log.error("调用HttpUtils.sendGet ConnectException, url=" + url + ",param=" + param, e);
+        }
+        catch (SocketTimeoutException e)
+        {
+            log.error("调用HttpUtils.sendGet SocketTimeoutException, url=" + url + ",param=" + param, e);
+        }
+        catch (IOException e)
+        {
+            log.error("调用HttpUtils.sendGet IOException, url=" + url + ",param=" + param, e);
+        }
+        catch (Exception e)
+        {
+            log.error("调用HttpsUtil.sendGet Exception, url=" + url + ",param=" + param, e);
+        }
+        finally
+        {
+            try
+            {
+                if (in != null)
+                {
+                    in.close();
+                }
+            }
+            catch (Exception ex)
+            {
+                log.error("调用in.close Exception, url=" + url + ",param=" + param, ex);
+            }
+        }
+        return result.toString();
+    }
+
+    /**
+     * 向指定 URL 发送POST方法的请求
+     *
+     * @param url 发送请求的 URL
+     * @param param 请求参数,请求参数应该是 name1=value1&name2=value2 的形式。
+     * @return 所代表远程资源的响应结果
+     */
+    public static String sendPost(String url, String param)
+    {
+        PrintWriter out = null;
+        BufferedReader in = null;
+        StringBuilder result = new StringBuilder();
+        try
+        {
+            String urlNameString = url;
+            log.info("sendPost - {}", urlNameString);
+            URL realUrl = new URL(urlNameString);
+            URLConnection conn = realUrl.openConnection();
+            conn.setRequestProperty("accept", "*/*");
+            conn.setRequestProperty("connection", "Keep-Alive");
+            conn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
+            conn.setRequestProperty("Accept-Charset", "utf-8");
+            conn.setRequestProperty("Content-Type", "application/json");
+            conn.setDoOutput(true);
+            conn.setDoInput(true);
+            out = new PrintWriter(conn.getOutputStream());
+            out.print(param);
+            out.flush();
+            in = new BufferedReader(new InputStreamReader(conn.getInputStream(), "utf-8"));
+            String line;
+            while ((line = in.readLine()) != null)
+            {
+                result.append(line);
+            }
+            log.info("recv - {}", result);
+        }
+        catch (ConnectException e)
+        {
+            log.error("调用HttpUtils.sendPost ConnectException, url=" + url + ",param=" + param, e);
+        }
+        catch (SocketTimeoutException e)
+        {
+            log.error("调用HttpUtils.sendPost SocketTimeoutException, url=" + url + ",param=" + param, e);
+        }
+        catch (IOException e)
+        {
+            log.error("调用HttpUtils.sendPost IOException, url=" + url + ",param=" + param, e);
+        }
+        catch (Exception e)
+        {
+            log.error("调用HttpsUtil.sendPost Exception, url=" + url + ",param=" + param, e);
+        }
+        finally
+        {
+            try
+            {
+                if (out != null)
+                {
+                    out.close();
+                }
+                if (in != null)
+                {
+                    in.close();
+                }
+            }
+            catch (IOException ex)
+            {
+                log.error("调用in.close Exception, url=" + url + ",param=" + param, ex);
+            }
+        }
+        return result.toString();
+    }
+
+    public static String sendSSLPost(String url, String param)
+    {
+        StringBuilder result = new StringBuilder();
+        String urlNameString = url + "?" + param;
+        try
+        {
+            log.info("sendSSLPost - {}", urlNameString);
+            SSLContext sc = SSLContext.getInstance("SSL");
+            sc.init(null, new TrustManager[] { new TrustAnyTrustManager() }, new java.security.SecureRandom());
+            URL console = new URL(urlNameString);
+            HttpsURLConnection conn = (HttpsURLConnection) console.openConnection();
+            conn.setRequestProperty("accept", "*/*");
+            conn.setRequestProperty("connection", "Keep-Alive");
+            conn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
+            conn.setRequestProperty("Accept-Charset", "utf-8");
+            conn.setRequestProperty("contentType", "utf-8");
+            conn.setDoOutput(true);
+            conn.setDoInput(true);
+
+            conn.setSSLSocketFactory(sc.getSocketFactory());
+            conn.setHostnameVerifier(new TrustAnyHostnameVerifier());
+            conn.connect();
+            InputStream is = conn.getInputStream();
+            BufferedReader br = new BufferedReader(new InputStreamReader(is));
+            String ret = "";
+            while ((ret = br.readLine()) != null)
+            {
+                if (ret != null && !"".equals(ret.trim()))
+                {
+                    result.append(new String(ret.getBytes("ISO-8859-1"), "utf-8"));
+                }
+            }
+            log.info("recv - {}", result);
+            conn.disconnect();
+            br.close();
+        }
+        catch (ConnectException e)
+        {
+            log.error("调用HttpUtils.sendSSLPost ConnectException, url=" + url + ",param=" + param, e);
+        }
+        catch (SocketTimeoutException e)
+        {
+            log.error("调用HttpUtils.sendSSLPost SocketTimeoutException, url=" + url + ",param=" + param, e);
+        }
+        catch (IOException e)
+        {
+            log.error("调用HttpUtils.sendSSLPost IOException, url=" + url + ",param=" + param, e);
+        }
+        catch (Exception e)
+        {
+            log.error("调用HttpsUtil.sendSSLPost Exception, url=" + url + ",param=" + param, e);
+        }
+        return result.toString();
+    }
+
+    private static class TrustAnyTrustManager implements X509TrustManager
+    {
+        @Override
+        public void checkClientTrusted(X509Certificate[] chain, String authType)
+        {
+        }
+
+        @Override
+        public void checkServerTrusted(X509Certificate[] chain, String authType)
+        {
+        }
+
+        @Override
+        public X509Certificate[] getAcceptedIssuers()
+        {
+            return new X509Certificate[] {};
+        }
+    }
+
+    private static class TrustAnyHostnameVerifier implements HostnameVerifier
+    {
+        @Override
+        public boolean verify(String hostname, SSLSession session)
+        {
+            return true;
+        }
+    }
+}

+ 3 - 3
src/main/resources/application.yml

@@ -11,9 +11,9 @@ spring:
 #    username: tuser
 #    password: Qq!123
 #    url: jdbc:mysql://120.76.84.45:3306/wx_base?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai
-    username: root
-    password: root
-    url: jdbc:mysql://127.0.0.1:3306/wx_service?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai
+    username: tuser
+    password: Qq!123
+    url: jdbc:mysql://120.76.84.45:3306/wx_service?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai
   thymeleaf:
     cache: false
     prefix: classpath:/templates/

+ 8 - 0
src/main/resources/mybatis/UserInfoMapper.xml

@@ -107,4 +107,12 @@
         select <include refid="Base_Column_List"/> from user_info where tell_phone_number=#{phoneNumber}
     </select>
 
+    <select id="queryUserInfoByOpenId" resultType="com.ematou.wxservice.entity.pojo.UserInfo">
+        select <include refid="Base_Column_List"/> from user_info where open_id=#{openId}
+    </select>
+
+    <delete id="deleUserInfoService" >
+        delete from user_info where open_id=#{openId}
+    </delete>
+
 </mapper>

BIN
src/main/resources/static/images/emtnew.png


+ 3 - 4
src/main/resources/static/js/clean.js

@@ -67,8 +67,7 @@ function sendMessage1() {
     $("#btnSendCode1").attr("disabled", "true");
     $("#btnSendCode1").val(+curCount1 + "秒再获取");
 
-    $.get("http://f3dhion.nat.ipyingshe.com/user/send?phoneNumber=" + phone, function (res) {
-        alert(res.data);
+    $.get("http://mb6x1jv.nat.ipyingshe.com/user/send?phoneNumber=" + phone+"&openId="+sessionStorage.getItem("openid"), function (res) {
     })
 
     InterValObj1 = window.setInterval(SetRemainTime1, 1000);
@@ -126,7 +125,7 @@ getOpenId = function (code) {
     $.ajax({
         type: 'GET',
         dataType: 'text',
-        url: 'http://f3dhion.nat.ipyingshe.com/oauth2?code='+code,
+        url: 'http://mb6x1jv.nat.ipyingshe.com/oauth2?code='+code,
         success: function (res) {
             if (res.status == -1) {
                 // 提示没有关注公众号 没有关注公众号跳转到关注公众号页面
@@ -136,7 +135,7 @@ getOpenId = function (code) {
                 return;
             } else {
                 // 本地存储这个openid,并刷新页面
-                sessionStorage.setItem("openid", res.data.openid);
+                sessionStorage.setItem("openid", JSON.parse(res).data.openid);
                 location.reload();
             }
         }

+ 4 - 4
src/main/resources/templates/binding.html

@@ -7,9 +7,9 @@
         <meta content="yes" name="apple-mobile-web-app-capable"/>
         <meta content="black" name="apple-mobile-web-app-status-bar-style"/>
         <meta content="telephone=no" name="format-detection"/>
-        <link href="http://f3dhion.nat.ipyingshe.com/css/style.css" rel="stylesheet" type="text/css"/>
-        <script type="text/javascript" src="http://f3dhion.nat.ipyingshe.com/js/jquery.min.js"></script>
-        <script type="text/javascript" src="http://f3dhion.nat.ipyingshe.com/js/clean.js"></script>
+        <link href="http://mb6x1jv.nat.ipyingshe.com/css/style.css" rel="stylesheet" type="text/css"/>
+        <script type="text/javascript" src="http://mb6x1jv.nat.ipyingshe.com/js/jquery.min.js"></script>
+        <script type="text/javascript" src="http://mb6x1jv.nat.ipyingshe.com/js/clean.js"></script>
     </head>
     <body>
 
@@ -42,7 +42,7 @@
                 <div class="aui-code-box">
                     <h2>绑定手机</h2>
                     <p>登录及找回密码的途径</p>
-                    <form id="submit_form" action="http://f3dhion.nat.ipyingshe.com/binding" method="post">
+                    <form id="submit_form" action="http://mb6x1jv.nat.ipyingshe.com/binding" method="post">
                         <p class="aui-code-line">
                             <em>+86</em>
                             <input type="text" class="aui-code-line-input" name="phone1" value="" id="phone1" autocomplete="off" placeholder="请输入已绑定的手机号" style="padding-left:28px;"/>

+ 72 - 0
src/main/resources/templates/qrcode.html

@@ -0,0 +1,72 @@
+<html lang="en">
+
+<head>
+
+    <meta charset="UTF-8">
+    <script src="plug-in/qrcode/jquery.min.js"></script>
+    <script src=”http://res.wx.qq.com/open/js/jweixin-1.0.0.js”></script>
+    <title>微信扫一扫</title>
+
+</head>
+
+<body>
+
+<script type="application/javascript">
+
+    var purl = encodeURIComponent(location.href);
+    $.ajax({
+        url:"http://mb6x1jv.nat.ipyingshe.com/scanning",
+        data:{"url":purl},
+        type:"POST",
+        dataType:"json",
+        success:function(result){
+            wx.config({
+                debug:false,
+                appId:result.obj.appId,
+                timestamp:result.obj.timestamp, // 必填,生成签名的时间戳
+                nonceStr:result.obj.noncestr,// 必填,生成签名的随机串
+                signature:result.obj.signature,// 必填,签名
+                jsApiList:['scanQRCode']
+            });
+        },
+        error:function(){
+            alert("请求失败");
+        }
+    });
+
+    function scanQr(){
+        var ua = navigator.userAgent.toLowerCase();
+        var isWeiXin  =ua.indexOf('micromessenger') != -1;
+        if(!isWeiXin){
+            alert('请用微信打开链接,才可使用扫一扫!');
+        }
+        wx.scanQRCode({
+            needResult:1,
+            scanType:["qrCode"],
+            success:function (res) {
+                var scan = res.resultStr;
+                location.href=scan;
+
+            },
+            error:function(res) {
+                if(res.errMsg.indexOf('function_not_exist') > 0){
+                    alert('当前版本低,请进行升级!');
+                }
+            }
+        });
+    }
+    wx.error(function(res){
+        alert(res.errMsg);
+
+    });
+    wx.ready(function(){
+        // config信息验证后会执行ready方法,所有接口调用都必须在config接口获得结果之后,config是一个客户端的异步操作,所以如果需要在页面加载时就调用相关接口,则须把相关接口放在ready函数中调用来确保正确执行。对于用户触发时才调用的接口,则可以直接调用,不需要放在ready函数中。
+    });
+
+</script>
+
+<input type="button" onclick="scanQr()" id="test" value="微信扫一扫" style="font-size: 30px;border: solid 1px;padding: 10px;"/>
+
+</body>
+
+</html>

+ 3 - 3
src/main/resources/templates/return.html

@@ -7,8 +7,8 @@
         <meta content="yes" name="apple-mobile-web-app-capable"/>
         <meta content="black" name="apple-mobile-web-app-status-bar-style"/>
         <meta content="telephone=no" name="format-detection"/>
-        <link href="http://f3dhion.nat.ipyingshe.com/css/style_return.css" rel="stylesheet" type="text/css"/>
-        <script type="text/javascript" src="http://f3dhion.nat.ipyingshe.com/js/jquery.min.js"></script>
+        <link href="http://mb6x1jv.nat.ipyingshe.com/css/style_return.css" rel="stylesheet" type="text/css"/>
+        <script type="text/javascript" src="http://mb6x1jv.nat.ipyingshe.com/js/jquery.min.js"></script>
     </head>
     <body>
 
@@ -39,7 +39,7 @@
             <section class="aui-scrollView">
                 <div class="aui-back-box">
                     <div class="aui-back-pitch">
-                        <img src="http://f3dhion.nat.ipyingshe.com/images/icon-pitch.png" alt="">
+                        <img src="http://mb6x1jv.nat.ipyingshe.com/images/icon-pitch.png" alt="">
                     </div>
                     <div class="aui-back-title">
                         <h2>绑定成功</h2>