ACCESS微信公众号支付《二》发送模板音讯达成音信业务实时通报

前篇小说讲解了怎么样赢得用户微信基本详情,完成微信绑定后活动登录,重播请点击这里:http://www.cnblogs.com/zhaixiajiao/p/6760194.html

本篇小说首要介绍利用上篇作品得到到的微信ID,向已绑定用户发送模板新闻,如大家广阔的消费通知、订单通告等作业都得以用该作用达成。理论知识就不反复强调了,实践是验证真理的唯一标准,直接看例子,相信大家就能看清了。上边我们来看下要未雨绸缪哪个地方步骤:

原创注明:本文为原创文章,绝非他处摘取,转发请联系博主

1.安顿模板

报到测试公众号/正式公众号(认证后的服务号),测试公众号:模板新闻接口->新增测试模板中添加模板,正式公众号:在效益->模板音信中增加模板,模板可以在模板库中精选,尽管没有您需求的沙盘,可以申请添加,3个月能够报名三条。模板添加事业有成后,有个模板ID(用于接口调用)。

切实什么安插能够参见官方文书档案:https://mp.weixin.qq.com/wiki 中国国投息管理->发送新闻-模板新闻接口

2.代码应用呈现

装进发送模板接口

import java.util.Map;
/**
 * 模板基类
 * @author lh
 *
 */
public class WxTemplate {
    private String template_id;//模板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;
    }
}

一条模板包罗多条数据,模板数据类封装

/**
 * 模板数据
 * @author lh
 *
 */
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;
    }
}

看文书档案,发送模板新闻接口为:https://api.weixin.qq.com/cgi-bin/message/template/send?access\_token=ACCESS\_TOKEN,前期模板数据都准备好了,现在缺少ACCESS\_TOKEN,缺什么就去获取什么,查看文档可知获取ACCESS\_TOKEN接口为:https://api.weixin.qq.com/cgi-bin/token?grant\_type=client\_credential&appid=APPID&secret=APPSECRET,现在就封装个获取ACCESS\_TOKEN的请求接口:

public class WeixinUtil {
    private static Logger log = LoggerFactory.getLogger(WeixinUtil.class);
    // 获取access_token的接口地址(GET) 限200(次/天)
    public final static String access_token_url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET";
    /**
     * 获取access_token
     * @param appid 凭证
     * @param appsecret 密钥
     * @return
     */
    public static AccessToken getAccessToken(String appid, String appsecret) {
        AccessToken accessToken = null;
        String requestUrl = access_token_url.replace("APPID", appid).replace("APPSECRET", appsecret);
        JSONObject jsonObject = httpRequest(requestUrl, "GET", null);
        // 如果请求成功
        if (null != jsonObject) {
            try {
                accessToken = new AccessToken();
                accessToken.setToken(jsonObject.getString("access_token"));
                accessToken.setExpiresIn(jsonObject.getInt("expires_in"));
            } catch (JSONException e) {
                accessToken = null;
                // 获取token失败
                log.error("获取token失败 errcode:{} errmsg:{}", jsonObject.getInt("errcode"), jsonObject.getString("errmsg"));
            }
        }
        return accessToken;
    }
}

注意:ACCESS_TOKEN有请求次数限制,而且会在获得后7200秒后活动失效,所以要稳妥保存好ACCESS_TOKEN,本实例是置身内部存款和储蓄器里面,每一回获得时,判断是不是已经存在,不存在才去央浼,而怎么着保险保存的ACCESS_TOKEN为有效的吗?一般化解办法是定时请求获取最新ACCESS_TOKEN,更新内部存款和储蓄器里的数码,可使用线程定时央求、quartz,或然Spring的职务调度功用,下边突显相比较通用的线程方法:

/**
 * 定时获取微信access_token的线程
 */
public class TokenThread implements Runnable {
    private static Logger log = LoggerFactory.getLogger(TokenThread.class);
    // 第三方用户唯一凭证
    public static String appid = "xxx";
    // 第三方用户唯一凭证密钥
    public static String appsecret = "xxxx";
    public static AccessToken accessToken = null;//保存ACCESS_TOKEN到内存

    public void run() {
        while (true) {
            try {
                accessToken = WeixinUtil.getAccessToken(appid, appsecret);
                if(null != accessToken) {
                    log.info("获取access_token成功,有效时长{}秒 token:{}", accessToken.getExpiresIn(), accessToken.getToken());
                    // 休眠7000秒
                    Thread.sleep((accessToken.getExpiresIn() - 200) * 1000);
                }else{
                    // 如果access_token为null,60秒后再获取
                    Thread.sleep(60 * 1000);
                }
            } catch (InterruptedException e) {
                try{
                    Thread.sleep(60 * 1000);
                } catch (InterruptedException e1) {
                    log.error("{}", e1);
                }
                log.error("{}", e);
            }
        }
    }
}

