2017-10-17 22:36:19 qq_32737755 阅读数 477
  • 微信公众平台深度开发v2.0第3季——二维码、模板消息

    “微信公众平台深度开发Java版 v2.0”系列课程共有6季,使用JAVA语言,系统讲解微信公众平台订阅号、服务号官方列出的全部功能接口,包括:自定义菜单、个性化菜单(按需定制菜单)、群发消息、客服消息(有限次消息推送)、模板消息接(无限次消息推送)、微信网页开发(微信WEB开发、微信游戏)、微信JSSDK开发、用户管理、获取用户基本信息、网页授权获取用户基本信息(通过WEB得到用户信息)、二维码(临时二维码、永久二维码)、事件推送、接收普通消息、被动回复用户消息,等知识点。 以及,针对微信公众号开发的服务端架构设计方案。课程以微信公众号开发视角,讲解JAVA开发微信公众号所需的框架、第三方工具。 购买套餐还赠送经典微信开发课程——[微信公众号_独立知识点]环境搭建。该课程针对各种复杂的网络环境,讲解如何构建开发环境,已解决“没有服务器”、“没有固定IP”等开发者遇到的窘境。 课程采用独立知识点讲解,一个知识点,一组课程,真正做到“简单、高效、”以短的时间、实现的学习。更多课程信息请访问CSDN。网址:http://edu.csdn.net/lecturer/631 “微信公众平台企业号开发Java版”陆续上线。 详情 qq2326321088

    10262 人正在学习 去看看 翟东平

做微信开发,肯定很常用模板消息。一般简便的用法是在微信公众平台直接设置,然后拿来调用:服务号都可以在功能->添加功能插件处看到申请模板消息功能的入口,但只有认证后的服务号才可以申请模板消息的使用权限并获得模板消息权限。

请几天工作需要研究了下微信文档 ,根据模板消息接口写了个发送模板消息的简单程序。
下面将代码贴出:
下面代码可直接拷贝复用 需要更改&appid &secret 还有 接受者openid

/**http函数**/
function https_request($url,$data=null){
        $curl = curl_init();
        curl_setopt($curl,CURLOPT_URL,$url);
        curl_setopt($curl,CURLOPT_SSL_VERIFYPEER,FALSE);
        curl_setopt($curl,CURLOPT_SSL_VERIFYHOST,FALSE);
        if(!empty($data)){
            curl_setopt($curl,CURLOPT_POST,1);
            curl_setopt($curl,CURLOPT_POSTFIELDS,$data);
        }
        curl_setopt($curl,CURLOPT_RETURNTRANSFER,1);
        $output = curl_exec($curl);
        curl_close($curl);
        return $output;
    }
$aturl ="https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=微信appid&secret=微信secret";
    $atres = https_request($aturl);
    $atres = json_decode($atres,true);
    $access_token = $atres['access_token'];
    //获取access_token

//设置所属行业
     $take_url = "https://api.weixin.qq.com/cgi-bin/template/api_set_industry?access_token={$access_token}";
     //industry_id1 industry_id2 行业id
    $take_data = array('industry_id1'=>1,'industry_id2'=>30);
    $result = https_request($take_url, json_encode($take_data));
    //var_dump($result);

//获取设置的行业信息
    $get_url = "https://api.weixin.qq.com/cgi-bin/template/get_industry?access_token={$access_token}";
    $get_result = https_request($get_url);
    $get_result = json_decode($get_result,true);
    //var_dump($get_result);
//定义模板编号(公众平台可以查到所需要的编号)  获得模板ID
//这里的 模板标题:等待审核通知
    $mb_url = "https://api.weixin.qq.com/cgi-bin/template/api_add_template?access_token={$access_token}";
    $mb_data = array('template_id_short'=>'OPENTM408471635');
    $mb_result = https_request($mb_url, json_encode($mb_data));
    $mb_result = json_decode($mb_result,true);

//发送模板消息
    $send_url = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token={$access_token}";
    $send_data = array(    
    "touser"=>"接收人 openid",
    //接收人 openid
    "template_id"=>$mb_result['template_id'],
    "url"=>"http://weixin.qq.com",            
    "data"=>array(  "first"=>array("value"=>"家属/租客会员卡申请","color"=>"#173177"),
    "keyword1"=>array("value"=>"申请人","color"=>"#173177"),
    "keyword2"=>array("value"=>"申请信息:****************; ","color"=>"#173177"),
    'remark' => array('value' => '请进入成员列表进行审核操作!' , 'color' => '#4a5077')
                    )
           );
    $send_result = https_request($send_url, json_encode($send_data));
    $send_result = json_decode($send_result,true);
    //var_dump($send_result);
    /**我做了个测试,发送成功 返回: array(3) { ["errcode"]=> int(0) ["errmsg"]=> string(2) "ok" ["msgid"]=> int(433240389) }
     */
