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

😊 @ 作者: 一恍过去
🎊 @ 社区: 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);
    }
}

在这里插入图片描述

### 如何在微信公众号中设置和使用模板消息 #### 获取必要的配置参数 为了能够成功发送模板消息开发者需要提前准备好一些基本的配置项。这些配置项包括`appid`、`appsecret`、`token`以及`asekey`等基础安全验证信息[^2]。 #### 获取用户的OpenID 当涉及到向特定用户推送通知时,则还需要知道目标接收者的唯一标识符——即OpenID。通常情况下,在用户首次关注并授权给公众号之后便可以获得此值;对于调试目的而言,也可以通过访问服务号管理界面下的用户列表来手动查找所需的OpenID[^3]。 #### 创建自定义模板或选用预设样式 微信公众平台提供了多种行业专属的消息模版供选择,同时也允许创建个性化的消息格式以满足不同场景的需求。一旦决定了要使用的具体形式后,就应当记录下对应的`template_id`以便后续调用[^1]。 #### 发送模板消息 最后一步便是实际执行发送操作了。这可以通过调用微信提供的API接口实现,下面给出了一段简单的Python代码示例用于展示如何构建这样一个请求: ```python import requests import json def send_template_message(access_token, openid, template_id): url = f"https://api.weixin.qq.com/cgi-bin/message/template/send?access_token={access_token}" data = { "touser": openid, "template_id": template_id, "url": "", # 可选字段:点击后的跳转链接 "miniprogram": { "appid":"", # 小程序 App ID (可为空) "pagepath":"" # 跳转到小程序路径(可为空) }, "data":{ # 自定义数据部分 "first": { "value":"您好", "color":"#0000FF" } } } response = requests.post(url=url,json=data).json() return response ``` 上述函数接受三个必需参数:`access_token`(用于身份认证),`openid`(收件人的唯一识别码) 和 `template_id`(所选模板的信息编号)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

一恍过去

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

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

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

打赏作者

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

抵扣说明:

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

余额充值