现在ACCESS_TOKEN已经获得,万事俱备,只欠调用了,上边给出发送模板

{{first.DATA}}
订单编号:{{keyword1.DATA}}
订单类型:{{keyword2.DATA}}
商品名称:{{keyword3.DATA}}
{{remark.DATA}}

的求实调用实例:

/**
 * 发送模板消息调用实例
 * @param websiteAndProject 请求地址与工程名:http://192.168.2.113/seafood
 * @param receiverWeixinId  接受者的微信ID,如何获取,可看前一篇文章
 * @return
 */
WxTemplate template = new WxTemplate();
template.setUrl(""+TimedTask.websiteAndProject+"/weixinTwo/gotoOrderConfirm?orderId="+map.get("orderId"));
template.setTouser("receiverWeixinId"));
template.setTopcolor("#000000");
template.setTemplate_id("ai3WcdUjq-x4v0Reir442UCIzl3AsyCgpAy0e5q2mkY");
Map<String,TemplateData> m = new HashMap<String,TemplateData>();
TemplateData first = new TemplateData();
first.setColor("#000000");
first.setValue("您好,您有一条待确认订单。");
m.put("first", first);
TemplateData keyword1 = new TemplateData();
keyword1.setColor("#328392");
keyword1.setValue("OD0001");
m.put("keyword1", keyword1);
TemplateData keyword2 = new TemplateData();
keyword2.setColor("#328392");
keyword2.setValue("预定订单");
m.put("keyword2", keyword2);
TemplateData keyword3 = new TemplateData();
keyword3.setColor("#328392");
keyword3.setValue("大龙虾");
m.put("keyword3", keyword3);
TemplateData remark = new TemplateData();
remark.setColor("#929232");
remark.setValue("请及时确认订单!");
m.put("remark", remark);
WeixinUtil.sendMessageBefore("",template, m);

public class WeixinUtil {
    private static Logger log = LoggerFactory.getLogger(WeixinUtil.class);
    // 获取access_token的接口地址(GET) 限200(次/天)
    public final static String access_token_url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET";
    /**
     * 获取access_token
     * @param appid 凭证
     * @param appsecret 密钥
     * @return
     */
    public static AccessToken getAccessToken(String appid, String appsecret) {
        AccessToken accessToken = null;
        String requestUrl = access_token_url.replace("APPID", appid).replace("APPSECRET", appsecret);
        JSONObject jsonObject = httpRequest(requestUrl, "GET", null);
        // 如果请求成功
        if (null != jsonObject) {
            try {
                accessToken = new AccessToken();
                accessToken.setToken(jsonObject.getString("access_token"));
                accessToken.setExpiresIn(jsonObject.getInt("expires_in"));
            } catch (JSONException e) {
                accessToken = null;
                // 获取token失败
                log.error("获取token失败 errcode:{} errmsg:{}", jsonObject.getInt("errcode"), jsonObject.getString("errmsg"));
            }
        }
        return accessToken;
    }
    /**
     * 发送模板消息前获取token
     * @param template_id_short 模板库中模板的编号
     * @param t
     * @param m
     */
    public static void sendMessageBefore(String template_id_short,WxTemplate t,Map<String,TemplateData> m){
        AccessToken token = null;
        if(TokenThread.accessToken==null || TokenThread.accessToken.getToken()==""){
            token = WeixinUtil.getAccessToken(TokenThread.appid, TokenThread.appsecret);
        }else{
            token = TokenThread.accessToken;
        }
        if(template_id_short!=null&&!"".equals(template_id_short)){
            Template template = WeixinUtil.getTemplate(template_id_short,token.getToken());
            t.setTemplate_id(template.getTemplate_id());
        }
        t.setData(m);
        int result = WeixinUtil.sendMessage(t,token.getToken());
    }
    /**
     * 发送模板消息
     * @param t
     * @param accessToken
     * @return
     */
    public static int sendMessage(WxTemplate t,String accessToken) {
        int result = 0;
        // 拼装创建菜单的url
        String url = sendTemplateMessage_url.replace("ACCESS_TOKEN", accessToken);
        // 将菜单对象转换成json字符串
        String jsonMenu = JSONObject.fromObject(t).toString();
        // 调用接口创建菜单
        JSONObject jsonObject = httpRequest(url, "POST", jsonMenu);
        if (null != jsonObject) {
            if (0 != jsonObject.getInt("errcode")) {
                result = jsonObject.getInt("errcode");
                log.error("发送模板消息失败 errcode:{} errmsg:{}", jsonObject.getInt("errcode"), jsonObject.getString("errmsg"));
            }
        }
        return result;
    }
}

自作者另一博客【http://blog.csdn.net/liaohaojian/article/details/70225367

现今,发送音讯流程已总体做到,如有不足,不解也许更正之处,欢迎我们在评论区建议。

 

相关文章