微信小程序订阅消息推送的前后端实现流程及核心代码示例

一、准备工作

  1. 申请消息模板
    在微信公众平台「订阅消息」功能中申请模板,获取模板ID及字段标识‌。

  2. 配置服务器域名
    在小程序后台设置合法请求域名(如API接口域名和获取access_token的域名)‌。


二、前端实现流程

  1. 获取用户身份标识
    通过uni.loginwx.login获取code,调用接口换取用户openid

uni.login({
  success: res => {
    uni.request({
      url: '后端接口/getOpenid',
      data: { code: res.code }
    });
  }
});

 ‌‌    2. 调起订阅弹窗

使用wx.requestSubscribeMessage触发订阅请求,需传入模板ID列表‌:

wx.requestSubscribeMessage({
  tmplIds: ['模板ID_1', '模板ID_2'],
  success(res) {
    if (res['模板ID_1'] === 'accept') {
      console.log('用户同意订阅');
    }
  }
});

 ‌  3. 提交模板数据
用户触发业务事件(如支付成功)时,向后端发送模板数据‌

data: {
  templateData: {
    thing1: { value: '商品名称' },
    amount3: { value: '100元' }
  }
}

三、后端实现流程

使用 ‌WxMpTemplateMessage‌(基于微信开发工具包 WxJava)发送小程序订阅消息的完整 Java 代码示例如下:

一、依赖引入(Maven)

<dependency>
    <groupId>com.github.binarywang</groupId>
    <artifactId>weixin-java-mp</artifactId>
    <version>4.5.0</version> <!-- 使用最新版本 -->
</dependency>

二、核心代码实现

1. 初始化微信配置

在 Spring Boot 中配置 WxMpService

@Configuration
public class WxMpConfig {
    @Value("${wx.appid}")
    private String appid;
    
    @Value("${wx.secret}")
    private String secret;

    @Bean
    public WxMpService wxMpService() {
        WxMpDefaultConfigImpl config = new WxMpDefaultConfigImpl();
        config.setAppId(appid);
        config.setSecret(secret);
        
        WxMpService service = new WxMpServiceImpl();
        service.setWxMpConfigStorage(config);
        return service;
    }
}
2. 构建订阅消息并发送
@Service
public class SubscribeMessageService {
    @Autowired
    private WxMpService wxMpService;

    /**
     * 发送订阅消息
     * @param openid  用户openid
     * @param templateId 消息模板ID
     * @param dataMap 模板数据(字段名与模板中定义的key对应)
     */
    public void sendSubscribeMessage(String openid, String templateId, Map<String, String> dataMap) {
        try {
            // 1. 构建模板消息对象
            WxMpSubscribeMessage message = WxMpSubscribeMessage.builder()
                .toUser(openid)
                .templateId(templateId)
                .data(dataMap.entrySet().stream()
                    .map(entry -> new WxMpSubscribeMessage.MsgData(entry.getKey(), entry.getValue()))
                    .collect(Collectors.toList()))
                .build();

            // 2. 发送消息
            wxMpService.getSubscribeMsgService().send(message);
            
        } catch (WxErrorException e) {
            // 处理微信接口异常
            log.error("发送订阅消息失败: {}", e.getMessage());
            throw new RuntimeException("消息发送失败");
        }
    }
}
3. 实际调用示例
@RestController
public class MessageController {
    @Autowired
    private SubscribeMessageService messageService;

    @PostMapping("/sendOrderSuccessMsg")
    public String sendOrderSuccessMsg(@RequestParam String openid) {
        // 模板数据(根据模板字段定义)
        Map<String, String> dataMap = new HashMap<>();
        dataMap.put("thing1", "iPhone 15 Pro");  // 对应模板中的字段key
        dataMap.put("amount3", "¥9999.00");
        dataMap.put("time4", "2024-03-01 14:30:00");

        // 发送消息
        messageService.sendSubscribeMessage(openid, "TEMPLATE_ID_123", dataMap);
        return "消息已发送";
    }
}

三、关键注意事项

  1. 模板字段匹配
    dataMap 中的键必须与模板详情中的字段名严格一致(如 thing1amount3),值需符合字段类型要求(如金额字段必须带单位 )。

  2. 用户授权要求
    用户需通过前端 wx.requestSubscribeMessage 授权当前模板消息,且授权状态有效(未拒绝过)。

  3. 错误码处理
    捕获 WxErrorException 异常时,需重点关注以下错误码:

    • 43101‌: 用户拒绝接受消息
    • 41030‌: 模板ID无效
    • 40003‌: openid 错误
  4. 消息触发限制
    订阅消息仅限用户主动触发事件后 7 天内发送(如支付成功、表单提交等场景)。


四、扩展优化

  1. 模板数据动态构建

可将数据格式化为符合微信要求的格式(如日期时间转换):

dataMap.put("time4", LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));

       2. 异步发送
