微信小程序一次性订阅消息发送信息

目录

一、前言

二、小程序配置

2.1配置公共模版

三、Java调用微信小程序接口推送消息

3.1获取access_token

3.2推送订阅信息

3.3VO类代码

3.4注意事项

3.5发送前提

四、总结


一、前言

本文介绍如何通过配置微信小程序一次性订阅功能,并通过后端服务Java推送消息,实现一次性订阅推送

二、小程序配置

2.1配置公共模版

在小程序管理后台,点击基础功能→订阅消息→公共模板库→一次性订阅,挑选时候的模板库,点击选用

在模版中选择你需要的字段,最多可选择5个,不存在的字段支持申请,需要小程序审核通过才可使用。基本上模板中的字段可以满足大部分人的要求

模板选择好以后,可以在我的模版中看到,模板ID需要后续推送时使用,点击详情

详情中可查看具体参数名,记住参数字段名称,后续推送消息时使用

三、Java调用微信小程序接口推送消息

3.1获取access_token

可查看微信小程序官方文档,寻找调用接口,链接如下:获取接口调用凭据 | 微信开放文档

其中入参appidsecret可在小程序管理后台寻找,grant_type固定填写为client_credential

import com.alibaba.fastjson.JSONObject;
import com.dhc.ilead.bpm.utils.HttpClientUtils;
import com.dhc.ilead.zzkj.swc.wx.dto.WxAccessTokenVO;

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

/**
 * @author : xxx
 * @date : 2024/11/13 11:41
 * @description : WxMessageUtil
 */
public class WxMessageUtil {

    private static final String ACCESS_TOKEN_URL = "https://api.weixin.qq.com/cgi-bin/token";