2017-04-06 09:39:06 u013065023 阅读数 3548
  • 微信公众平台深度开发v2.0第3季——二维码、模板消息

    “微信公众平台深度开发Java版 v2.0”系列课程共有6季,使用JAVA语言,系统讲解微信公众平台订阅号、服务号官方列出的全部功能接口,包括:自定义菜单、个性化菜单(按需定制菜单)、群发消息、客服消息(有限次消息推送)、模板消息接(无限次消息推送)、微信网页开发(微信WEB开发、微信游戏)、微信JSSDK开发、用户管理、获取用户基本信息、网页授权获取用户基本信息(通过WEB得到用户信息)、二维码(临时二维码、永久二维码)、事件推送、接收普通消息、被动回复用户消息,等知识点。 以及,针对微信公众号开发的服务端架构设计方案。课程以微信公众号开发视角,讲解JAVA开发微信公众号所需的框架、第三方工具。 购买套餐还赠送经典微信开发课程——[微信公众号_独立知识点]环境搭建。该课程针对各种复杂的网络环境,讲解如何构建开发环境,已解决“没有服务器”、“没有固定IP”等开发者遇到的窘境。 课程采用独立知识点讲解,一个知识点,一组课程,真正做到“简单、高效、”以短的时间、实现的学习。更多课程信息请访问CSDN。网址:http://edu.csdn.net/lecturer/631 “微信公众平台企业号开发Java版”陆续上线。 详情 qq2326321088

    10262 人正在学习 去看看 翟东平

微信公众账号开发-发送模板消息:

 

内容概要

本篇文章主要叙述如何在微信公众帐号上实现发送模板消息开发功能。包含json的封装与解析。

 

何谓模板消息

为了保证用户不受到骚扰,在开发者出现需要主动提醒、通知用户时,才允许开发者在公众平台网站中模板消息库中选择模板,选择后获得模板ID,再根据模板ID向用户主动推送提醒、通知消息。

 

注意:模板消息只能开发者主动向微信用户发送,不能有用户被动发起。

 

寻找接口(数据源)

开发者需向微信服务器发送post请求,并携带根据模板配装好的一个json包。

请求地址:

https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=ACCESS_TOKEN

json格式:

 

参考微信接口文档https://mp.weixin.qq.com/advanced/tmplmsg?action=faq&token=663979174&lang=zh_CN

 

开发步骤

1) 获取模板ID

2) 构造模版消息体并请求接口

 

代码及实现

获取模板id:

1、具有支付能力的公众号才可以使用模板消息进行服务。在微信公众平台的后台,依次进入“功能->添加功能插件->模版消息”,即可申请模版消息。


点击申请

申请时,选择2个和自己相关的两个行业即可。

提交并且申请通过后,可以在模版库中看到模版消息列表

进入想使用的模板,点击添加

添加后就存到“我的模板库”中了(每个账号可以最多可以添加10个模板到“我的模板库”中)

查看模版的详情,可以看到模版id及各项内容参数名。

不同的模版消息的内容结构不一样。这些id及字段名将在程序中使用到。

 

 

 

 

注意:如果模板库中没有你想使用的模板时,可以在模板库页面点击“帮助我们完善模板库”创建自己的消息模板,创建消息模板需要申请,审核通过后该模板将被添加到该行业的模板库中。每个账号每月只能申请3个模板。

点击帮助我们完善模板库

 

 

 

 

代码实现(Java,建议将代码复制到Eclipse编辑器,看起来效果就不凌乱了):

 

1、构造模板体(json包),以交易提醒模板为例,这里封装成一个TradingNotice类。构造该类时需传入接收者微信的openid、模板id、模板主体颜色、用户名。代码中采用LinkedHashMap是为了保证数据是以存入的顺序排序,从而保证json格式的结构不被打乱。

import java.util.LinkedHashMap;

import java.util.Map;

 

