微信开发 模板消息

2018-05-28 23:44:26 qq_36274844 阅读数 1425

最近在做企业微信公众开发,其实是简单的做一个服务号群发和针对性发送消息给关注用户的功能,相对于客服消息和群发消息,模板消息无疑是最符合需求的。

这里直接上代码把:

<?php
header('content-type:text/html;charset=utf-8');
define("TOKEN", "my_weixin"); //define your token


class Oauth {
    //获得全局access_token
    public function get_token(){//如果已经存在直接返回access_token
            $appid = '';   //appid
        $appsecret = '';
        $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" . $appid . "&secret=" . $appsecret;//请求地址
        //2初始化curl请求
        $ch = curl_init();
        //3.配置请求参数
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 跳过证书检查
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);  // 从证书中检查SSL加密算法是否存在
        curl_setopt($ch, CURLOPT_URL, $url);//请求
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);//不直接输出数据
        //4.开始请求
        $res = curl_exec($ch);//获取请求结果
        if (curl_errno($ch)) {
            var_dump(curl_error($ch));//打印错误信息
        }
        //5.关闭curl
        curl_close($ch);
        $arr = json_decode($res, true);//将结果转为数组
        $_SESSION['access_token'] = $arr['access_token'];//将access_token存入session中,可以不存,每次都获得新的token
        $_SESSION['expire_time'] = time() + 7200;
        return $arr['access_token'];
    }


    //推送模板信息    参数:发送给谁的openid,客户姓名,客户电话,推荐楼盘(参数自定)
    function sendMessage($openid,$customName,$customPhone,$reportBuilding) {
        //获取全局token
        $token = $this->get_token();
        $url="https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=".$token;//模板信息请求地址
        //发送的模板信息(微信要求json格式,这里为数组(方便添加变量)格式,然后转为json)
        $post_data = array(
            "touser"=>$openid, //推送给谁,openid
            "template_id"=>"DrAuVKmBFSogNRKXXEXsmuXHpM_Tcj1MdN4xj6GsFiE", //微信后台的模板信息id
            "url"=>"", //下面为预约看房模板示例
            "data"=> array(
                "first" => array(
                    "value"=>"您有新客户,请及时查看!",
                    "color"=>"#173177"
                ),
                "keyword1"=>array(
                    "value"=>$customName, //传的变量
                    "color"=>"#173177"
                ),
                "keyword2"=>array(
                    "value"=>$customPhone,
                    "color"=>"#173177"
                ),
                "keyword3"=>array(
                    "value"=>$reportBuilding,
                    "color"=>"#173177"
                ),
                "keyword4"=> array(
                    "value"=>date('Y-m-d H:i:s'),
                    "color"=>"#173177"
                ),
                "remark"=> array(
                    "value"=>"请及时联系客户哦!",
                    "color"=>"#173177"
                ),
            )
        );
        //将上面的数组数据转为json格式
        $post_data = json_encode($post_data);
        //发送数据,post方式<br>         //配置curl请求
        
    }


}
$send = new Oauth();//实例化类
$send->sendMessage('o9ARg1uVOw0tNpSjhOsxC_ZktAcw','1','肖翔宁','3');//调用方法


?>
 

代码也是看网上的大佬的分享和接口文档,过程中遇到一个很蠢的问题,就是本来想着执行一次这个方法,但是访问页面的时候一直刷模板消息直到把接口访问次数给刷没了。查了很久发现是把这个代码写在了公众号和服务器配置的url的默认页面,微信发送消息成功时候会把成功的消息返回给url页面,这是一次新的访问,模板消息会重新发送,所以不断执行方法发送消息,把这个代码写在其他页面问题就解决了,相当尴尬

 

2016-03-25 11:13:19 u014330185 阅读数 1470

微信开发--模板消息接口

http://blog.csdn.net/u010486495/article/details/46985729

微信开发者文档:模板消息接口

模板消息运营规范:http://mp.weixin.qq.com/wiki/2/def71e3ecb5706c132229ae505815966.html(附带允许和不允许发送的模板实例)

原理:

1.微信公众号(服务号) 设置模板标题和模板内容--》生成模板ID

2.设置填充模板数据(使用map封装),匹配Id,发送给用户。

package com.dm.wx.domain.templateMsg;

import java.util.Map;