    /*
     * 获取access_token
     */
    public static WxAccessTokenVO getAccess_token(String appid, String secret) {
        WxAccessTokenVO wxAccessTokenVO = new WxAccessTokenVO();
        //获取access_token
        Map<String, String> paramMap = new HashMap();
        paramMap.put("appid", appid);
        paramMap.put("secret", secret);
        paramMap.put("grant_type", "client_credential");
        try {
            JSONObject result = JSONObject.parseObject(HttpClientUtils.doGet(ACCESS_TOKEN_URL, paramMap).getContent());
            if(result != null){
                wxAccessTokenVO.setAccessToken(result.getString("access_token"));
                wxAccessTokenVO.setExpiresIn(result.getLong("expires_in"));
                wxAccessTokenVO.setErrCode(result.getLong("errcode"));
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return wxAccessTokenVO;
    }



}

access_token过期时间最长7200s,所以需要缓存access_token定期刷新,此处利用redis做缓存处理,并根据返回的过期时间提前5分钟设置为redis的过期时间

    public void sendMessageToWx(String openid, SwcPortReportingInfoDTO param){
        //redis中获取access_token
        String accessToken = stringRedisTemplate.opsForValue().get("wxAccessToken");
        if ( accessToken == null){
            log.info("开始存入redis数据");
            //调用小程序接口获取access_token,并存入redis
            WxAccessTokenVO wxAccessTokenVO = WxMessageUtil.getAccess_token(appid, secret);
            stringRedisTemplate.opsForValue().set("wxAccessToken",wxAccessTokenVO.getAccessToken(),wxAccessTokenVO.getExpiresIn()-300, TimeUnit.SECONDS);
            accessToken = wxAccessTokenVO.getAccessToken().trim();
        }
        log.info("获取accessToken为:"+accessToken);
    }

3.2推送订阅信息

调用微信小程序订阅消息接口,官方文档链接如下:发送订阅消息 | 微信开放文档

入参按照接口文档方式传递,touser为你需要推送的微信用户的openid,template_id为前文提到的模版id,page为点击模板卡片后的跳转页面,仅限本小程序内的页面(小程序开发提供),miniprogram_state为小程序类型,lang为进入小程序查看”的语言类型

public void sendMessageToWx(String openid, SwcPortReportingInfoDTO param){
        //redis中获取access_token
        String accessToken = stringRedisTemplate.opsForValue().get("wxAccessToken");
        if ( accessToken == null){
            log.info("开始存入redis数据");
            //调用小程序接口获取access_token,并存入redis
            WxAccessTokenVO wxAccessTokenVO = WxMessageUtil.getAccess_token(appid, secret);
            stringRedisTemplate.opsForValue().set("wxAccessToken",wxAccessTokenVO.getAccessToken(),wxAccessTokenVO.getExpiresIn()-300, TimeUnit.SECONDS);
            accessToken = wxAccessTokenVO.getAccessToken().trim();
        }
        log.info("获取accessToken为:"+accessToken);

        //发送信息至客户
        RestTemplate restTemplate = new RestTemplate();
        //获取接口入参
        WxMessageDto wxMessageDto = new WxMessageDto();
        wxMessageDto.setTouser(openid);
        wxMessageDto.setTemplate_id(templateid);
        wxMessageDto.setMiniprogram_state(miniprogramstate);
        wxMessageDto.setLang(lang);
        wxMessageDto.setPage(page);
        Map<String, WxMessageValueDto> wxMssVo = new HashMap<>(4);
        if (StringUtils.equals(SwcConstant.PORT_REPORT_APPROVED,param.getReportingPortStatus())){
            wxMssVo.put("phrase1", new WxMessageValueDto("通过")); //审核结果
            wxMssVo.put("thing51", new WxMessageValueDto("无"));  //驳回原因
        }else {
            wxMssVo.put("phrase1", new WxMessageValueDto("不通过")); //审核结果
            wxMssVo.put("thing51", new WxMessageValueDto((StringUtils.isNotBlank(param.getRefuseReason()) && param.getRefuseReason().length() > 20) ? param.getRefuseReason().substring(0,17)+"...":param.getRefuseReason()));  //驳回原因
        }
        wxMssVo.put("date3", new WxMessageValueDto(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").format(LocalDateTime.now())));   //审核时间
        String reportType = "xxx申请1";
        if (param.getReportingPortType() != null &&SwcConstant.PORT_REPORT_UNLOAD.equals(param.getReportingPortType())){
            reportType = "xxx申请2";
        }
        wxMssVo.put("thing15", new WxMessageValueDto("申请内容xxx"));  //申请项目
        wxMssVo.put("thing16", new WxMessageValueDto(param.getShipName() + reportType));  //申请内容
        wxMessageDto.setData(wxMssVo);
        log.info("小程序推送信息:"+wxMessageDto.toString());
        try {
            ResponseEntity<String> responseEntity =
                    restTemplate.postForEntity(SEND_MESSAGE_URL+accessToken, wxMessageDto, String.class);
            log.info(responseEntity.getBody());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

3.3VO类代码

@Data
public class WxMessageDto {
    private String touser;//用户openid
    private String template_id;//订阅消息模版id
    private String miniprogram_state;//跳转小程序类型
    private String lang;//语言类型
    private String page = "pages/login";//默认跳到小程序首页
    private Map<String, WxMessageValueDto> data;//推送文字
}
@Data
@AllArgsConstructor
public class WxMessageValueDto {
    private String value;
}
@Data
public class WxAccessTokenVO {
    private String accessToken;
    private Long expiresIn;
    private Long errCode;

}

3.4注意事项

推送消息时,模版里的字段都有长度限制,所以发送消息时需注意消息的长度,超长字段需要做处理,否则会发送失败,长度限制见下图

3.5发送前提

因为是一次性订阅消息推送,所以推送时需要小程序开发订阅消息的弹窗,用户允许以后才能推送

四、总结

微信小程序一次性订阅消息推送可在用户点击订阅消息以后,由服务端推送消息。但每订阅一次只支持推送一条消息,如需多次推送用户必须多次点击订阅弹窗。小程序本身支持永久订阅但限制很多,所以针对简单的消息推送场景本文方可适用。

<think>首先,用户的问题是关于微信小程序一次性订阅消息是否支持多次发送。用户问:“我想了解微信小程序一次性订阅是否支持多次消息发送请问微信小程序一次性订阅消息是否可以多次发送” 我需要参考系统级指令:使用中文回答,生成相关问题,并确保LaTeX语法正确。但用户的问题不涉及数学表达式,所以可能不需要LaTeX。指令说所有行内数学表达式必须用$...$,但这里没有数学内容,所以我可以忽略。 回答结构要清晰,帮助用户逐步解决问题,保证真实可靠。参考提供的引用:-引用[1]:微信小程序一次性订阅消息发送信息。每订阅一次只支持推送一条消息,如需多次推送用户必须多次点击订阅弹窗。 -引用[2]:微信小程序一次性订阅封装。每调用一次wx.requestSubscribeMessage,订阅次数增加1次。用户需要打开消息订阅开关。 -引用[3]:微信小程序一次性订阅消息的代码示例。 从引用[1]明确说:“每订阅一次只支持推送一条消息,如需多次推送用户必须多次点击订阅弹窗。”所以,一次性订阅不支持多次消息发送;每次订阅只允许发送一条消息。要发送多条消息,用户需要多次订阅。用户真正的需求是了解是否支持多次发送,所以我应该直接回答:不支持多次发送,每次订阅只对应一条消息。 回答结构:我需要清晰、逐步解释。1.**解释一次性订阅的概念**:一次性订阅消息允许用户订阅一次后,服务端可以推送一条消息。2.**回答核心问题**:是否支持多次发送?不支持。每次订阅只允许发送一条消息。要发送多条,用户必须多次订阅。 3. **引用支持**:引用[1]明确指出这一点。 4. **生成相关问题**:指令要求生成相关问题,放在回答末尾。5.**格式**:使用中文。确保回答真实可靠。最终回答结构:-开头直接回答问题。-解释原因和机制。-提供相关细节。-末尾添加相关问题。 相关问题生成:基于主题,例如: 1.如何实现多次消息推送? 2.用户如何多次订阅?3.永久订阅的限制是什么? 参考引用[1]提到永久订阅限制多,所以可以问关于永久订阅。现在,构建回答。**回答内容**: 用户问:微信小程序一次性订阅消息是否可以多次发送? 回答:不可以。微信小程序一次性订阅消息不支持多次发送。根据引用[1],每订阅一次只支持推送一条消息。如果需要多次推送消息,用户必须多次点击订阅弹窗进行订阅。机制解释:当用户调用wx.requestSubscribeMessage并订阅后,开发者可以发送一条消息。之后,如果要发送另一条消息,用户需要再次订阅。引用[1]:微信小程序一次性订阅消息推送可在用户点击订阅消息以后,由服务端推送消息。但每订阅一次只支持推送一条消息,如需多次推送用户必须多次点击订阅弹窗。[^1] 此外,引用[2]强调,每调用一次wx.requestSubscribeMessage,订阅次数增加一次,用户需要确保消息订阅开关打开。 所以,总结:不支持多次发送;每次订阅对应一条消息。 相关问题生成: 1.如何让用户多次订阅发送多条消息? 2.微信小程序永久订阅消息有哪些限制?3.如何在后端实现消息推送?确保末尾添加引用标识。</think>### 微信小程序一次性订阅消息是否支持多次发送 微信小程序一次性订阅消息不支持多次发送。下面我将逐步解释其机制、原因和相关细节,帮助您清晰理解。 #### 1. **核心机制与限制** - 一次性订阅消息允许用户通过小程序前端(如点击按钮)触发订阅操作,开发者随后可以在服务端推送一条消息。 - **关键限制**:每订阅一次仅支持推送一条消息。这意味着: - 用户订阅一次后,开发者只能发送一条消息(例如通知或提醒)。 - 如果需要发送第二条或更多消息,用户必须重新订阅(即再次点击订阅弹窗)。 - 引用支持:根据引用[1],微信小程序一次性订阅消息推送机制是“每订阅一次只支持推送一条消息,如需多次推送用户必须多次点击订阅弹窗”。[^1] #### 2. **原因分析** - **设计初衷**:微信平台设计一次性订阅是为了保护用户隐私和避免骚扰。每个订阅操作都需要用户明确授权,确保用户对每条消息都有控制权。 - **订阅过程**: - 前端调用 `wx.requestSubscribeMessage` 方法:用户每次点击订阅弹窗时,该方法被调用一次,对应一次订阅机会。 - 后端推送消息:开发者使用订阅时获得的授权,通过微信服务器发送一条消息。 - 如果用户未重新订阅,服务端无法推送第二条消息。 - 引用支持:引用[2]指出,“wx.requestSubscribeMessage每调用一次,订阅次数增加1次”,强调了订阅次数的有限性。[^2] 同时,用户必须确保消息订阅开关已打开(在微信设置中),否则即使订阅也无法推送消息。 #### 3. **如何实现多次消息推送** 虽然一次性订阅本身不支持多次发送,但可以通过以下方式间接实现: - **用户多次订阅**:引导用户在每次需要接收新消息时,重新触发订阅操作(例如,在小程序中添加“再次订阅”按钮)。 - 示例代码(基于引用[3]): ```javascript // 前端:调用订阅方法 getMessage() { wx.requestSubscribeMessage({ tmplIds: ['您的模板ID'], // 替换为实际模板ID success(res) { console.log(res); // 订阅成功,后端可推送一条消息 }, fail(err) { console.error('订阅失败', err); } }); } ``` - 后端:每次订阅成功后,服务端使用微信API推送一条消息。 - **替代方案**:如果业务需要频繁推送,可考虑微信小程序的永久订阅功能,但永久订阅有严格限制(如仅限特定行业或场景,且需微信审核),引用[1]提到“小程序本身支持永久订阅但限制很多”。[^1] #### 4. **注意事项** - **用户操作要求**:用户必须在订阅弹窗中同意授权,且确保微信设置中的“接受消息”开关已打开(引用[2])。[^2] - **性能与体验**:多次订阅可能影响用户体验,建议在设计中提供清晰的提示(如“每次订阅发送一条消息,请重新订阅以接收更新”)。 - **真实性验证**:此机制基于微信官方文档和常见实践,确保可靠。您可参考微信开放平台文档进一步验证。 ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值