public classTradingNotice {

   privateMap<String,Object>map;

   privateMap<String,Object>data;

  

   public TradingNotice(Stringtouser, String template_id, Stringurl, String topcolor,Stringuser) {

      map=newLinkedHashMap<String, Object>();

      data=newLinkedHashMap<String, Object>();

     

      LinkedHashMap<String,String>first=newLinkedHashMap<String,String>();

      first.put("value","尊敬的" +user + "\n\n您尾号为0426的招商银行卡最近有一笔交易(测试)");

      first.put("color","#743A3A");

      data.put("first",first);

 

      LinkedHashMap<String,String>keyword1=newLinkedHashMap<String,String>();

      keyword1.put("value","YXJ134953845");

      keyword1.put("color","#FF0000");

      data.put("keyword1",keyword1);

 

      LinkedHashMap<String,String>keyword2=newLinkedHashMap<String,String>();

      keyword2.put("value","2014/08/18 13:18");

      keyword2.put("color","#C4C400");

      data.put("keyword2",keyword2);

 

      LinkedHashMap<String,String>keyword3=newLinkedHashMap<String,String>();

      keyword3.put("value","1888888888");

      keyword3.put("color","#0000FF");

      data.put("keyword3",keyword3);

 

      LinkedHashMap<String,String>keyword4=newLinkedHashMap<String,String>();

      keyword4.put("value","消费");

      keyword4.put("color","#008000");

      data.put("keyword4",keyword4);

     

      LinkedHashMap<String,String>keyword5=newLinkedHashMap<String,String>();

      keyword5.put("value","26万元");

      keyword5.put("color","#008000");

      data.put("keyword5",keyword5);

 

      LinkedHashMap<String,String>remark=newLinkedHashMap<String,String>();

      remark.put("value","\n\n截止2014/08/18 13:18您招商信用账户可用余额未20000");

      remark.put("color","#000000");

      data.put("remark",remark);

 

      map.put("touser",touser);

      map.put("template_id",template_id);

      map.put("url",url);

      map.put("topcolor",topcolor);

      map.put("data",data);

   }

 

   public Map<String,Object> getMap() {

      return map;

   }

 

   public void setMap(Map<String,Object> map){

      this.map =map;

   }

 

   public Map<String,Object> getDate() {

      return data;

   }

 

   public void setDate(Map<String,Object> date){

      this.data =date;

   }

}

 

2、方法create_TN_Json用来构造json包,方法getUserData用来获取关注者昵称,需传入客户的openid。方法getUserList用来获取微信关注者列表,将所有关注者的openid保存在一个ArrayList中。由于获取关注者列表一次只能获取1000个微信号,所以当关注者多余1000的时候循环调用方法getUserJson来获取所有关注者账号。

获取关注这列表可参考微信公众平台接口文档,地址http://mp.weixin.qq.com/wiki/index.php?title=获取关注者列表

方法send_Json用来发送模板消息请求,必须采用post请求

 

import java.io.BufferedReader;

import java.io.InputStream;

import java.io.InputStreamReader;

import java.io.OutputStreamWriter;

import java.NET.HttpURLConnection;

import java.Net.URL;

import java.util.ArrayList;

import java.util.Iterator;

 

import wx.sunl.menus.Get_Token;

import wx.sunl.template.TradingNotice;

import net.sf.json.JSONObject;

 