/**     http://zhengshuo.iteye.com/blog/2154083
 * Created by IntelliJ IDEA.
 * User: zjm
 * Date: 15-11-7
 * Time: 上午9:53
 * To change this template use File | Settings | File Templates.
 */
public class WxTemplate {
	private String template_id;
	private String touser;
	private String url;
	private String topcolor;
	private Map<String,TemplateData> data;

	public String getTemplate_id() {
		return template_id;
	}
	public void setTemplate_id(String template_id) {
		this.template_id = template_id;
	}
	public String getTouser() {
		return touser;
	}
	public void setTouser(String touser) {
		this.touser = touser;
	}
	public String getUrl() {
		return url;
	}
	public void setUrl(String url) {
		this.url = url;
	}
	public String getTopcolor() {
		return topcolor;
	}
	public void setTopcolor(String topcolor) {
		this.topcolor = topcolor;
	}
	public Map<String,TemplateData> getData() {
		return data;
	}
	public void setData(Map<String,TemplateData> data) {
		this.data = data;
	}
}

package com.dm.wx.domain.templateMsg;

/**
 * Created by IntelliJ IDEA.
 * User: zjm
 * Date: 15-11-7
 * Time: 上午9:54
 * To change this template use File | Settings | File Templates.
 */
public class TemplateData {
	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;
	}

}

package com.dm.wx.service;

import com.dm.core.dao.SqlDao;
import com.dm.core.util.WebUtil;
import com.dm.pfb.domain.Actoken;
import com.dm.wx.domain.templateMsg.TemplateData;
import com.dm.wx.domain.templateMsg.WxTemplate;
import com.dm.wx.domain.token.AccessToken;
import com.dm.wx.util.CommonUtil;
import com.dm.wx.util.R;
import net.sf.json.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.HashMap;
import java.util.Map;

/**
 * Created by IntelliJ IDEA.
 * User: zjm
 * Date: 15-11-7
 * Time: 上午9:57
 * To change this template use File | Settings | File Templates.
 */
public class TemplateMsgService {
    private static Logger log1 = LoggerFactory.getLogger(CommonUtil.class);

    public static void sendTmsg(String access_token, WxTemplate temp) {
        String url = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + access_token;
        String jsonString = JSONObject.fromObject(temp).toString();
        JSONObject jsonObject = CommonUtil.httpsRequest(url, "POST", jsonString);
        System.out.println(jsonObject);
        int result = 0;
        if (null != jsonObject) {
            if (0 != jsonObject.getInt("errcode")) {
                result = jsonObject.getInt("errcode");
                log1.error("错误 errcode:{} errmsg:{}", jsonObject.getInt("errcode"), jsonObject.getString("errmsg"));
            }
        }
        log1.info("模板消息发送结果:" + result);
    }

    public static WxTemplate tmsg1(String url, String open_id, String t_id) {   //    封装模板消息
        WxTemplate t = new WxTemplate();
        t.setUrl(url);
        t.setTouser(open_id);
        t.setTopcolor("#000000");
        t.setTemplate_id(t_id);

        Map<String, TemplateData> m = new HashMap<String, TemplateData>();  // 数据封装

        TemplateData first = new TemplateData();
        first.setColor("#173177");
        first.setValue("收到一个新的订单");
        m.put("first", first);

        TemplateData day = new TemplateData();
        day.setColor("#000000");
        day.setValue("14时56分");
        m.put("Day", day);

        TemplateData orderId = new TemplateData();
        orderId.setColor("#000000");
        orderId.setValue("20100511049");
        m.put("orderId", orderId);

        TemplateData orderType = new TemplateData();
        orderType.setColor("#000000");
        orderType.setValue("临时订单");
        m.put("orderType", orderType);

        TemplateData customerName = new TemplateData();
        customerName.setColor("#000000");
        customerName.setValue("zjm");
        m.put("customerName", customerName);

        TemplateData customerPhone = new TemplateData();
        customerPhone.setColor("#000000");
        customerPhone.setValue("15825223714");
        m.put("customerPhone", customerPhone);

        TemplateData remark = new TemplateData();
        remark.setColor("blue");
        remark.setValue("***备注说明***");
        m.put("Remark", remark);
        t.setData(m);
        return t;
    }

