欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

手把手教学java微信公众号模版消息开发

程序员文章站 2024-01-08 13:22:46
...

前言:最初接触的时候也是一头雾水,微信的接口文档看也看不懂,最后还是百度了一段时间才出来的结果,觉得网上有些文章还是没有说清除如何简单快捷的做出这个模版,所以我自己整理了一下自己写模版的经验,废话不多说,开始!

具体流程: 其实说起来具体流程还是挺简单的,主要就是微信创建好模版后,java代码使用模版id,推送的用户的openid,还有符合推送的对象发送微信一个post就可以了.博主还是菜鸟,所以写的不好的地方多多指教,下面具体解释:

  1. 微信access_token:
    不懂的先去百度下哈,度娘伟大!简单的说就是获取用户信息,等一些高级点的功能都需要用到token如果已经知道怎么获取的或者是项目中自带的小伙伴那就略过吧…这个主要是有效时间2小时,我这里做了一个定时任务自动在过期前重新获取
    appid和appsecret都是创建公众号必须的,这里也不多说.
    我的项目使用的是spring注解,只要在配置文件里面配置:
    手把手教学java微信公众号模版消息开发

手把手教学java微信公众号模版消息开发

这边因为上面配过lazy,所以使用的bean类中必须加上@lazy(false)取消懒加载

@Scheduled(fixedRate = 6900000L, initialDelay = 1000L)
    public void getWeChatAccessToken() {
        String url = "https://api.weixin.qq.com/cgi-bin/token";
        String result = Http.sendPost(url,"&grant_type=client_credential&appid="+wechatConfig.getAppid()+"&secret="+wechatConfig.getAppSecret());
        Map<Object, Object> map = JsonUtils.toMap(result);
        Object o = map.get("access_token");
        if(o != null && o instanceof String){
            WeChatJsonController.ACCESS_TOKEN = (String)o;
        }
    }
  1. 微信中消息模版的创建:
    这个有点我想说,微信接口文档也太简洁了把,我都怀疑我看错了…=-=
    举个例子:
    你写了个模版
我是标题
你好啊: {{message.DATA}}
内容: {{content.DATA}}

java中传入message=哈哈 content = 我是内容哦!

发送模版后是:

我是标题
你好啊:哈哈
内容:我是内容哦!

简单的说就是想要怎么样的模版就写什么样,最重要的是传的对象需要标记{{XX.DATA}}到时候传什么就显示什么,颜色也是后台代码可以控制

  1. java中模版的写法:
    这里我就写了三个实体类,其实最主要的只是返回的对象和官网接口文档里写的一样:
{

    "touser":"OPENID",//要推送的用户对应的openid

    "template_id":"ngqIpbwh8bUfcSsECmogfXcV14J0tQlEpBO27izEYtY",
"url":"http://weixin.qq.com/download",//这个是点击推送消息指向的地址

    "topcolor":"#FF0000",//感觉这个没什么用

    "data":{

            "User": {

                "value":"黄先生",

                "color":"#173177"

            },

            "Date":{

                "value":"06月07日 19时24分",

                "color":"#173177"

            }

    }

}

这样就行了,data里面的元素就看你模版写多少{{}}这种元素了
放上我的代码:

手把手教学java微信公众号模版消息开发

这个是ps做的计划图片,跟着图片确定了五个参数:用户名,商城名,时间,订单号,积分,(还有一个订单总积分没写上 =-= )
跟着写模版

下单成功通知:

您好,{{userName.DATA}}
感谢您在i商城消费商品
购买时间: {{date.DATA}}
订单号为: {{bh.DATA}}
订单总价{{totalIntegral.DATA}}积分
当前您剩余{{leftIntegral.DATA}}积分

因为我是测试公众号,模版是自己创建的,正式的貌似还可以选择已有的模版

手把手教学java微信公众号模版消息开发

WeChatTemplateDataItem类:这个主要是data里面的每一个元素

package com.thinkgem.jeesite.modules.busi.kehu.entity;

import org.apache.commons.lang3.StringUtils;

/**
 * 微信模版消息内容内的元素
 * 
 * @author Z.Bh
 *
 */
public class WeChatTemplateDataItem {

    private String value;

    private String color;

    /**
     * 
     * @param value 设置值
     * @param color 对应显示的颜色,不设置默认空字符串
     */
    public WeChatTemplateDataItem(String value,String color){
        if(!StringUtils.isBlank(value)){
            this.value = value;
        }else{
            this.value = "";
        }
        if(!StringUtils.isBlank(color)){
            this.color = color;
        }else{
            this.color = "#173177";
        }
    }

    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;
    }
}

WeChatTemplateMessage类:这个 就是我们需要转成json对象发送的实体类了

package com.thinkgem.jeesite.modules.busi.kehu.entity;

import java.util.Map;

/**
 * 微信模版消息
 * @author Z.Bh
 *
 */
public class WeChatTemplateMessage {

    private String touser;  //要返回给指定用户的openid

    private String template_id; //模版id

    private String url;     //模版点击的url

    private String topcolor;    //

    private Map<String, Object> data;       //模版内容

    public WeChatTemplateMessage(){
        this.setTopcolor("#FF0000");
    }

    public String getTemplate_id() {
        return template_id;
    }

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