使用 @Async 注解或消息队列异步发送消息,避免阻塞主线程:

@Async
public void sendSubscribeMessageAsync(...) { ... }

 ‌     3. 模板配置中心化
将模板 ID 和字段映射关系存储在数据库或配置中心,方便动态管理。


通过以上代码,可以快速实现基于 WxJava 的小程序订阅消息推送功能。

<think>好的,我需要向用户介绍微信小程序开发中的推送消息和通知功能。首先,我得确保自己正确理解这些功能的工作原理和实现步骤。 微信小程序的推送消息主要有两种类型:订阅消息和模板消息。不过模板消息好像已经下线了,现在主要用订阅消息。订阅消息需要用户主动授权,所以得强调用户同意的重要性。开发者需要在小程序后台配置模板,获取模板ID,这点要提到。 然后,服务端调用微信的接口发送消息。可能需要说明发送的步骤,比如获取access_token,构造消息体,发送请求。同时,用户可能关心如何触发消息,比如提交表单后触发,或者定时任务触发,这些应用场景需要举例说明。 通知功能方面,除了推送消息,还有小程序内的即时通知,比如使用WebSocket或客服消息。但WebSocket在微信小程序中的使用可能有限制,所以客服消息更常见。另外,可以提到通过wx.showToast等API在客户端显示提示,这也属于通知的一部分。 需要注意用户权限和体验,避免频繁打扰用户,否则可能被拒绝或降低用户体验。还要提到测试阶段使用开发者工具进行调试,以及审核时的注意事项,比如消息内容合规。 结构上要分点说明,先讲推送消息的类型和实现步骤,再讲通知的其他方式,最后提注意事项。确保使用正确的LaTeX格式,行内公式用$...$,独立公式用$$...$$,但在这个问题中可能用不到太多数学公式,不过如果有变量或代码示例可能需要处理。比如提到模板ID时可以用$templateId$,代码块用等宽字体,但根据用户要求,可能不需要代码,只需描述步骤。 需要检查是否有遗漏的关键点,比如订阅消息的一次性和长期性区别,用户授权方式,服务端的具体接口等。同时,提醒用户消息的时效性,比如订阅消息7天内有效,超过则无法发送。 最后总结最佳实践,比如合理设计触发场景,优化提示文案,及时处理用户反馈。确保回答结构清晰,步骤明确,用户能逐步理解和实现推送功能。</think>在微信小程序开发中,推送消息和通知功能主要通过以下方式实现,其核心机制与实现步骤如下: ### 一、推送消息类型 #### 1. 订阅消息 $$ \text{流程:用户授权 \rightarrow 服务端发送 \rightarrow 客户端接收} $$ - **特点**:需用户主动触发授权(一次性或长期) - **实现步骤**: 1. 小程序后台配置消息模板,获取`$templateId$` 2. 前端调用`wx.requestSubscribeMessage()`获取用户授权 3. 服务端调用微信接口`subscribeMessage.send`发送消息 #### 2. 客服消息(48小时有效期内) - **触发条件**:用户在小程序内与客服会话后 - **实现方式**:通过服务器接收用户消息事件,调用客服接口回复 ### 二、通知功能实现 #### 1. 服务端推送 ```javascript // 伪代码示例:发送订阅消息 POST https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token=TOKEN { "touser": "OPENID", "template_id": "TEMPLATE_ID", "page": "pages/index/index", "data": { "thing1": { "value": "订单状态更新" }, "time2": { "value": "2023-09-20 14:00" } } } ``` #### 2. 客户端本地通知 - **API调用**: ```javascript wx.showToast({ title: '操作成功', icon: 'success' }) wx.showModal({ title: '重要通知', content: '有新消息' }) ``` ### 三、关键注意事项 1. **权限控制**: - 订阅消息需用户`显式授权`,拒绝后需设计降级方案 - 单次授权仅允许发送`1条消息`,长期授权可多次发送 2. **时效限制**: - 订阅消息有效期:`7天` - 客服消息有效期:`48小时` 3. **内容规范**: - 禁止营销类内容(如:`$促销$`、`$红包$`) - 需符合[微信内容安全规范](https://developers.weixin.qq.com/miniprogram/product/) ### 四、调试与优化 1. **开发环境**: - 使用`微信开发者工具`模拟消息推送 - 通过`真机调试`验证不同场景 2. **性能优化**: - 服务端实现`消息队列`防止接口超频 - 客户端使用`onShow()`监听离线消息 ### 五、最佳实践 - **场景设计**:将消息推送核心功能结合(如:订单状态变更、服务到期提醒) - **频率控制**:单个用户日接收量建议不超过`3条` - **数据分析**:通过小程序后台`消息分析`模块监控触达率 建议在实际开发中结合[微信官方文档](https://developers.weixin.qq.com/miniprogram/dev/framework/)进行API调用测试,同时注意遵守平台运营规范。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值