    public static WxTemplate tmsg2(String url, String open_id, String t_id) {   //    封装投标模板消息
        WxTemplate t = new WxTemplate();
        t.setUrl(url);
        t.setTouser(open_id);
        t.setTopcolor("#000000");
        t.setTemplate_id(t_id);

        Map<String, TemplateData> m = new HashMap<String, TemplateData>();  // 数据封装

        TemplateData first = new TemplateData();
        first.setColor("#173177");
        first.setValue("您好,您投资的借款项目");
        m.put("first", first);

        TemplateData keyword1 = new TemplateData();
        keyword1.setColor("#000000");
        keyword1.setValue("FZC20382002");
        m.put("keyword1", keyword1);

        TemplateData keyword2 = new TemplateData();
        keyword2.setColor("red");
        keyword2.setValue("已满标");
        m.put("keyword2", keyword2);


        TemplateData remark = new TemplateData();
        remark.setColor("blue");
        remark.setValue("请关注项目进展");
        m.put("remark", remark);
        t.setData(m);
        return t;
    }

    public static void main(String args[]){
        AccessToken token = CommonUtil.getAccessToken(R.appId, R.appsecret);
//        SqlDao sqlDao = (SqlDao) WebUtil.getWebApplicationContext().getBean("sqlDao");
//         AccessToken token = sqlDao.query("pfb_actoken.query", new Actoken());
            String access_token = token.getAccessToken();
        //WxTemplate t1 = tmsg1("http://www.baidu.com","oO5Cbs-KyEXBcLGM4tW_7QS0EJ2Y","3bEyPk4eUuaPnJ-5dHROvQx3jAdGkIvuMLuAq_C5kZE"); //url open_id t_id
        WxTemplate t2 = tmsg2("http://www.baidu.com","oO5Cbs-KyEXBcLGM4tW_7QS0EJ2Y","aInomVr0Xvm-J06zj1HtqM37VdYy_M05zaGFy0ef_r4"); //url open_id t_id
        //sendTmsg(access_token,t1);
        sendTmsg(access_token,t2);
    }
}

目前允许发的模板消息示例

1.1资料变更类通知示例如下:

标题

内容

示例

会员卡申请资料变更通知

{{first.DATA}}

会员卡号:{{keyword1.DATA}}

会员姓名:{{keyword2.DATA}}

变更内容:{{keyword3.DATA}}

时间:{{keyword4.DATA}}

{{remark.DATA}}

尊敬的会员,您的资料变更成功

会员卡号:0000 0000

会员姓名:李XX

变更内容:1234567890

时间:2015年5月5日

感谢您的使用

1.2政务服务类通知示例如下:

标题

     内容

示例

业务办理情况通知

{{first.DATA}}

办理单位:{{keyword1.DATA}}

办理时间:{{keyword2.DATA}}

办理情况:{{keyword3.DATA}}

{{remark.DATA}}

您好,您的诉求编号为12345

办理单位:市财政局

办理时间:2015-01-15 10:47:35

办理情况:经我局核实,关于南郊公园领购票据事宜回复如下

感谢您对热线的支持

1.3物品(含虚拟类)收取类通知示例如下:

标题

内容

示例

取件成功通知

{{first.DATA}}

快递单号:{{keyword1.DATA}}

取件时间:{{keyword2.DATA}}

{{remark.DATA}}

您的快件已经取走

快递单号:998998998

取件时间:2014年11月17日 11:36

如不是本人操作请联系客服4008888888

1.4消费交易类通知示例如下:

标题

内容

示例

订单支付成功通知

{{first.DATA}}

订单商品:{{keyword1.DATA}}

订单编号:{{keyword2.DATA}}

支付金额:{{keyword3.DATA}}

支付时间:{{keyword4.DATA}}

{{remark.DATA}}

尊敬的客户,您的订单已支付成功

订单商品:2014款背包

订单编号:201500001

支付金额:150元

支付时间:2014年10月21日13:00

感谢您的光临

1.5签到类通知示例如下:

标题

内容

示例

签到确认通知

{{first.DATA}}

职位名称:{{keyword1.DATA}}

工作地点:{{keyword2.DATA}}

签到时间:{{keyword3.DATA}}

确认时间:{{keyword4.DATA}}

{{remark.DATA}}

您好,您的签到已被确认。

职位名称:UI设计师

工作地点:西安市莲湖区北大街88号

签到时间:2014年7月21日 08:36

确认时间:2014年7月21日 09:01

快去工作吧,少年。

