java 接管微信

1、登录微信公众号后台===》到基本配置===》服务器配置====》填写服务器配置信息

2、填写的url(1处) 是你后台代码中的接口地址,2处的token要和你后台代码中的token一致,否则点提交无法通过,

消息加解密方式一般都选的兼容模式,EncodingAESKey是随机生成,不用管;点击提交的时候微信服务器会去请求你刚写的url地址,下面会提供这个url对应的代码

3、接着就是后台代码的编写,直接上代码

    @ResponseBody
	@RequestMapping(value="autoAnswer",method={RequestMethod.GET,RequestMethod.POST})
	public void wechatAutoAnswer(HttpServletRequest request,HttpServletResponse response)         
    throws IOException{
		// 微信加密签名  
        String signature = request.getParameter("signature");  
        // 时间戳  
        String timestamp = request.getParameter("timestamp");  
        // 随机数  
        String nonce = request.getParameter("nonce");  
        // 随机字符串  
        String echostr = request.getParameter("echostr");  
  
        PrintWriter out = response.getWriter();  
        // 通过检验signature对请求进行校验,若校验成功则原样返回echostr,表示接入成功,否则接入    
        失败  
        if (null != signature && null != timestamp && null != nonce && null != echostr{
            /* 接口验证  */
	        if (SignUtil.checkSignature(signature, timestamp, nonce)) {  
	            out.print(echostr);  
	            logger.info("token验证成功!");
	        }else {
                out.write("");
                out.flush();
                out.close();
            }
            out.flush();
            out.close();
         }else {
        	    /* 消息处理  */
                response.reset();//重置
                wechatService.sendMsg(request,response);
         }
	}



    检验签名的方法
    private static String token = "bonusWechat";  
	  
    /** 
     * 验证签名 
     *  
     * @param signature 
     * @param timestamp 
     * @param nonce 
     * @return 
     */  
    public static boolean checkSignature(String signature, String timestamp, String nonce) {  
        String[] arr = new String[] { token, timestamp, nonce };  
        // 将token、timestamp、nonce三个参数进行字典序排序  
        Arrays.sort(arr);  
        StringBuilder content = new StringBuilder();  
        for (int i = 0; i < arr.length; i++) {  
            content.append(arr[i]);  
        }  
        MessageDigest md = null;  
        String tmpStr = null;  
  
        try {  
            md = MessageDigest.getInstance("SHA-1");  
            // 将三个参数字符串拼接成一个字符串进行sha1加密  
            byte[] digest = md.digest(content.toString().getBytes());  
            tmpStr = byteToStr(digest);  
        } catch (NoSuchAlgorithmException e) {  
            e.printStackTrace();  
        }  
  
        content = null;  
        // 将sha1加密后的字符串可与signature对比,标识该请求来源于微信  
        return tmpStr != null ? tmpStr.equals(signature.toUpperCase()) : false;  
    }  
  
    /** 
     * 将字节数组转换为十六进制字符串 
     *  
     * @param byteArray 
     * @return 
     */  
    private static String byteToStr(byte[] byteArray) {  
        String strDigest = "";  
        for (int i = 0; i < byteArray.length; i++) {  
            strDigest += byteToHexStr(byteArray[i]);  
        }  
        return strDigest;  
    }  
  
    /** 
     * 将字节转换为十六进制字符串 
     *  
     * @param mByte 
     * @return 
     */  
    private static String byteToHexStr(byte mByte) {  
        char[] Digit = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };  
        char[] tempArr = new char[2];  
        tempArr[0] = Digit[(mByte >>> 4) & 0X0F];  
        tempArr[1] = Digit[mByte & 0X0F];  
  
        String s = new String(tempArr);  
        return s;  
    }  