public classCreate_Json {

   //获取交易提醒json;

   public static JSONObjectcreate_TN_Json(String touser,String user){

      JSONObjectjsonObject=null;

      //模板id

      Stringtemplate_id="15Eox4OfGsjFYaVRwk9Dbos_aaIkzveCkpG3AsnKqLA";

      //点击模板后的链接地址

      Stringurl="www.baidu.com";

      //模板的主题颜色

      Stringtopcolor="#008000";

      //构造json

      TradingNoticewn = new TradingNotice(touser,template_id,url,topcolor,user);

      jsonObject=JSONObject.fromObject(wn.getMap());

      return jsonObject;

   }

   //入口;

   public static void main(String[] args){

      //检查access_token是否过期,如果过期重新产生

      //Get_Token.TwoDate();

      //调用getUserList获取关注者列表

      ArrayList<String>usersgetUserList();

      if(users!=null){

         Iterator<String>user=users.iterator();

         JSONObjectjsonObject1=null;

         Stringopen_idnull;

         StringuserNamenull;

         while(user.hasNext()){

            open_id = user.next();

            //调用getUserData获取关注者昵称

            userName = getUserData(open_id);

            if(userName!=null){

                //创建交易提醒json;

                jsonObject1 = Create_Json.create_TN_Json(open_id,userName);

                //发送交易提醒模板消息;

                send_Json(jsonObject1.toString(),Get_Token.access_token);

            }

         }

      }

   }

  

   //获取用户基本信息(UnionID机制);

   public static StringgetUserData(String openid){

        StringBuffer bufferRes =new StringBuffer();

        String result=null;

        try {

                URL realUrl = new URL("https://api.weixin.qq.com/cgi-bin/user/info?access_token=" + Get_Token.access_token +"&openid=" + openid+"&lang=zh_CN");

                HttpURLConnection conn = (HttpURLConnection)realUrl.openConnection();

                // 请求方式

                conn.setDoOutput(true);

                conn.setDoInput(true);

                conn.setRequestMethod("GET");

                conn.setUseCaches(false);

                conn.setInstanceFollowRedirects(true);

                conn.setRequestProperty("Content-Type","application/json");

                conn.connect();

                // 获取URLConnection对象对应的输入流

                InputStream in =conn.getInputStream();

                BufferedReader read =new BufferedReader(new InputStreamReader(in,"UTF-8"));

                String valueString =null;

                while ((valueString=read.readLine())!=null){

                        bufferRes.append(valueString);

                }

                System.out.println(bufferRes);

                in.close();

                if (conn !=null){

                    // 关闭连接

                    conn.disconnect();

                }

        } catch (Exceptione) {

                e.printStackTrace();

        }

        //将返回的字符串转换成json

        JSONObject jsonObject = JSONObject.fromObject(bufferRes.toString());

        //解析json中的数据

        String subscribe = jsonObject.get("subscribe").toString();

        //等于1表示有关注者,0表示没有关注者

        if("1".equals(subscribe.toString())){

          //解析出关注者的昵称

          result = (String)jsonObject.get("nickname");

        }

        returnresult;

   }

  

   //获取关注列表;

   @SuppressWarnings("unchecked")

   public static ArrayList<String>getUserList() {

        StringBuffer bufferRes =new StringBuffer();

        ArrayList<String> users =null;

        try {

                URL realUrl = new URL("https://api.weixin.qq.com/cgi-bin/user/get?access_token=" + Get_Token.access_token);

                HttpURLConnection conn = (HttpURLConnection)realUrl.openConnection();

                // 请求方式

                conn.setDoOutput(true);

                conn.setDoInput(true);

                conn.setRequestMethod("GET");

                conn.setUseCaches(false);

                conn.setInstanceFollowRedirects(true);

                conn.setRequestProperty("Content-Type","application/json");

                conn.connect();

                // 获取URLConnection对象对应的输入流

                InputStream in =conn.getInputStream();

                BufferedReader read =new BufferedReader(new InputStreamReader(in,"UTF-8"));

                String valueString =null;

                while ((valueString=read.readLine())!=null){

                        bufferRes.append(valueString);

                }

                System.out.println(bufferRes);

                in.close();

                if (conn !=null){

                    // 关闭连接

                    conn.disconnect();

                }

        } catch (Exceptione) {

                e.printStackTrace();

        }

        //将返回的字符串转换成json

        JSONObject jsonObject = JSONObject.fromObject(bufferRes.toString());

        //解析json中表示openid的列表

        JSONObject data = (JSONObject)jsonObject.get("data");

        if(data!=null){

          //openid列表转化成数组保存

          users = newArrayList<String>(data.getJSONArray("openid"));

          //获取关注者总数

          intcount = Integer.parseInt(jsonObject.get("total").toString());

          if(count>1000){

             JSONObjectobject=jsonObject;

             Stringnext_openid=null;

             JSONObjectob_data=null;

             ArrayList<String>ob_user=null;

             //大于1000需要多次获取,或许次数为count/1000

             for(inti=0;i<count/1000;i++){

                //解析出下次获取的启示openid

                next_openid = object.get("next_openid").toString();

                object = getUserJson(next_openid);

                ob_data = (JSONObject)object.get("data");

                ob_user = newArrayList<String>(ob_data.getJSONArray("openid"));

                for(Stringopen_id : ob_user){

                    //将多次获取的openid添加到同一个数组

                    users.add(open_id);

                }

            }

          }

        }

        returnusers;

   }

   

   //连续获取关注列表;

   public static JSONObjectgetUserJson(String next_openid) {

        StringBuffer bufferRes =new StringBuffer();

        try {

                URL realUrl = new URL("https://api.weixin.qq.com/cgi-bin/user/get?access_token=" + Get_Token.access_token +"&next_openid=" + next_openid);

                HttpURLConnection conn = (HttpURLConnection)realUrl.openConnection();

                // 请求方式

                conn.setDoOutput(true);

               conn.setDoInput(true);

                conn.setRequestMethod("GET");

                conn.setUseCaches(false);

                conn.setInstanceFollowRedirects(true);

                conn.setRequestProperty("Content-Type","application/json");

               conn.connect();

                // 获取URLConnection对象对应的输入流

                InputStream in =conn.getInputStream();

                BufferedReader read =new BufferedReader(new InputStreamReader(in,"UTF-8"));

                String valueString =null;

                while ((valueString=read.readLine())!=null){

                        bufferRes.append(valueString);

                }

                System.out.println(bufferRes);

                in.close();

                if (conn !=null){

                    // 关闭连接

                    conn.disconnect();

                }

        } catch (Exceptione) {

                e.printStackTrace();

        }

       

        JSONObject jsonObject = JSONObject.fromObject(bufferRes);

        returnjsonObject;

   }

  

   //发送模板;

   publicstaticvoidsend_Json(Stringparams,StringaccessToken){

        StringBuffer bufferRes =new StringBuffer();

        try {

                URL realUrl = new URL("https://api.weixin.qq.com/cgi-bin/message/template/send?access_token="+accessToken);

                HttpURLConnection conn = (HttpURLConnection)realUrl.openConnection();

                // 请求方式

                conn.setDoOutput(true);

                conn.setDoInput(true);

                conn.setRequestMethod("POST");

                conn.setUseCaches(false);

                conn.setInstanceFollowRedirects(true);

                conn.setRequestProperty("Content-Type","application/json");

                conn.connect();

                // 获取URLConnection对象对应的输出流

                OutputStreamWriter out =new OutputStreamWriter(conn.getOutputStream(),"UTF-8");

                // 发送请求参数

                //out.write(URLEncoder.encode(params,"UTF-8"));

                //发送json

                out.write(params);

               out.flush();

                out.close();

                InputStream in =conn.getInputStream();

                BufferedReader read =new BufferedReader(new InputStreamReader(in,"UTF-8"));

                String valueString =null;

                while ((valueString=read.readLine())!=null){

                        bufferRes.append(valueString);

                }

                //输出返回的json

                System.out.println(bufferRes);

                in.close();

                if (conn !=null){

                    // 关闭连接

                    conn.disconnect();

                }

        } catch (Exceptione) {

                e.printStackTrace();

        }

   }

}

 

 

 

