微信公众号开发——向指定用户发送模板消息

😊 @ 作者: 一恍过去
🎊 @ 社区: Java技术栈交流
🎉 @ 主题: 微信公众号开发——向指定用户发送模板消息
⏱️ @ 创作时间: 2022年12月14日

在这里插入图片描述

准备工作

1、调用微信公众号接口,需要实现获取AccessToken,参考《获取AccessToken接口调用凭据》
2、在本地进行联调时,为让微信端能够访问到本地服务,需要进行内网穿透,参考《本地服务器内网穿透实现(NATAPP)》
3、配置微信接口配置信息,用于告诉微信接收消息的回调地址
在这里插入图片描述

1、定义消息模板

微信公众号定义消息模板是指在微信公众平台上,公众号可以预先定义一些消息模板,用于向用户发送特定类型的消息。这些消息模板可以包含固定的文本内容和可替换的变量,用于个性化地向用户发送消息。

在定义消息模板时,公众号需要提供模板标题、模板关键词(用于辅助公众号管理)、模板内容和模板示例。

  • 模板标题:给模板起一个简洁明了的标题,用于在发送消息时进行区分和选择。
  • 模板关键词:为模板设置关键词,方便公众号管理员进行分类和管理。
  • 模板内容:在模板中可以设置固定的文本内容,同时使用变量来指定可替换的部分。变量使用双花括号{{}}包裹,例如{{first.DATA}}、{{keyword1.DATA}}等。这些变量将在实际发送消息时根据具体情况进行替换。

比如新增一个用于订单的模板消息:

在这里插入图片描述

订单编号:{{orderId.DATA}} 订单金额:{{amount.DATA}} 订单时间:{{time.DATA}}

2、定义模板消息发送请求实体类

SendMessageRep:

@EqualsAndHashCode(callSuper = true)
@Data
public class SendMessageRep extends BaseRep {
    /**
     * 接收者openid
     */
    private String touser;

    /**
     * 模板ID
     */
    private String template_id;

    /**
     * 模板跳转链接(海外帐号没有跳转能力),非必须
     */
    private String url;

    /**
     * 防重入id。对于同一个openid + client_msg_id, 只发送一条消息,10分钟有效,超过10分钟不保证效果。若无防重入需求,可不填
     */
    private String client_msg_id;

    /**
     * 跳小程序所需数据,不需跳小程序可不用传该数据,非必须
     */
    private Miniprogram miniprogram;

    /**
     * 模板数据
     */
    private OrderMessageDataRep data;

    /**
     * 跳小程序所需数据
     */
    @Data
    public class Miniprogram {
        /**
         * 所需跳转到的小程序appid(该小程序 appid 必须与发模板消息的公众号是绑定关联关系,暂不支持小游戏)
         */
        private String appid;

        /**
         * 所需跳转到小程序的具体页面路径,支持带参数,(示例index?foo=bar),要求该小程序已发布,暂不支持小游戏,非必须
         */
        private String pagepath;
    }
}

SendMessageDataRep:

@Data
public class SendMessageDataRep {
    /**
     * 模板数据
     */
    private String value;

    /**
     * 模板内容字体颜色,不填默认为黑色
     */
    private String color;
}

在这里插入图片描述

3、定义订单模板消息实体雷

业务实体类需要根据实际清情况进行定义

OrderMessageDataRep:

/**
 * @Description: 推送的订单数据,模板消息,具体字段根据定义的模块来设置
 * 订单编号:{{orderId.DATA}} 订单金额:{{amount.DATA}} 订单时间:{{time.DATA}}
 **/
@Data
public class OrderMessageDataRep {
    /**
     * 订单编号
     */
    private SendMessageDataRep orderId;

    /**
     * 订单金额
     */
    private SendMessageDataRep amount;

    /**
     * 订单时间
     */
    private SendMessageDataRep time;
}

4、配置RestTemplate请求

@Component
public class RestHttpRequest {

    private final RestTemplate restTemplate;

    public RestHttpRequest(RestTemplate restTemplate) {
        this.restTemplate = restTemplate;
    }
    
