java微信公众号开发之各种事件推送

1.配置微信公众服务器

在这里插入图片描述

2.提前下好公众号SHA1算法生成安全签名类

/**
 * SHA1 class
 *
 * 计算公众平台的消息签名接口.
 */
public class SHA1 {

	/**
	 * 用SHA1算法生成安全签名
	 * @param token 票据
	 * @param timestamp 时间戳
	 * @param nonce 随机字符串
	 * @param encrypt 密文
	 * @return 安全签名

	 */
	public static String getSHA1(String token, String timestamp, String nonce, String encrypt)
			  {
		try {
			String[] array = new String[] { token, timestamp, nonce, encrypt };
			StringBuffer sb = new StringBuffer();
			// 字符串排序
			Arrays.sort(array);
			for (int i = 0; i < 4; i++) {
				sb.append(array[i]);
			}
			String str = sb.toString();
			// SHA1签名生成
			MessageDigest md = MessageDigest.getInstance("SHA-1");
			md.update(str.getBytes());
			byte[] digest = md.digest();

			StringBuffer hexstr = new StringBuffer();
			String shaHex = "";
			for (int i = 0; i < digest.length; i++) {
				shaHex = Integer.toHexString(digest[i] & 0xFF);
				if (shaHex.length() < 2) {
					hexstr.append(0);
				}
				hexstr.append(shaHex);
			}
			return hexstr.toString();
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}






}

3.创建一个接口,就是配置公众号服务的接口

 //微信公众号验证
    @RequestMapping("openWx/gzhVerification")
    public String gzhVerification(HttpServletRequest request){
        log.info("微信公众号验证");
        String signature=request.getParameter("signature");
        String timestamp=request.getParameter("timestamp");
        String nonce=request.getParameter("nonce");
        String echostr=request.getParameter("echostr");
        String token="token";//这里填基本配置中的token
        String jiami="";
        try {


            jiami= SHA1.getSHA1(token, timestamp, nonce,"");//这里是对三个参数进行加密
          
        if(echostr!=null && jiami.equals(signature)){
            log.info("第一次申请验证成功");
            return  echostr;
        }
        //判断是否是公众号发来的请求
        if(jiami==null || !jiami.equals(signature)){

            log.info("错误的请求");
            return null;
        }
          //----------------------事件推送
            Map<String, String> stringStringMap = parseXml(request);
        //---按钮事件
          if("CLICK".equalsIgnoreCase(stringStringMap.get("Event"))){

              log.info("按钮事件");
            //因为只有一个按钮所以不用判断key了
              String fromUserName = toXML(stringStringMap.get("FromUserName"),stringStringMap.get("ToUserName"));
              log.info("fromUserName:"+fromUserName);
              //发送消息
              return  fromUserName;
              //关注公众号数据
          }else if("subscribe".equalsIgnoreCase(stringStringMap.get("Event")) && stringStringMap.get("EventKey")==null  && stringStringMap.get("Ticket")==null){
              log.info("关注公众号");
              customerWxGzhService._add(stringStringMap.get("FromUserName"),null);

              //取消关注
          }else if("unsubscribe".equalsIgnoreCase(stringStringMap.get("Event"))) {
              log.info("取消关注");

              customerWxGzhService._delete(stringStringMap.get("FromUserName"));

             //二维码关注
          }else if("subscribe".equalsIgnoreCase(stringStringMap.get("Event")) && stringStringMap.get("EventKey")!=null  && stringStringMap.get("Ticket")!=null){

              log.info("二维码关注");
              //获取二维码参数值
              String eventKey =stringStringMap.get("EventKey");
              eventKey= eventKey.substring(8);
              customerWxGzhService._add(stringStringMap.get("FromUserName"),eventKey);
          }

        } catch (Exception e) {
            // TODO Auto-generated catch block

            e.printStackTrace();
        }

        return  null;
    }


    /**
     * dom4j 解析 xml 转换为 map
     * @param request
     * @return
     * @throws Exception
     */
    public static Map<String, String> parseXml(HttpServletRequest request) throws Exception {
        // 将解析结果存储在HashMap中
        Map<String, String> map = new HashMap<String, String>();
        // 从request中取得输入流
        InputStream inputStream = request.getInputStream();
        // 读取输入流
        SAXReader reader = new SAXReader();
        Document document = reader.read(inputStream);
        // 得到xml根元素
        Element root = document.getRootElement();
        // 得到根元素的所有子节点
        List<Element> elementList = root.elements();

        // 遍历所有子节点
        for (Element e : elementList)
            map.put(e.getName(), e.getText());

        // 释放资源
        inputStream.close();
        inputStream = null;
        return map;
    }


    //发送联系我们
    public String toXML(String toUserName,String fromUserName){
        StringBuilder sb = new StringBuilder();
        sb.append("<xml>");
        sb.append("<ToUserName><![CDATA["+toUserName+"]]></ToUserName>");
        sb.append("<FromUserName><![CDATA["+fromUserName+"]]></FromUserName>");
        sb.append("<CreateTime>"+System.currentTimeMillis()/1000+"</CreateTime>");
        sb.append("<MsgType><![CDATA[text]]></MsgType>");
        sb.append("<Content><![CDATA[您好]]></Content>");
        sb.append("</xml>");
        return sb.toString();
    }

公众号事件的提示只有一个接口 就是不断判断Event参数来处理事件,

您好!关于Java微信公众号开发,我可以为您提供一些基本的信息和指导。 首先,微信公众号开发要有两种类型:订阅号和服务号。订阅号主要用于信息传达和内容分享,而服务号则更加注重业务功能和用户交互。 在Java开发中,您可以使用微信公众平台提供的开发接口进行开发。以下是一些常用的开发步骤和技术: 1. 注册微信公众平台账号:前往微信公众平台(https://mp.weixin.qq.com/)注册一个账号,并完成开发者认证。 2. 配置服务器:在公众号设置中,配置服务器URL和Token。Token用于验证消息的真实性。 3. 接入消息接口:通过开发接口,将用户发送的消息和事件推送到您的服务器。您可以使用Java框架(如Spring Boot)搭建服务器,并使用接口进行消息的处理和回复。 4. 实现功能:根据您的需求,可以实现一些常见的功能,如自动回复、菜单管理、用户管理、消息模板等。您可以使用Java的相关库和工具来简化开发过程。 5. 公众号运营:在开发完成后,可以进行公众号的运营和推广。您可以通过素材管理、群发消息、数据统计等功能来提升用户体验和运营效果。 需要注意的是,微信公众号开发涉及到用户隐私和信息安全,建议您在开发过程中遵守相关规定,并进行必要的数据加密和安全防护。 希望以上信息对您有所帮助!如果您有任何进一步的问题,请随时提问。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值