1.6状态类通知示例如下:

标题

内容

示例

洗衣状态通知

{{first.DATA}}

单号:{{keyword1.DATA}}

日期:{{keyword2.DATA}}

付款状态:{{keyword3.DATA}}

衣物状态:{{keyword4.DATA}}

{{remark.DATA}}

您好,请查看衣物信息

单号:15566666666

日期:2014/5/6

付款状态:已付款

衣物状态:进厂

感谢您的使用

1.7登录提醒类通知示例如下:

标题

内容

示例

账号登录异常提醒

{{first.DATA}}

登录名:{{keyword1.DATA}}

登录城市:{{keyword2.DATA}}

登录时间:{{keyword3.DATA}}

{{remark.DATA}}

您好,您的账号于电脑端登录。异地登陆,账户异常

登录名:蓝海xx物流

登录城市:山东

登录时间:2014-07-23 13:20

请核查使用情况,注意账户安全

2.1.1话费类通知示例如下:

标题

内容

示例

实时话费扣款通知

{{first.DATA}}

关联号码:{{keyword1.DATA}}

实时话费:{{keyword2.DATA}}

扣款结果:{{keyword3.DATA}}

{{remark.DATA}}

尊敬的用户:14年8月8日,现对您本月的实时话费进行扣取:

关联号码:180XXXXXXXX

实时话费:15.26元

扣款结果:成功

您的实时话费已经扣款成功,详情请单击查阅!

2.1.2水电燃气费类通知示例如下:

标题

内容

示例

水费缴纳出票提醒

{{first.DATA}}

客户编码:{{keyword1.DATA}}

缴费时间:{{keyword2.DATA}}

发票号码:{{keyword3.DATA}}

{{remark.DATA}}

尊敬的用户,您最近用过微信缴的水费现已出票,信息如下:

客户编码:4080182

缴费时间:2015-03-13 16:53:05

发票号码:40889811

我们将为您保存此票7天。如需要,请至我公司营业厅索取。

2.1.3物业费类通知示例如下:

标题

内容

示例

物业费缴费提醒

{{first.DATA}}

 

业主姓名:{{userName.DATA}}

地址:{{address.DATA}}

物业费金额:{{pay.DATA}}

{{remark.DATA}}

您好,您本月物业费已出。

 

业主姓名:邹某某

地址:丽景华庭A栋508

物业费金额:50元

请尽快缴纳,如有疑问,请咨询134545646。

2.2.1故障类通知示例如下:

标题

内容

示例

故障通报通知

{{first.DATA}}

 

故障现象:{{performance.DATA}}

故障时间:{{time.DATA}}

{{remark.DATA}}

请注意!

 

故障现象:BSS系统无法正常查询免费资源

故障时间:2013-11-21下午

请后台人员相互转告,谢谢!

2.2.2警示警告类通知示例如下:

标题

内容

示例

设备告警通知

{{first.DATA}}

设备号:{{keyword1.DATA}}

发生时间:{{keyword2.DATA}}

商户名字:{{keyword3.DATA}}

设备地址:{{keyword4.DATA}}

{{remark.DATA}}

您好,你归属的设备出现问题

设备号:00180501778C

发生时间:2014年8月29日 11:36

商户名字:某商户XXX店

设备地址:XXX路

请尽快处理!

2.2.3到期提醒类通知示例如下:

标题

内容

示例

汽车质保到期提醒

{{first.DATA}}

到期日期:{{keynote1.DATA}}

购车日期:{{keynote2.DATA}}

质保期:{{keynote3.DATA}}

{{remark.DATA}}

尊敬的李大嘴,您车牌为粤A8888的汽车还有一个月到质保期。

到期时间:2014年5月12日

购车日期:2013年11月12日

质保期:6个月

建议您抽时间到本店做一次全盘检查

服务热线:0755-82914986

2.2.4缴费提醒类通知示例如下:

标题

内容

示例

缴费提醒

{{first.DATA}}

医生:{{keyword1.DATA}}

类型:{{keyword2.DATA}}

应缴:{{keyword3.DATA}}

时间:{{keyword4.DATA}}

交易号:{{keyword5.DATA}}

{{remark.DATA}}

X,您好,您的咨询订单已生成

医生:李X

类型:电话咨询

应缴:200元

时间:2015年4月3日 14:12

交易号:2015040314120001

请尊重医生的劳动,信守承诺,及时付款。

2.2.5会议提醒类通知示例如下:

标题

内容

示例

会议提醒

{{first.DATA}}

会议主题:{{Topic.DATA}}

会议时间:{{Time.DATA}}

会议地点:{{Address.DATA}}

{{remark.DATA}}

X,您有一条会议提醒:

会议主题:XXX项目启动会

会议时间:2014年1月16日14时

会议地点:905会议室

请点击查看!

2.2.6赛事提醒类通知示例如下:

标题

内容

示例

参赛提醒

{{first.DATA}}

参赛队伍:{{keyword1.DATA}}

比赛时间:{{keyword2.DATA}}

比赛地点:{{keyword3.DATA}}

已报名人数:{{keyword4.DATA}}

{{remark.DATA}}

你已经成功报名a队 vs b队的比赛!

参赛队伍:a队 vs b队

比赛时间:2月28日16:00-18:00

比赛地点:c区15号

已报名人数:a队8人,b队6人

请点击查看比赛详情

2.2.7发车提醒类通知示例如下:

标题

内容

示例

班次发车提醒

{{first.DATA}}

班次线路:{{keyword1.DATA}}

发车时间:{{keyword2.DATA}}

{{remark.DATA}}

您好,您乘坐的班车还有2小时就要发车了!

班次线路:珠海香洲(PAS001)

发车时间:2014-10-10 10:10

温馨提示:查看详情可以获取二维码,凭二维码可检票进站乘车。

2.2.8航班延误提醒类通知示例如下:

标题

内容

示例

航班延误通知

{{first.DATA}}

航班:{{trainNumber.DATA}}

发到站:{{fromto.DATA}}

原起飞时间:{{formerTime.DATA}}

预计起飞时间:{{Time.DATA}}

延误时间:{{number.DATA}}

延误原因:{{reason.DATA}}

{{remark.DATA}}

您好,您乘坐的航班因故延误。

航班:T1823航班

发到站:上海—北京

原起飞时间:2013年10月03日 19:00

预计起飞时间:2013年10月03日 19:40

延误时间:40分钟

延误原因:天气原因

敬请留意我们的微信通知及机场广播。

2.2.9待办任务提醒类通知示例如下:

标题

内容

示例

待办任务提醒

{{first.DATA}}

待办内容:{{keyword1.DATA}}

时间:{{keyword2.DATA}}

地点:{{keyword3.DATA}}

{{remark.DATA}}

您好,有待办事件需处理如下

待办内容:XXX

时间:XX月XX日

地点:XXX

希望您尽快处理

3.1审核结果类通知示例如下:

标题

内容

示例

企业审核结果通知

{{first.DATA}}

账号:{{keyword1.DATA}}

企业名称:{{keyword2.DATA}}

备注:{{keyword3.DATA}}

{{remark.DATA}}

您的企业资料审核通过

账号:Q某某某

企业名称:肯德基

备注:资料齐全

马上开始使用吧

3.2退款结果类通知示例如下:

标题

内容

示例

退款结果通知

{{first.DATA}}

店铺名称:{{storeName.DATA}} 

订单编号:{{orderId.DATA}}

订单类型:{{orderType.DATA}}

{{remark.DATA}}

您的订单1002 已退款成功。

店铺名称:示例餐厅 

订单编号:1002

订单类型:外卖

订单金额:100.00元

3.3投标结果类通知示例如下:

标题

内容

示例

投标结果通知

{{first.DATA}}

项目编号:{{keyword1.DATA}}

投标结果:{{keyword2.DATA}}

{{remark.DATA}}

您好,您投资的借款项目

项目编号:FZC20382002

投标结果:已满标

请关注项目进展。

3.4订单受理结果类通知示例如下:

标题

内容

示例

订单受理通知

{{first.DATA}}

配送门市:{{keyword1.DATA}}

受理时间:{{keyword2.DATA}}

{{remark.DATA}}

您好,您的订单已受理

配送门市:大运城邦01配送点

受理时间:2015年1月1日 15:30

感谢您的使用。

3.5报名结果类通知示例如下:

标题

内容

示例

报名结果通知

{{first.DATA}}

姓名:{{keyword1.DATA}}

电话:{{keyword2.DATA}}

时间:{{keyword3.DATA}}

内容:{{keyword4.DATA}}