注意:

创建json包时要根据模板内容构造。

列如:交易提醒创建的json为:

{"touser":"",

"template_id":"",

"url":"",

"topcolor":"",

"data":{

"first":{"value":"","color":""},

"keyword1":{"value":"","color":""},

"keyword2":{"value":"","color":""},

"keyword3":{"value":"","color":""},

"keyword4":{"value":"","color":""},

"keyword5":{"value":"","color":""},

"remark":{"value":"","color":""}}}

 

笔试通知提醒创建的json为:

{"touser":"",

"template_id":"",

"url":"",

"topcolor":"",

"data":{

"first":{"value":"","color":""},

"company":{"value":"","color":""},

"datetime":{"value":"","color":""},

"address":{"value":"","color":""},

"contact":{"value":"","color":""},

"remark":{"value":"","color":""}}}

 

 

2018-01-02 09:18:52 spfLinux 阅读数 354
  • 微信公众平台深度开发v2.0第3季——二维码、模板消息

    “微信公众平台深度开发Java版 v2.0”系列课程共有6季,使用JAVA语言,系统讲解微信公众平台订阅号、服务号官方列出的全部功能接口,包括:自定义菜单、个性化菜单(按需定制菜单)、群发消息、客服消息(有限次消息推送)、模板消息接(无限次消息推送)、微信网页开发(微信WEB开发、微信游戏)、微信JSSDK开发、用户管理、获取用户基本信息、网页授权获取用户基本信息(通过WEB得到用户信息)、二维码(临时二维码、永久二维码)、事件推送、接收普通消息、被动回复用户消息,等知识点。 以及,针对微信公众号开发的服务端架构设计方案。课程以微信公众号开发视角,讲解JAVA开发微信公众号所需的框架、第三方工具。 购买套餐还赠送经典微信开发课程——[微信公众号_独立知识点]环境搭建。该课程针对各种复杂的网络环境,讲解如何构建开发环境,已解决“没有服务器”、“没有固定IP”等开发者遇到的窘境。 课程采用独立知识点讲解,一个知识点,一组课程,真正做到“简单、高效、”以短的时间、实现的学习。更多课程信息请访问CSDN。网址:http://edu.csdn.net/lecturer/631 “微信公众平台企业号开发Java版”陆续上线。 详情 qq2326321088

    10262 人正在学习 去看看 翟东平