    public Map doHttp(String url, HttpMethod method, Object obj) {
        HttpHeaders headers = new HttpHeaders();
        HttpEntity entity = new HttpEntity(obj, headers);
        ResponseEntity<Map> exchange = restTemplate.exchange(url, method, entity, Map.class);
        return exchange.getBody();
    }
}

5、请求工具类

public class MapUtils {
    /**
     * 将Map参数转换为字符串
     *
     * @param map
     * @return
     */
    public static String mapToString(Map<String, Object> map) {
        StringBuffer sb = new StringBuffer();
        map.forEach((key, value) -> {
            sb.append(key).append("=").append(value.toString()).append("&");
        });
        String str = sb.toString();
        str = str.substring(0, str.length() - 1);
        return str;
    }

    /**
     * 将Bean对象转换Url请求的字符串
     *
     * @param t
     * @param <T>
     * @return
     */
    public static <T> String getUrlByBean(T t) {
        String pre = "?";
        Map<String, Object> map = entityToMap(t);
        return pre + mapToString(map);
    }
}

6、发送模板消息示例

说明:

//测试接口:/wechat/sendMsg(向指定用户发送模板消息)
//正常流程:用户在公众号进行操作(购物成功)后,向当前用户发送模板消息
//消息模板的定义如下:其中DATA为固定写法
订单编号:{{orderId.DATA}}
订单金额:{{amount.DATA}}
订单时间:{{time.DATA}}
//在推送完成后,微信服务器会向消息接口发送消息
//orderId、amount、time表示一个属性(名称任意),value为该属性的值,color为显示时的颜色
{	
           "touser":"OPENID",
           "template_id":"ngqIpbwh8bUfcSsECmogfXcV14J0tQlEpBO27izEYtY",
           "url":"http://weixin.qq.com/download",       
           "data":{
                   "orderId": {
                       "value":"xxxxxxxxxx",
                       "color":"#173177"
                   },
					"amount": {
                       "value":"33.33元",
                       "color":"#F6067A"
                   },
					"time": {
                       "value":"2022-12-12 12:12:12",
                       "color":"#FF6931"
                   }
           }
}

示例代码 :

@Slf4j
@Controller
public class MessageController {
    /**
     * 发送模板消息
     * url和 miniprogram 都是非必填字段,若都不传则模板无跳转;
     * 若都传,会优先跳转至小程序。开发者可根据实际需要选择其中一种跳转方式即可。
     * 当用户的微信客户端版本不支持跳小程序时,将会跳转至url。
     */
    @PostMapping(value = "/sendMsg")
    @ApiOperation(value = "发送模板消息", notes = "发送模板消息")
    @ResponseBody
    public Map sendMsg() {
        String url = wxBean.getApiUrl() + InterfaceConstant.SEND_MSG;
        SendMessageRep rep = new SendMessageRep();
        rep.setAccess_token(weChantService.getAccessToken());
        url = url + MapUtils.getUrlByBean(rep);
        rep.setTouser("推送给具体用户的openId");
        rep.setTemplate_id("定义的模板Id");
        rep.setUrl("http://weixin.qq.com");
        rep.setClient_msg_id(UUIDUtils.getUuId());
        OrderMessageDataRep orderMessage = new OrderMessageDataRep();
        // 封装模板数据
        SendMessageDataRep orderId = new SendMessageDataRep();
        orderId.setValue(String.valueOf(System.currentTimeMillis()));
        orderId.setColor("#173177");
        orderMessage.setOrderId(orderId);
        SendMessageDataRep amount = new SendMessageDataRep();
        amount.setValue("3.33");
        amount.setColor("#F6067A");
        orderMessage.setAmount(amount);
        SendMessageDataRep time = new SendMessageDataRep();
        time.setValue("2022-12-12 12:12:12");
        time.setColor("#FF6931");
        orderMessage.setTime(time);
        rep.setData(orderMessage);
        return restHttpRequest.doHttp(url, HttpMethod.POST, rep);
    }
}