{{remark.DATA}}

你好,你申请参加活动报名成功。

姓名:张三

电话:13333333333

时间:2015-05-08 10:54:10

内容:你选择的是足球队员

感谢您 的使用,祝你生活愉快!

3.6反馈结果类通知示例如下:

标题

内容

示例

简历反馈提醒

{{first.DATA}}

公司名:{{company.DATA}}

投递时间:{{time.DATA}}

反馈结果:{{result.DATA}}     {{remark.DATA}}

您好!您投递的简历有新的反馈

公司名:北京58同城信息技术有限公司

投递时间:2014-06-24

职位名称:产品经理

反馈结果:已查看


参考我的博客

我的微信公众号:my528xx

公众号二维码:

2017-03-08 22:03:49 frankcheng5143 阅读数 14611

模板消息仅用于公众号向用户发送重要的服务通知,只能用于符合其要求的服务场景中,如信用卡刷卡通知,商品购买成功通知等。不支持广告等营销类消息以及其它所有可能对用户造成骚扰的消息。

要开发模版消息,总共分以下几部

1 设置所属行业

也就是发送的模版消息属于什么行业,比如购买通知,提醒通知,缴费通知等,主要是为了及时通知用户。

这里写图片描述

这里写图片描述

这里写图片描述

第一步就是选择自己推送的消息属于什么行业的消息

接口调用请求说明

http请求方式: POST
https://api.weixin.qq.com/cgi-bin/template/api_set_industry?access_token=ACCESS_TOKEN

POST数据说明

  {
      "industry_id1":"1",
      "industry_id2":"4"
  }
参数 是否必须 说明
industry_id1 公众号模板消息所属行业编号
industry_id2 公众号模板消息所属行业编号

模版消息行业代码查询

效果

这里写图片描述

2 添加模版消息

这里写图片描述

模版标题和模版内容

这里写图片描述

模版内容如下

{{first.DATA}}
订单商品:{{keyword1.DATA}}
订单编号:{{keyword2.DATA}}
支付金额:{{keyword3.DATA}}
支付时间:{{keyword4.DATA}}
{{remark.DATA}}

添加模版消息之后就可以看到模板ID,这个模版ID在发送消息的时候会用到。

这里写图片描述

发送模版消息

接口地址

http请求方式: POST
https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=ACCESS_TOKEN

提交json如下

     {
          "touser":"要发送用户的openid",
          "template_id":"DIW1KiYcwpH2wzJkeYe-jZr7kjsKND8sDSc362iQ0wU",
          "url":"点击模版消息跳转的地址",            
          "data":{
                  "first": {
                      "value":"您好,您的签到已被确认。\n",
                      "color":"#173177"
                  },
                  "keyword1":{
                      "value":"程高伟",
                      "color":"#173177"
                  },
                  "keyword2": {
                      "value":"15300000000",
                      "color":"#173177"
                  },
                  "keyword3": {
                      "value":"陕西师范大学",
                      "color":"#173177"
                  },
                   "keyword4": {
                      "value":"2017年3月8日",
                      "color":"#173177"
                  },
                  "remark":{
                      "value":"快去学习吧,少年!",
                      "color":"#173177"
                  }
          }
      }

效果预览

这里写图片描述

参考文献

模版接口地址

2018-11-10 11:08:37 zhuzhezhuzhe1 阅读数 58094

在我们做微信公众号开发时,发送模板消息往往是必不可少的功能。今天我们就来说说吧!

1、申请模板消息

首先我们应该知道,模板消息是需要申请的。这个申请就其本身来说是很easy的(我前一天晚上申请的,显示需要2--3个工作日,结果第二天早上就发现已经开通了,所以说腾讯官方还是比较给力的哈)。

但是我们在申请时还是有一些东西要注意,这个在官方的文档有非常详细的说明。

这个我建议你好好看看。选择行业的时候可要谨慎些,因为这个一个月只可以修改一次。

那么,我们来看看在哪里申请?

这里我已经申请过了。

申请之后就耐心等待,审核通过之后再功能这一栏里就会出现模板消息的菜单。你可以看看我上面的截图,就在第三项。

2、添加模板消息

审核通过之后,我们就可以添加模板消息,进行开发了。

这个很简单:

我们点击模板消息进入后,直接在模板库中选择你需要的消息模板添加就可以了,添加之后就会在我的模板中。会有一个模板id,这个模板id在我们发送消息的时候会用到。