很奇怪,装了新版本的微信开发者工具,使用模板代码,反而报错。后来百度,发现这样一个解决方案,就ok了。

点击打开链接


2018-12-18 22:12:21 m0_37739193 阅读数 80
  • 微信公众平台深度开发v2.0第3季——二维码、模板消息

    “微信公众平台深度开发Java版 v2.0”系列课程共有6季,使用JAVA语言,系统讲解微信公众平台订阅号、服务号官方列出的全部功能接口,包括:自定义菜单、个性化菜单(按需定制菜单)、群发消息、客服消息(有限次消息推送)、模板消息接(无限次消息推送)、微信网页开发(微信WEB开发、微信游戏)、微信JSSDK开发、用户管理、获取用户基本信息、网页授权获取用户基本信息(通过WEB得到用户信息)、二维码(临时二维码、永久二维码)、事件推送、接收普通消息、被动回复用户消息,等知识点。 以及,针对微信公众号开发的服务端架构设计方案。课程以微信公众号开发视角,讲解JAVA开发微信公众号所需的框架、第三方工具。 购买套餐还赠送经典微信开发课程——[微信公众号_独立知识点]环境搭建。该课程针对各种复杂的网络环境,讲解如何构建开发环境,已解决“没有服务器”、“没有固定IP”等开发者遇到的窘境。 课程采用独立知识点讲解,一个知识点,一组课程,真正做到“简单、高效、”以短的时间、实现的学习。更多课程信息请访问CSDN。网址:http://edu.csdn.net/lecturer/631 “微信公众平台企业号开发Java版”陆续上线。 详情 qq2326321088

    10262 人正在学习 去看看 翟东平
前言:

正如许多推送一样,微信也友好的给广大开发者提供了“模板消息”,比推送更好的是,它能借助海量用户的微信平台直接通过服务号以短消息形式传达给用户,大大提高了运营的可能性。比如我们现在可以完全抛开银行卡的短信服务,通过相关银行提供服务号绑定银行卡,当发生交易的时候同样的能收到交易详情短消息,确实是方便了不少!
 

开发准备:设置模板

在这里插入图片描述
官方文档:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1433751277

实际项目中肯定会存在多种类型的模板,那么肯定需要做一些共用代码封装,我这里以“告警通知”这个模板为例
在这里插入图片描述

项目结构:

在这里插入图片描述
实例代码:
xiaoqiang.java:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.net.URL;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;

import javax.net.ssl.HttpsURLConnection;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.client.RestTemplate;

import net.sf.json.JSONObject;

public class xiaoqiang {
	
	public static final String appid = "xxxxxxxxxxxxxxxxxx";
	public static final String appsecret = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";

	private static Logger loger = LoggerFactory.getLogger(xiaoqiang.class);
	
	public static void main(String args[]) throws UnsupportedEncodingException {
		boolean isOk = sendWXmessage("omC2vt7Abjv5ZTlD_WXRaN4c2vOs","有美女爱上了你,请尽快处理","https://blog.csdn.net/m0_37739193");
		if (isOk) {
			loger.info("微信预警发送成功");
		} else {
			loger.info("微信预警发送失败");
		}
	}
	
	// 发送微信预警信息
	public static boolean sendWXmessage(String openid, String text, String Url) throws UnsupportedEncodingException {
		boolean flag = false;
		Map<String, String> paramMap = new HashMap<String, String>();
		paramMap.put("first", "xxx系统预警信息");
		paramMap.put("content", text);
		SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//设置日期格式
		String date = df.format(new Date());
		paramMap.put("occurtime", date);
		try {
			String template_id = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";// 模板ID
			TemplateMessage templateInfo = new TemplateMessage();

			templateInfo.setTouser(openid);
			templateInfo.setTemplate_id(template_id);
			templateInfo.setUrl(Url); //点击模板跳转链接

			Map<String, TemplateValue> data = new HashMap<String, TemplateValue>();

			Map<String, String> map = paramMap;

			for (Entry<String, String> entity : map.entrySet()) {
				TemplateValue value = new TemplateValue();
				value.setColor("#173177");
				value.setValue(entity.getValue());
				data.put(entity.getKey(), value);
			}
			templateInfo.setData(data);

			// String acessToken = getWXAccessToken(); // 可参考上一篇文章中获取access_token的代码
			String url = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + acessToken;

			RestTemplate template = new RestTemplate();
			TemplateResult result = template.postForObject(url, templateInfo, TemplateResult.class);
			System.out.println(result.getErrcode());
			if (result.getErrcode() != 0) {
				System.out.println(
						String.valueOf("发送模版信息失败:openId:[" + templateInfo.getTouser() + "]," + result.getErrcode())
								+ ":" + result.getErrmsg());
			} else {
				flag = true;
			}
			return flag;
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		}
	}
}