在这里插入图片描述

  • 1
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: Java微信公众号定时发送消息模板通常分为两部分: 第一部分是实现Wechat API与Java后端的通信。Wechat API是微信提供的接口,可以让我们通过Java代码与微信公众号进行交互。具体来说,我们需要在Java中通过HTTP或HTTPS协议发送请求,获取微信公众号的access_token,再通过access_token来进行后续的操作,例如:获取用户消息发送消息、创建菜单等等。Java中可以使用Apache HttpClient或OkHttp等库来发送HTTP请求,拿到接口返回的JSON数据。 第二部分是实现定时发送消息。Java中可以使用Quartz框架用于实现定时任务。Quartz是一个开源的作业调度框架,可以用于在指定时间执行任务。我们可以利用Quartz提供的API,创建一个定时任务,定期调用我们的后端Java代码发送微信公众号消息。在定时任务的实现中,我们需要考虑任务的频率、执行时间、失败策略等问题。 当以上两部分都实现以后,我们就可以在Java后端实现微信公众号定时发送消息的功能了。具体来说,我们需要将发送消息的代码放到定时任务中,指定发送消息内容,以及要发送给的用户。然后启动定时任务即可,Java后端会自动按照设定的规则发送微信公众号消息。 值得注意的是,微信官方文档要求所有公众号对接的应用都必须是官方认证的,所以在实现这个功能之前,我们需要先将我们的应用向微信官方申请认证,获得相应的API调用权限。 ### 回答2: Java微信公众号定时发送消息模板是一种利用Java语言实现的微信公众平台的定时发送消息模板。该模板可以帮助微信公众号上的管理员在指定时间点自动发送指定消息,从而提高工作效率和用户体验。 实现Java微信公众号定时发送消息模板的关键是使用了微信公众平台提供的接口。这些接口可以通过Java语言进行调用,从而实现向微信公众号发送消息、设置菜单、自动回复、素材管理、用户管理等功能。在定时发送消息模板中,我们需要利用这些接口设置定时任务,并在指定时间点调用接口发送消息。 具体实现过程如下: 1. 首先需要在微信公众平台上申请开发者账号,并获取相应的开发者ID、开发者密码和Token。 2. 在Java中使用微信公众平台提供的SDK调用相关接口,实现发送消息、设置菜单、自动回复等功能。 3. 利用Java中的定时任务框架,如Quartz、Spring定时任务等,在指定的时间点调用相应的微信接口实现定时发送消息。 4. 利用Java中的模板功能,以标准化的格式组织需要发送消息内容,使消息具有可读性和易管理性。 需要注意的是,为了避免被微信公众平台封禁账号,我们需要遵循微信公众平台的相关规定,比如定时发送消息不能含有敏感词汇、不能频繁发送等。另外,定时发送的频次也需要控制在一定范围内,避免对用户造成困扰。 总之,Java微信公众号定时发送消息模板是一种非常实用的工具,可以帮助管理员提高工作效率和用户体验。但实现过程需要注意一些细节和规范,确保操作的合法性和安全性。 ### 回答3: Java微信公众号定时发送消息模板是指利用Java编程语言实现微信公众号定时发送消息功能,并且提供了消息模板方便开发者进行二次开发。这个模板主要包含以下几个方面: 一、微信公众号接入 首先,需要在微信公众号后台注册并获取开发者ID和开发者密钥,然后使用Java框架接入微信公众号开放平台。接入之后,就可以使用微信公众号提供的API实现发送消息功能。 二、定时任务 接下来,需要编写Java代码实现定时任务功能。Java提供了Timer和TimerTask类可以很方便地实现定时任务功能。开发者可以选择设定每日,周,月等不同的定时任务。 三、发送消息 定时任务设置好后,需要编写Java代码实现发送消息的功能。这个功能可以通过调用微信公众号提供的API来实现。消息发送可以以文本消息,图文消息,视频消息等不同的形式呈现。 四、编写消息模板 最后,为了让开发者方便使用,我们需要编写一个消息模板来进行二次开发消息模板可以包含以下几个方面:微信公众号接入的配置信息、定时任务的配置信息、发送消息的配置信息,以及发送消息的实现方法等。这个模板可以让开发者快速地实现微信公众号定时发送消息的功能。 通过这个模板开发者可以很方便地搭建起微信公众号定时发送消息的系统,从而可以提高服务的质量和用户体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一恍过去

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值