    public String getUrl() {
        return url;
    }

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

    public String getTouser() {
        return touser;
    }

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

    public String getTopcolor() {
        return topcolor;
    }

    public void setTopcolor(String topcolor) {
        this.topcolor = topcolor;
    }

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

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

WeChatMessageTemplate类:消息模版类,主要是看业务需求来写对应的模版,额外加上了发送微信的方法

package com.thinkgem.jeesite.modules.busi.kehu.entity;

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

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.alibaba.fastjson.JSON;
import com.thinkgem.jeesite.common.config.Global;
import com.thinkgem.jeesite.common.utils.Http;
import com.thinkgem.jeesite.common.utils.JsonUtils;
import com.thinkgem.jeesite.modules.busi.JsonInterface.web.WeChatJsonController;

/**
 * 微信模版消息返回类
 * 模版中,对应的颜色必须默认设置好
 * 
 * @author Z.Bh
 *
 */
public class WeChatMessageTemplate {

    private static String  SERVERURL = Global.getConfig("serverurl");//我们服务器的地址

    private static final Logger Log = LoggerFactory.getLogger(WeChatMessageTemplate.class);

    /**
     * 下单成功消息模版
     * @param userName 用户名/昵称
     * @param date  具体时间(XX年xx月xx日 xx时xx分)
     * @param bh    订单编号
     * @param totalIntegral 订单总积分
     * @param leftIntegral  剩余积分
     * @param openId    要推送的微信用户的openid
     * @return
     */
    public static boolean getPlaceAnOrderTemplate(
            String userName,String mallName, String date, String bh, String totalIntegral,
            String leftIntegral,String openId) {
        Map<String, Object> list = new HashMap<String, Object>();
        list.put("userName", new WeChatTemplateDataItem(userName, "#0fae39"));
        list.put("mallName", new WeChatTemplateDataItem(mallName, "#0fae39"));
        list.put("date", new WeChatTemplateDataItem(date, "#323232"));
        list.put("bh", new WeChatTemplateDataItem(bh, "#323232"));
        list.put("totalIntegral", new WeChatTemplateDataItem(totalIntegral, "#ae0f0f"));
        list.put("leftIntegral", new WeChatTemplateDataItem(leftIntegral, "#ae0f0f"));

        WeChatTemplateMessage template = new WeChatTemplateMessage();
        template.setTouser(openId);
        template.setTemplate_id("i9GEaIZdh8WumSBQ-YTlX3jvBRnhtlnzh6Jge38k0HM"); //这个要根据实际使用的模版来设置对应的id
        template.setUrl(SERVERURL+"/garbageCollection/h5/user/order_detail.html?orderNo=" + bh);
        template.setData(list);
        return sendWeChatTemplate(template);//发送并获取结果
    }

    /**
     * 发送微信模版
     * 
     * @param template
     *            包含发送对象的openid,template_id,和必须的内容
     * @return
     */
    public static boolean sendWeChatTemplate(WeChatTemplateMessage template) {
        boolean success = false;
        String requestUrl = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=ACCESS_TOKEN";
        requestUrl = requestUrl.replace("ACCESS_TOKEN",
                WeChatJsonController.ACCESS_TOKEN);
        System.out.println("ACCESS_TOKEN: " + WeChatJsonController.ACCESS_TOKEN);

        String jsonResult = Http.httpsRequest(requestUrl, "POST",
                JSON.toJSONString(template));
        if (jsonResult != null) {
            Map<Object, Object> map = JsonUtils.toMap(jsonResult);
            Object o = map.get("errcode");
            if (o != null && o instanceof Integer) {
                int errorCode = (Integer) o;
                String errorMessage = (String) map.get("errmsg");
                if (errorCode != 0) {
                    Log.error("模板消息发送失败: " + errorMessage + "; template_id:"
                            + template.getTemplate_id());
                } else {
                    success = true;
                }
            }
        }
        return success;
    }
}
  1. 业务中调用:
/**************** 微信公众号消息推送 ******************/
        String leftIntegral = kehuMap.get("jifen");
        String mallName = "i商城";
        String date =new SimpleDateFormat("yyyy年MM月dd日 HH时mm分").format(new Date());
        String userName = kehuMap.get("nikename");
        String bh = orderBh;
        String totalIntegral = totalJifen+"";
        String openId = kehuMap.get("openid");

        if(!StringUtils.isBlank(openId)){ //没有openid无法进行推送
            boolean sendSuccess = WeChatMessageTemplate.getPlaceAnOrderTemplate(userName, mallName, date, bh, totalIntegral, leftIntegral, openId);
            if(!sendSuccess){
                System.out.println("微信推送失败!");
            }
        }

手把手教学java微信公众号模版消息开发

到这里就大功告成了,最主要的还是微信json串的生成还有数据的发送吧,希望可以帮助到你们,好好干!

这里还要感谢一个博客,发送请求的代码是借鉴过来的,哈哈,很不错

http://blog.csdn.net/walkcode/article/details/78147217

后来才发现,测试公众号这方面自定义很好用,但是实际的公众号如果不想用别人的模板,需要自己申请创建模板,很麻烦的。小伙伴们自己申请体会吧 =-= !

上一篇:

下一篇: