美文网首页
JAVA微信公众号推送信息

JAVA微信公众号推送信息

作者: 帅气的名称被占用 | 来源:发表于2019-05-19 23:59 被阅读0次

    JAVA微信公众号推送信息

    package weixin.util;import java.io.Serializable;/*

    *AccessToken 对象

    */public classAccessTokenimplementsSerializable{    //获取到的凭证    private String accessToken;

        //凭证有效时间,单位:秒    private int expiresin; 

        /**    * @returnthe accessToken    */    public String getAccessToken() {

            return accessToken;

        }

        /**    * @paramaccessToken the accessToken to set    */    public void setAccessToken(String accessToken) {

            this.accessToken = accessToken;

        }

        /**    * @returnthe expiresin    */    public int getExpiresin() {

            return expiresin;

        }

        /**    * @paramexpiresin the expiresin to set    */    public void setExpiresin(int expiresin) {

            this.expiresin = expiresin;

        }

        public AccessToken() {

            // TODO Auto-generated constructor stub    }

    }

    package weixin.util;import java.security.cert.CertificateException;import java.security.cert.X509Certificate;import javax.net.ssl.X509TrustManager;/**

    * 微信请求 - 信任管理器

    */public classMyX509TrustManagerimplementsX509TrustManager{    public MyX509TrustManager() {

            // TODO Auto-generated constructor stub    }

          @Override        public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {

            }

            @Override        public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {

            }

            @Override        public X509Certificate[] getAcceptedIssuers() {

            //        return new X509Certificate[0];            return  null;

            }

    }

    package weixin.util;/**

    * 模板详细信息

    * 根据需求自己更改

    */public classTemplateData{    private String value;

        private String color;

        public TemplateData(String value,String color){

            this.value = value;

            this.color = color;

        }

        /**    * @returnthe value    */    

    public String getValue() {

            return value;

        }

        /**    * @paramvalue the value to set    */   

     public void setValue(String value) {

            this.value = value;

        }

        /**    * @returnthe color    */ 

       public String getColor() {

            return color;

        }

        /**    * @paramcolor the color to set    */    

    public void setColor(String color) {

            this.color = color;

        }

    }

    package weixin.util;import java.util.Map;/**

    * 注册成功,通知模板消息实体类

    */

    public classTemplateMessage{

    //用户OpenID   

    private String touser; 

    private String template_id; //模板消息ID    

    private String url; //URL置空,在发送后,点模板消息进入一个空白页面(ios),或无法点击(android)。   

     private String topcolor; //标题颜色   

     private Map templateData; //模板详细信息    

    public static TemplateMessage New() {

            return new TemplateMessage();

        }

        /**    * @returnthe touser    */   

     public String getTouser() {

            return touser;

        }

        /**    * @paramtouser the touser to set    */   

     public void setTouser(String touser) {

            this.touser = touser;

        }

        /**    * @returnthe template_id    */   

     public String getTemplate_id() {

            return template_id;

        }

        /**    * @paramtemplate_id the template_id to set    */   

     public void setTemplate_id(String template_id) {

            this.template_id = template_id;

        }

        /**    * @returnthe url    */  

      public String getUrl() {

            return url;

        }

        /**    * @paramurl the url to set    */   

     public void setUrl(String url) {

            this.url = url;

        }

        /**    * @returnthe topcolor    */   

     public String getTopcolor() {

            return topcolor;

        }

        /**    * @paramtopcolor the topcolor to set    */  

      public void setTopcolor(String topcolor) {

            this.topcolor = topcolor;

        }

        /**    * @returnthe templateData    */  

      public Map getTemplateData() {

            return templateData;

        }

        /**    * @paramtemplateData the templateData to set    */  

      public void setTemplateData(Map templateData) {

            this.templateData = templateData;

        }

    }

    package weixin.util;

    import java.io.BufferedReader;

    import java.io.InputStream;

    import java.io.InputStreamReader;

    import java.io.OutputStream;

    import java.net.ConnectException;

    import java.net.URL;

    import javax.net.ssl.HttpsURLConnection;

    import javax.net.ssl.SSLContext;

    import javax.net.ssl.SSLSocketFactory;

    import javax.net.ssl.TrustManager;

    import org.slf4j.Logger;

    import org.slf4j.LoggerFactory;

    import com.alibaba.fastjson.JSONObject;

    public classWX_HttpsUtil{ 

     private static Logger log = LoggerFactory.getLogger(WX_HttpsUtil.class);

        /**    * 发送https请求    * @paramrequestUrl 请求地址    * @paramrequestMethod 请求方式(GET、POST)    * @paramoutputStr 提交的数据    * @returnJSONObject(通过JSONObject.get(key)的方式获取json对象的属性值)    */    public static JSONObject httpsRequest(String requestUrl, String requestMethod, String outputStr) {

            JSONObject jsonObject = null;

            try {

                // 创建SSLContext对象,并使用我们指定的信任管理器初始化            TrustManager[] tm = { new MyX509TrustManager() };

                SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE");

                sslContext.init(null, tm, new java.security.SecureRandom());

                // 从上述SSLContext对象中得到SSLSocketFactory对象            SSLSocketFactory ssf = sslContext.getSocketFactory();

                URL url = new URL(requestUrl);

                HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();

                conn.setSSLSocketFactory(ssf);

                conn.setDoOutput(true);

                conn.setDoInput(true);

                conn.setUseCaches(false);

                // 设置请求方式(GET/POST)            conn.setRequestMethod(requestMethod);

                // 当outputStr不为null时向输出流写数据            if (null != outputStr) {

                    OutputStream outputStream = conn.getOutputStream();

                    // 注意编码格式                outputStream.write(outputStr.getBytes("UTF-8"));

                    outputStream.close();

                }

                // 从输入流读取返回内容            InputStream inputStream = conn.getInputStream();

                InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8");

                BufferedReader bufferedReader = new BufferedReader(inputStreamReader);

                String str = null;

                StringBuffer buffer = new StringBuffer();

                while ((str = bufferedReader.readLine()) != null) {

                    buffer.append(str);

                }

                // 释放资源            bufferedReader.close();

                inputStreamReader.close();

                inputStream.close();

                inputStream = null;

                conn.disconnect();

                jsonObject = JSONObject.parseObject(buffer.toString());

            } catch (ConnectException ce) {

                log.error("连接超时:{}", ce);

            } catch (Exception e) {

                log.error("https请求异常:{}", e);

            }

            return jsonObject;

        }

    }

    package weixin.util;

    import java.util.Map;

    import org.slf4j.Logger;

    import org.slf4j.LoggerFactory;

    import com.alibaba.fastjson.JSONObject;

    public classWX_TemplateMsgUtil{

     private static Logger log = LoggerFactory.getLogger(WX_TemplateMsgUtil.class);

        /**    * 封装模板详细信息    * @return*/    public static JSONObject packJsonmsg(Map param) {

            JSONObject json = new JSONObject();

            for (Map.Entry entry : param.entrySet()) {

                JSONObject keyJson = new JSONObject();

                TemplateData  dta=  entry.getValue();

                keyJson.put("value",dta.getValue());

                keyJson.put("color", dta.getColor());

                json.put(entry.getKey(), keyJson);

            }

            return json;

        }

        /**    * 根据模板的编号 新增并获取模板ID    * @paramtemplateSerialNumber 模板库中模板的 "编号"    * @return模板ID    */    public static String getWXTemplateMsgId(String templateSerialNumber){

            String tmpurl = "https://api.weixin.qq.com/cgi-bin/template/api_add_template?access_token="+ WX_TokenUtil.getWXToken().getAccessToken();

            JSONObject json = new JSONObject();

            json.put("template_id_short", templateSerialNumber);

            JSONObject result = WX_HttpsUtil.httpsRequest(tmpurl, "POST", json.toString());

            JSONObject resultJson = new JSONObject(result);

            String errmsg = (String) resultJson.get("errmsg");

            log.info("获取模板编号返回信息:" + errmsg);

            if(!"ok".equals(errmsg)){

                return "error";

            }

            String templateId = (String) resultJson.get("template_id");

            return templateId;

        }

        /**    * 根据模板ID 删除模板消息    * @paramtemplateId 模板ID    * @return*/    public static String deleteWXTemplateMsgById(String templateId){

            String tmpurl = "https://api.weixin.qq.com/cgi-bin/template/del_private_template?access_token="+ WX_TokenUtil.getWXToken().getAccessToken();

            JSONObject json = new JSONObject();

            json.put("template_id", templateId);

            try{

                JSONObject result = WX_HttpsUtil.httpsRequest(tmpurl, "POST", json.toString());

                JSONObject resultJson = new JSONObject(result);

                log.info("删除"+templateId+"模板消息,返回CODE:"+ resultJson.get("errcode"));

                String errmsg = (String) resultJson.get("errmsg");

                if(!"ok".equals(errmsg)){

                    return "error";

                }

            }catch(Exception e){

            e.printStackTrace();

            }

            return "success";

        }

    /** * 发送微信消息(模板消息) * @paramtouser 用户 OpenID * @paramtemplatId 模板消息ID * @paramclickurl URL置空,则在发送后,点击模板消息会进入一个空白页面(ios),或无法点击(android)。 * @paramtopcolor 标题颜色 * @paramdata 详细内容 * @return*/

     public static String sendWechatMsgToUser(String touser, String templatId, String clickurl, String topcolor, JSONObject data) {

            String tmpurl = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token="+ WX_TokenUtil.getWXToken().getAccessToken();

            JSONObject json = new JSONObject();

            json.put("touser", touser);

            json.put("template_id", templatId);

            json.put("url", clickurl);

            json.put("topcolor", topcolor);

            json.put("data", data);

            try{

                JSONObject result = WX_HttpsUtil.httpsRequest(tmpurl, "POST", json.toString());

                JSONObject resultJson = new JSONObject(result);

                log.info("发送微信消息返回信息:" + resultJson.get("errcode"));

                String errmsg = (String) resultJson.get("errmsg");

                if(!"ok".equals(errmsg)){  //如果为errmsg为ok,则代表发送成功,公众号推送信息给用户了。                return "error";

                }

            }catch(Exception e){

                e.printStackTrace();

                return "error";

            }finally {

                if(templatId!=null) {

                    //删除新增的 微信模板                deleteWXTemplateMsgById(templatId);

                }

            }

            return "success";

      }

    }

    package weixin.util;

    import org.slf4j.Logger;

    import org.slf4j.LoggerFactory;

    import com.alibaba.fastjson.JSONException;

    import com.alibaba.fastjson.JSONObject;

    public classWX_TokenUtil{ 

     private static Logger log = LoggerFactory.getLogger(WX_TokenUtil.class);

          /**

            *  获得微信 AccessToken

            * access_token是公众号的全局唯一接口调用凭据,公众号调用各接口时都需使用access_token。

            * 开发者需要access_token的有效期目前为2个小时,需定时刷新,重复获取将导致上次获取

            * 的access_token失效。 

            * (此处我是把token存在Redis里面了) 

            */        public static AccessToken getWXToken() {

                String appId="wxfb36eac9d8bwe23q"; 

                String appSecret="bf1as96d3e5af6be50464fcd2eba1413";

                String tokenUrl = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid="+ appId+"&secret="+ appSecret;

                    JSONObject jsonObject = WX_HttpsUtil.httpsRequest(tokenUrl, "GET", null);

                    System.out.println("jsonObject:"+jsonObject);

                    AccessToken access_token = new AccessToken();

                    if (null != jsonObject) {

                        try {

                            access_token.setAccessToken(jsonObject.getString("access_token"));

                            access_token.setExpiresin(jsonObject.getInteger("expires_in"));

                        } catch (JSONException e) {

                            access_token = null;

                            // 获取token失败                        log.error("获取token失败 errcode:{} errmsg:{}", jsonObject.getInteger("errcode"), jsonObject.getString("errmsg"));

                        }

                    }

                return access_token;

            }

    }

    package weixin.util;

    import org.slf4j.Logger;

    import org.slf4j.LoggerFactory;

    import com.alibaba.fastjson.JSONObject;

    public classWX_UserUtil{ 

     private static Logger log = LoggerFactory.getLogger(WX_UserUtil.class);

            /**        * 根据微信openId 获取用户是否订阅        * @paramopenId 微信openId        * @return是否订阅该公众号标识        */        public static Integer subscribeState(String openId){

                String tmpurl = "https://api.weixin.qq.com/cgi-bin/user/info?access_token="+WX_TokenUtil.getWXToken().getAccessToken() +"&openid="+openId;

                JSONObject result = WX_HttpsUtil.httpsRequest(tmpurl, "GET",null);

                JSONObject resultJson = new JSONObject(result);

                log.error("获取用户是否订阅 errcode:{} errmsg:{}", resultJson.getInteger("errcode"), resultJson.getString("errmsg"));

                String errmsg = (String) resultJson.get("errmsg");

                if(errmsg==null){

                    //用户是否订阅该公众号标识(0代表此用户没有关注该公众号 1表示关注了该公众号)。                Integer subscribe = (Integer) resultJson.get("subscribe");

                    return subscribe;

                }

                return -1;

            }

    }

    package weixin.util;

    import java.util.HashMap;

    import java.util.Map;

    import com.alibaba.fastjson.JSON;

    import com.alibaba.fastjson.JSONObject;

    public class TestWX {

        public static void main(String[] args) {

            //新增用户成功 - 推送微信消息

            senMsg("oYpZz1LHPO5qggb5tfiWdDDh7lCQ");    }

      static void senMsg(String openId){

            //用户是否订阅该公众号标识 (0代表此用户没有关注该公众号 1表示关注了该公众号)

            Integer  state= WX_UserUtil.subscribeState(openId);        System.out.println("state:"+state);        // 绑定了微信并且关注了服务号的用户 , 注册成功-推送注册短信

            if(state==1){

                Map param = new HashMap<>();            param.put("first",new TemplateData("恭喜其小林!","#696969"));            param.put("keyword1",new TemplateData("12345345456","#696969"));            param.put("keyword2",new TemplateData("2017年","#696969"));            param.put("remark",new TemplateData("祝愉快!","#696969"));            //注册的微信-模板Id

              // String regTempId =  WX_TemplateMsgUtil.getWXTemplateMsgId("ywBb70467vr18");            JSON.toJSONString(param);            JSONObject jsonObject = JSONObject.parseObject(JSON.toJSONString(param));            //调用发送微信消息给用户的接口

              WX_TemplateMsgUtil.sendWechatMsgToUser(openId,"veNLgN8mi-L3Gn67PfkO6l-yS42CV7m8T0c4Pf-PjFw", "",

                      "#000000", jsonObject);          //获取公众号的自动回复规则

              String urlinfo="https://api.weixin.qq.com/cgi-bin/get_current_autoreply_info?access_token="+WX_TokenUtil.getWXToken().getAccessToken();          JSONObject joinfo = WX_HttpsUtil.httpsRequest(urlinfo, "GET", null);          Object o=joinfo.get("is_add_friend_reply_open");        // System.out.println("o:"+joinfo);          String getTokenUrl = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={0}&secret={1}";            JSONObject Token = WX_HttpsUtil.httpsRequest(getTokenUrl, "GET", null);            System.out.println("Token:"+Token);        }

        }

    }

    和微信交互servlet

    package weixin.util.wxservlet;

    import java.io.IOException;

    import java.io.PrintWriter;

    import javax.servlet.ServletException;

    import javax.servlet.http.HttpServlet;

    import javax.servlet.http.HttpServletRequest;

    import javax.servlet.http.HttpServletResponse;

    public classWxServletextendsHttpServlet{ 

     public WxServlet() {

            // TODO Auto-generated constructor stub    }

        /* (non-Javadoc)

        * @see javax.servlet.http.HttpServlet#doGet(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)

        */    @Override    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, 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 (SignUtil.checkSignature(signature, timestamp, nonce)) { 

                out.print(echostr); 

            } 

            out.close(); 

            out = null; 

        }

        /* (non-Javadoc)

        * @see javax.servlet.http.HttpServlet#doPost(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)

        */    @Override    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

            // TODO Auto-generated method stub        super.doPost(req, resp);

        }

    }

    package weixin.util.wxservlet;

    import java.security.MessageDigest;

    import java.security.NoSuchAlgorithmException;

    import java.util.Arrays;

    /** *

     请求校验工具类 

    * @authorm * */public classSignUtil{ // 与接口配置信息中的Token要一致 private static String token = "weixin";

        /**      * 验证签名      *      * @paramsignature      * @paramtimestamp      * @paramnonce      * @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; 

        } 

        /**      * 将字节数组转换为十六进制字符串      *      * @parambyteArray      * @return*/ 

        private static String byteToStr(byte[] byteArray) { 

            String strDigest = ""; 

            for (int i = 0; i < byteArray.length; i++) { 

                strDigest += byteToHexStr(byteArray[i]); 

            } 

            return strDigest; 

        } 

        /**      * 将字节转换为十六进制字符串      *      * @parammByte      * @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; 

        } 

    }

    相关文章

      网友评论

          本文标题:JAVA微信公众号推送信息

          本文链接:https://www.haomeiwen.com/subject/nozhsftx.html