• 微信公众号消息推送-模板消息发送


    先注册一个微信公众号;或者申请接口测试号来进行开发;

    接口测试号申请链接:

    https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login

    这里先介绍测试号的开发;

    点击链接进入页面,会看到y一个二维码,用微信扫描后就会分配给你一个微信公众测试账号;

    然后找到如下这个位置,点击“新增测试模板”按钮,填写

    下面是相关代码;

           @Test
    	public void sendTemplate(){
    		postTemplateMsg("appid","appSecret", "openId");//这里替换成你自己的信息
    	}
    	
    	public  String  sendTemplateMessage(String openId){
    		
    	TemplateMsg tm=new TemplateMsg();
            tm.setTouser(openId);
            tm.setTemplate_id("模板Id");
            tm.setUrl("https://wwww.baidu.com");
            
            //about data start
            Map<String,Object> m = new HashMap<String,Object>();  
        	TemplateData first = new TemplateData();  
        	first.setColor("#000000");    
        	first.setValue("您好,您有一个流程待办需要处理:");    
        	m.put("first", first);  
        	  
        	TemplateData keyword1 = new TemplateData();    
        	keyword1.setColor("#000000");    
        	keyword1.setValue("11111111111111");    
        	m.put("keyword1", keyword1);  
        	  
        	TemplateData keyword2 = new TemplateData();    
        	keyword2.setColor("#000000");    
        	keyword2.setValue("爱你一万年");    
        	m.put("keyword2", keyword2);  
        	  
        	TemplateData keyword3 = new TemplateData();    
        	keyword3.setColor("#000000");    
        	keyword3.setValue("2018.04.27 09:51:30");    
        	m.put("keyword3", keyword3);  
        	  
        	TemplateData keyword4 = new TemplateData();    
        	keyword4.setColor("#000000");    
        	keyword4.setValue("不够");    
        	m.put("keyword4", keyword4);  
        	  
        	TemplateData remark = new TemplateData();    
        	remark.setColor("#000000");    
        	remark.setValue("再加一万年");    
        	m.put("remark", remark);  
        	//about data end
            
    	tm.setData(m);
    		
    	String jsonString = JSONObject.fromObject(tm).toString();
    		
    	System.out.println("jsonString:"+jsonString);
    		
    	return jsonString;
    	}
    	
    	/**
         * 发送模板消息
         * appId 公众账号的唯一标识
         * appSecret 公众账号的密钥
         * openId 用户标识
         */
    	public  void postTemplateMsg(String appId, String appSecret, String openId){
    		Token token = CommonUtil.getToken(appId, appSecret);
            String access_token = token.getAccessToken();
            String requestUrl = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token="+access_token;
    
            System.out.println("requestUrl:"+requestUrl);
            
            String jsonString = sendTemplateMessage(openId);
            
            JSONObject jsonObject = CommonUtil.httpsRequest(requestUrl, "POST", jsonString);
    		
            System.out.println("jsonObject="+jsonObject);    
            if (null != jsonObject) {  
                int errorCode = jsonObject.getInt("errcode");         
                if (0 == errorCode) {  
                    System.out.println("模板消息发送成功!");  
                } else {  
                    String errorMsg = jsonObject.getString("errmsg");  
                    System.out.println("模板消息发送失败,错误码是:"+errorCode+",错误信息是:"+errorMsg);  
                }  
            }  
       }
    

      

    /**
    * 类名: CommonUtil </br>
    * 描述: 通用工具类 </br>
    * 发布版本:V1.0  </br>
     */
    public class CommonUtil {
    
        // 凭证获取(GET)
        public final static String token_url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET";
    
        /**
         * 发送https请求
         * 
         * @param requestUrl 请求地址
         * @param requestMethod 请求方式(GET、POST)
         * @param outputStr 提交的数据
         * @return JSONObject(通过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.fromObject(buffer.toString());
            } catch (ConnectException ce) {
                System.out.println("连接超时:"+ ce);
            } catch (Exception e) {
                System.out.println("https请求异常:"+ e);
            }
            return jsonObject;
        }
    
        /**
         * 获取接口访问凭证
         * 
         * @param appid 凭证
         * @param appsecret 密钥
         * @return
         */
        public static Token getToken(String appid, String appsecret) {
            Token token = null;
            String requestUrl = token_url.replace("APPID", appid).replace("APPSECRET", appsecret);
            
            
            System.out.println("requestUrl:"+requestUrl);
            
            
            // 发起GET请求获取凭证
            JSONObject jsonObject = httpsRequest(requestUrl, "GET", null);
    
            if (null != jsonObject) {
                try {
                    token = new Token();
                    token.setAccessToken(jsonObject.getString("access_token"));
                    token.setExpiresIn(jsonObject.getInt("expires_in"));
                } catch (JSONException e) {
                    token = null;
                    // 获取token失败
                    System.out.println("获取token失败 errcode:"+jsonObject.getInt("errcode")+"errmsg:"+jsonObject.getString("errmsg"));
                }
            }
            return token;
        }
    
        /**
         * URL编码(utf-8)
         * @param source
         * @return
         */
        public static String urlEncodeUTF8(String source) {
            String result = source;
            try {
                result = java.net.URLEncoder.encode(source, "utf-8");
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
            return result;
        }
        
        public static void main(String args[]) {
            //https://1d488f5d.ngrok.io/WeiXinProject/
            String source="https://565b4dad.ngrok.io/WeChatPublicNumber/oauthServlet";
            System.out.println(CommonUtil.urlEncodeUTF8(source));
            
        }
    }

     over!

  • 相关阅读:
    Oracle中模拟SQL中的isnull函数
    Delphi:在OnBeforePost事件中取消TDataSet.Post(Delphi: Canceling a TDataSet.Post in an OnBeforePost Event)
    DBGrid的输入焦点控制
    刷新dbgrid 而不失去当前行位置
    MoveTo和MoveBy
    接口及接口测试
    ()文献可视化--vosviewer入门
    给出先序和中序,给一个数找到位置并输出它左子树里最大的数
    Kruskal算法:最小生成树
    Prim算法:最小生成树
  • 原文地址:https://www.cnblogs.com/xh_Blog/p/8961224.html
Copyright © 2020-2023  润新知