/***
* service的方法  此方法 是微信用户关注公众号后,
* 拉取微信用户到开发者数据库的操作,还有自定义菜单
* 点击事件 
*
*/
public void sendMsg(HttpServletRequest request, HttpServletResponse response) throws IOException {

		String respMessage = "success";  
        try {  
            // 默认返回的文本消息内容  
//            String respContent = "请求处理异常,请稍候尝试!";  
  
            // xml请求解析  
            Map<String, String> requestMap = MessageUtil.parseXml(request);  
            System.out.println(requestMap);
            // 发送方帐号(open_id)  
            String fromUserName = requestMap.get("FromUserName");  
            System.out.println("openId================"+fromUserName);
            // 公众帐号  
            String toUserName = requestMap.get("ToUserName");  
            System.out.println("to==================" + toUserName);
            // 消息类型  
            String msgType = requestMap.get("MsgType"); 
            System.out.println("content ++++++++++++++++++++"+requestMap.get("content"));
            System.out.println("大写Content+++++++++++++++++++" + requestMap.get("Content"));
            String content = requestMap.get("content"); 
            if(com.cn.bonus.base.util.XaUtil.isEmpty(content)) {
            	content = requestMap.get("Content");
            }
            System.out.println("requestMap请求:"+requestMap);
            // 事件类型  
            String eventType = requestMap.get("Event"); 
            String eventKey = requestMap.get("EventKey");
			String username = "";
    		if(XaUtil.isNotEmpty(eventKey) && eventKey.indexOf("qrscene_") == 0){
    			username = eventKey.replace("qrscene_", "");
    		}else{
    			username = eventKey;
    		}
            
            // 文本消息  
            if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_TEXT)) {  
            	 
            }  
            // 图片消息  
            /*else if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_IMAGE)) {  
                respContent = "您发送的是图片消息!";  
            }  
            // 地理位置消息  
            else if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_LOCATION)) {  
                respContent = "您发送的是地理位置消息!";  
            }  
            // 链接消息  
            else if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_LINK)) {  
                respContent = "您发送的是链接消息!";  
            }  
            // 音频消息  
            else if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_VOICE)) {  
                respContent = "您发送的是音频消息!";  
            }  */
            // 事件推送  
            else if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_EVENT)) {  
//        		Long userId = null;
//        		if(XaUtil.isNotEmpty(username) && isNumeric(username)){
//        			userId = Long.parseLong(username);
//        		}
        		UserAttentionInfo openIdUser = null;
        		
        		XcxUser unionIdXcxUser = null;
                // 订阅 
                if (eventType.equals(MessageUtil.EVENT_TYPE_CLICK)) { 
                }
                String userInfoStr = WXUtil.getUserInfo(fromUserName);
                JSONObject userObj = JSONObject.parseObject(userInfoStr);
                String unionid = XaUtil.isNotEmpty(userObj.getString("unionid"))?userObj.getString("unionid"):"";
                logger.info("用户unionid为"+unionid);
                String nickname = XaUtil.isNotEmpty(userObj.getString("nickname"))?userObj.getString("nickname"):"";
                logger.info("用户名称为"+nickname);
                if (eventType.equals(MessageUtil.EVENT_TYPE_SUBSCRIBE)) {  
                	saveXcxUserAndUserAttention(openIdUser,unionIdXcxUser,fromUserName, unionid, nickname);
	                 
                }else if(eventType.equals(MessageUtil.EVENT_TYPE_SCAN)){
                	saveXcxUserAndUserAttention(openIdUser,unionIdXcxUser,fromUserName, unionid, nickname);
                }else if (eventType.equals(MessageUtil.EVENT_TYPE_UNSUBSCRIBE)) {  
//                	saveXcxUserAndUserAttention(fromUserName, unionid, nickname);
                	// 取消订阅  
                }  
                // 自定义菜单点击事件  
                else if (eventType.equals(MessageUtil.EVENT_TYPE_CLICK)) {  
                	logger.info("自定义菜单点击事件 :click");
                	logger.info("eventType = {}",eventType);
                    // TODO 自定义菜单权没有开放,暂不处理该类消息
                	logger.info("EventKey = {}",username);
                	if("客服热线".equals(username)) {
                		respMessage = "客服热线:4009286688    \r\n" + 
                				"工作时间:周一到周五\r\n" + 
                				"                  8:00-16:30"; 
                	}
                	// 回复文本消息  
                    TextMessage textMessage = new TextMessage();  
                    textMessage.setToUserName(fromUserName);  
                    textMessage.setFromUserName(toUserName);  
                    textMessage.setCreateTime(new Date().getTime());  
                    textMessage.setFuncFlag(0);
                    textMessage.setMsgType(MessageUtil.RESP_MESSAGE_TYPE_TEXT);  
                    textMessage.setContent("客服热线:4009286688    \r\n" + 
            				"工作时间:周一到周五\r\n" + 
            				"                  8:00-16:30");
                    respMessage = MessageUtil.textMessageToXml(textMessage); 
                	logger.info("响应的消息:msg = {}",respMessage);
                }  
            } 
     
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
        request.setCharacterEncoding("UTF-8");  
        response.setCharacterEncoding("UTF-8");  
		// 响应消息  
		PrintWriter out = response.getWriter();  
		out.print(respMessage);
        out.close();  
		
	}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值