TemplateMessage.java:

import java.util.Map;

/**
 * 功能描述:
 * <p>
 * 微信模版消息
 * </p>
 */
public class TemplateMessage {
	private String touser;
	private String template_id;
	private String url;
	private Map<String, TemplateValue> data;// 模版参数

	public String getTouser() {
		return touser;
	}

	public void setTouser(String touser) {
		this.touser = touser;
	}

	public String getTemplate_id() {
		return template_id;
	}

	public void setTemplate_id(String template_id) {
		this.template_id = template_id;
	}

	public Map<String, TemplateValue> getData() {
		return data;
	}

	public void setData(Map<String, TemplateValue> data) {
		this.data = data;
	}

	public String getUrl() {
		return url;
	}

	public void setUrl(String url) {
		this.url = url;
	}
}

TemplateResult.java:

    /**
 * 功能描述:
 * <p>发送模版信息结果对象 </p>
 */
public class TemplateResult {
	private int errcode;
	private String errmsg;
	private long msgid;

	public int getErrcode() {
		return errcode;
	}

	public void setErrcode(int errcode) {
		this.errcode = errcode;
	}

	public String getErrmsg() {
		return errmsg;
	}

	public void setErrmsg(String errmsg) {
		this.errmsg = errmsg;
	}

	public long getMsgid() {
		return msgid;
	}

	public void setMsgid(long msgid) {
		this.msgid = msgid;
	}
}

TemplateValue.java:

/**
 * 功能描述:
 * <p>微信模版业务数据参数对象 </p>
 */
public class TemplateValue {
	private String value;
	private String color;
	
	public String getValue() {
		return value;
	}
	public void setValue(String value) {
		this.value = value;
	}
	public String getColor() {
		return color;
	}
	public void setColor(String color) {
		this.color = color;
	}
}

运行代码结果:
在这里插入图片描述

注意这里有个坑:

所有value的总长度不能超过200字,否则会出现三个点省略号的尴尬局面。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
POST请求实例:

https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=access_token
{
           "touser":openid,
           "template_id":模板ID,
           "url":"https://blog.csdn.net/m0_37739193",
           "data":{
                   "first": {
                       "value":"恭喜你购买成功!",
                       "color":"#2354ad"
                   },
                   "content":{
                       "value":"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaee",
                       "color":"#173177"
                   },
                   "occurtime": {
                       "value":"2018-12-10 18:45:12",
                       "color":"#173177"
                   }
           }
}
2017-10-20 12:04:55 xiuwu0423 阅读数 3114
  • 微信公众平台深度开发v2.0第3季——二维码、模板消息

    “微信公众平台深度开发Java版 v2.0”系列课程共有6季,使用JAVA语言,系统讲解微信公众平台订阅号、服务号官方列出的全部功能接口,包括:自定义菜单、个性化菜单(按需定制菜单)、群发消息、客服消息(有限次消息推送)、模板消息接(无限次消息推送)、微信网页开发(微信WEB开发、微信游戏)、微信JSSDK开发、用户管理、获取用户基本信息、网页授权获取用户基本信息(通过WEB得到用户信息)、二维码(临时二维码、永久二维码)、事件推送、接收普通消息、被动回复用户消息,等知识点。 以及,针对微信公众号开发的服务端架构设计方案。课程以微信公众号开发视角,讲解JAVA开发微信公众号所需的框架、第三方工具。 购买套餐还赠送经典微信开发课程——[微信公众号_独立知识点]环境搭建。该课程针对各种复杂的网络环境,讲解如何构建开发环境,已解决“没有服务器”、“没有固定IP”等开发者遇到的窘境。 课程采用独立知识点讲解,一个知识点,一组课程,真正做到“简单、高效、”以短的时间、实现的学习。更多课程信息请访问CSDN。网址:http://edu.csdn.net/lecturer/631 “微信公众平台企业号开发Java版”陆续上线。 详情 qq2326321088

    10262 人正在学习 去看看 翟东平

正如许多推送一样,微信也友好的给广大开发者提供了“模板消息”,比推送更好的是,它能借助海量用户的微信平台直接通过服务号以短消息形式传达给用户,大大提高了运营的可能性。比如我们现在可以完全抛开银行卡的短信服务,通过相关银行提供服务号绑定银行卡,当发生交易的时候同样的能收到交易详情短消息,确实是方便了不少!

 