3、消息发送功能开发

接下来我们就看看如何发送模板消息:

这个是官方文档:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1433751277

我呢,也来说说我的实现吧。为了更方便,我会直接将相关代码贴出来。

文档中我们可以看到接口地址如下:

http请求方式: POST
https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=ACCESS_TOKEN

这里我们首先需要的就是access_token了,这个在这里就不多说了。通过你的appid和secret就可以获取。

【获取access_token : https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140183

关于相关参数,我直接就将官方文档贴来了(文档写的很清楚):

POST数据示例如下:

      {
           "touser":"OPENID",
           "template_id":"ngqIpbwh8bUfcSsECmogfXcV14J0tQlEpBO27izEYtY",
           "url":"http://weixin.qq.com/download",  
           "miniprogram":{
             "appid":"xiaochengxuappid12345",
             "pagepath":"index?foo=bar"
           },          
           "data":{
                   "first": {
                       "value":"恭喜你购买成功!",
                       "color":"#173177"
                   },
                   "keyword1":{
                       "value":"巧克力",
                       "color":"#173177"
                   },
                   "keyword2": {
                       "value":"39.8元",
                       "color":"#173177"
                   },
                   "keyword3": {
                       "value":"2014年9月22日",
                       "color":"#173177"
                   },
                   "remark":{
                       "value":"欢迎再次购买!",
                       "color":"#173177"
                   }
           }
       }

参数说明

参数 是否必填 说明
touser 接收者openid
template_id 模板ID
url 模板跳转链接(海外帐号没有跳转能力)
miniprogram 跳小程序所需数据,不需跳小程序可不用传该数据
appid 所需跳转到的小程序appid(该小程序appid必须与发模板消息的公众号是绑定关联关系,暂不支持小游戏)
pagepath 所需跳转到小程序的具体页面路径,支持带参数,(示例index?foo=bar),暂不支持小游戏
data 模板数据
color 模板内容字体颜色,不填默认为黑色

注:url和miniprogram都是非必填字段,若都不传则模板无跳转;若都传,会优先跳转至小程序。开发者可根据实际需要选择其中一种跳转方式即可。当用户的微信客户端版本不支持跳小程序时,将会跳转至url。

返回码说明

在调用模板消息接口后,会返回JSON数据包。正常时的返回JSON数据包示例:

    {
           "errcode":0,
           "errmsg":"ok",
           "msgid":200228332
       }

相信看完以上文档,基本上没有什么问题了。

以下是我的部分代码:

// 获取token
        String token = saveAndFlushAccessTokenUtil.getToken();

        String postUrl = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + token;

        JSONObject jsonObject = new JSONObject();
        jsonObject.put("touser", "发送到用户的openid");   // openid
        jsonObject.put("template_id", "你的模板id");
        jsonObject.put("url", "http://www.baidu.com");

        JSONObject data = new JSONObject();
        JSONObject first = new JSONObject();
        first.put("value", "hello");
        first.put("color", "#173177");
        JSONObject keyword1 = new JSONObject();
        keyword1.put("value", "hello");
        keyword1.put("color", "#173177");
        JSONObject keyword2 = new JSONObject();
        keyword2.put("value", "hello");
        keyword2.put("color", "#173177");
        JSONObject keyword3 = new JSONObject();
        keyword3.put("value", "hello");
        keyword3.put("color", "#173177");
        JSONObject remark = new JSONObject();
        remark.put("value", "hello");
        remark.put("color", "#173177");
        
        data.put("first",first);
        data.put("keyword1",keyword1);
        data.put("keyword2",keyword2);
        data.put("keyword3",keyword3);
        data.put("remark",remark);

        jsonObject.put("data", data);

        String string = HttpClientUtils.sendPostJsonStr(postUrl, jsonObject.toJSONString());
        JSONObject result = JSON.parseObject(string);
        int errcode = result.getIntValue("errcode");
        if(errcode == 0){
            // 发送成功
            System.out.println("发送成功");
        } else {
            // 发送失败
            System.out.println("发送失败");
        }

下面是http请求工具类:

package car.repair.common.util;

import lombok.extern.slf4j.Slf4j;
import org.apache.http.HttpEntity;
import org.apache.http.ParseException;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;

import java.io.IOException;