上一篇讲到了获取和缓存access_token,也成功配置了jssdk授权,这些前置条件都准备好了,那么同样的实现一些功能就很快了,这回具体来说说模板消息的发送

 

公众号平台配置

功能-我的模板(或者去模块库中搜索),这里不涉及到代码,不细说

 

 后台restful

实际项目中肯定会存在多种类型的模板,那么肯定需要做一些共用代码封装,我这里 以保单出单 这个模板为例

1,对应模板的信息

2.controller

复制代码
  /**
     * 发送模板消息
     * @return
     */
    @RequestMapping(value = "/sendTemplateMessage", method = RequestMethod.POST)
    public @ResponseBody HttpResult sendTemplateMessage(@RequestParam String dataJson){  
        HttpResult hr = null;
        LOGGER.info("RestFul of sendTemplateMessage parameters dataJson:{}",dataJson);
        
        try {
            hr = wechatService.sendTemplateMessage(dataJson);
            LOGGER.info("Send template message is successful!",hr);
        } catch (Exception e) {
            LOGGER.error("RestFul of sendTemplateMessage is error:{}",e);
        }
        
        return hr;
    }
复制代码

因为我这里是一个通用的接口,不同的模板可能传的参数都不同,时间缘故也没有写持久化bean对象,就用了一个json字符串接收

 

3.serveice

直接通过httpclient调用微信提供的POST请求,https://api.weixin.qq.com/cgi-bin/message/template/send?access_token={ACCESS_TOKEN}

  //保单出单通知
    @Value("${TEMPLATE_THREE}")
    private String TEMPLATE_THREE;

 

复制代码
  /**
     * 发送模板消息
     * @param dataJson
     * @return
     * @throws IOException
     */
    public HttpResult sendTemplateMessage(String dataJson) throws IOException{
        String doUrl = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token="+getBaseAccessToken();
        
        JSONObject data = JSONObject.parseObject(dataJson);
        Object touser = data.get("touser");//接收者openid
     String templateId = TEAMLATE_THREE;//模板ID Object url = data.get("url");//模板跳转链接,如果置空,则在发送后,点击模板消息会进入一个空白页面(ios),或无法点击(android)。
Object first = data.getString("first");//标题 Object remark = data.getString("remark");//备注 Object keyword1 = data.getString("keyword1"); Object keyword2 = data.getString("keyword2"); Object keyword3 = data.getString("keyword3"); JSONObject parentJSON = new JSONObject(); parentJSON.put("touser", touser);
     parentJSON.put("template_id", templateId); parentJSON.put("url", url); JSONObject json = new JSONObject(); json.put("first", toJson(first)); json.put("keyword1", toJson(keyword1));//对应的车辆信息 json.put("keyword2", toJson(keyword2));//产品信息 json.put("keyword3", toJson(keyword3));//出单状态json.put("remark", toJson(remark)); parentJSON.put("data", json);//模板数据 HttpResult rs = null; try { rs = apiService.doPostJson(doUrl,parentJSON.toJSONString()); } catch (Exception e) { LOGGER.error("RestFul of doLogin is error:{}",e); } return rs; } public JSONObject toJson(String value){ JSONObject json = new JSONObject(); json.put("value", value); json.put("color", "#173177");//消息字体颜色 return json; }
复制代码

为了增强代码可读性,关键字的地方我都添加了注释,那么到这里,后台基本完成,下面我通过一个接口调用工具Advanced REST client来测试一下

数据:

复制代码
{
  "touser": "otjo0wXJZipXdFjxzwDB3DZUjs44",
  "templateType": "3",
  "url": "www.liliangel.cn",
  "first": {
    "value": "测试发送模板消息3",
    "color": "#173177"
  },
  "keyword1": {
    "value": "testCar",
    "color": "#173177"
  },
  "keyword2": {
    "value": "testPro",
    "color": "#173177"
  },
  "keyword3": {
    "value": "successful",
    "color": "#173177"
  },
  "remark": {
    "value": "备注",
    "color": "#173177"
  }
}
复制代码

说明:我这里的数据结构是经过了一层json封装的,详细的格式可以参考微信官方文档及模板详情!

 

成功:

到这里我们已经完成了模板消息的接入,具体会不会比常用的推送更好? 会不会取代手机短信? 看怎么去运营,发挥你的想象,将微信提供的服务最大程度利用!

没有更多推荐了,返回首页