/**
 * @author zhuzhe
 * @date 2017/12/11
 * HttpClient工具类
 */
@Slf4j
public class HttpClientUtils {

    /**
     * 以jsonString形式发送HttpPost的Json请求,String形式返回响应结果
     *
     * @param url
     * @param jsonString
     * @return
     */
    public static String sendPostJsonStr(String url, String jsonString) throws IOException {
        if (jsonString == null || jsonString.isEmpty()) {
            return sendPost(url);
        }
        String resp = "";
        StringEntity entityStr = new StringEntity(jsonString,
                ContentType.create("text/plain", "UTF-8"));
        CloseableHttpClient httpClient = HttpClients.createDefault();
        HttpPost httpPost = new HttpPost(url);
        httpPost.setEntity(entityStr);
        CloseableHttpResponse response = null;
        try {
            response = httpClient.execute(httpPost);
            HttpEntity entity = response.getEntity();
            resp = EntityUtils.toString(entity, "UTF-8");
            EntityUtils.consume(entity);
        } catch (ClientProtocolException e) {
            log.error(e.getMessage());
        } catch (IOException e) {
            log.error(e.getMessage());
        } finally {
            if (response != null) {
                try {
                    response.close();
                } catch (IOException e) {
                    log.error(e.getMessage());
                }
            }
        }
        if (resp == null || resp.equals("")) {
            return "";
        }
        return resp;
    }

    /**
     * 发送不带参数的HttpPost请求
     *
     * @param url
     * @return
     */
    public static String sendPost(String url) throws IOException {
        // 1.获得一个httpclient对象
        CloseableHttpClient httpclient = HttpClients.createDefault();
        // 2.生成一个post请求
        HttpPost httppost = new HttpPost(url);
        CloseableHttpResponse response = null;
        try {
            // 3.执行get请求并返回结果
            response = httpclient.execute(httppost);
        } catch (IOException e) {
            log.error(e.getMessage());
        }
        // 4.处理结果,这里将结果返回为字符串
        HttpEntity entity = response.getEntity();
        String result = null;
        try {
            result = EntityUtils.toString(entity);
        } catch (ParseException | IOException e) {
            log.error(e.getMessage());
        }
        return result;
    }
}

 

收到消息,我就不自己弄图了。这里附上官方图片一张:

 

转载请务必保留此出处(原作者):https://blog.csdn.net/zhuzhezhuzhe1/article/details/83927016

 

版权声明:本文为原创文章,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。

https://blog.csdn.net/zhuzhezhuzhe1

 

2015-01-04 20:04:29 xiangyong882000 阅读数 601

微信最近开发模板消息接口,认证过的公众账号 可以申请该模板消息 用于用户在支付成功等等场景下给予用户 提示.

  1. 从腾讯提供的消息模板中添加到我的模板中

    添加成功后可以看到模板ID 点击详情 可以查询该模板的具体数据格式

    可以查看到该模板消息的 详细内容,也就是发送的数据格式

2.查看模板消息文档 提交方式依然为 JSON格式 POST请求URL地址 具体代码如下:

function curlGet($url,$method='get',$data=''){
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, strtoupper($method));
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
    curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (compatible; MSIE 5.01; Windows NT 5.0)');
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
    curl_setopt($ch, CURLOPT_AUTOREFERER, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    $temp = curl_exec($ch);
    return $temp;
}


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

$json = '{
"touser":"Openid", //用户Openid
"template_id":"TEMPLATE_ID", //模板消息ID
"url":"", //留空IOS点击显示空白 Android 无法点击 非空跳转至该URL
"topcolor":"#FF0000",
"data":{
    "first": {
    "value":"黄先生",
    "color":"yellow"
    },
    "product":{
    "value":"乐事薯片",
    "color":"pink"
    },
    "price":{
    "value":"4元",
    "color":"#173177"
    },
    "time":{
    "value":"2013年9月10日",
    "color":"#173177"
    },
    "remark":{
    "value":"祝您生活愉快!",
    "color":"#173177"
    }
}

}';

$res = curlGet($url,'post',$json);
var_dump($res);

注意: JSON格式数据 要与模板消息的中的数据格式保持一致,即

{{first.DATA}} ----- >"first": {"value":"黄先生","color":"yellow"},

发送消息成功失败返回的数据格式 见微信开发文档全局返回码说明