【微信公众号推送小程序消息通知】--下发统一消息接口被回收后新方案

这篇具有很好参考价值的文章主要介绍了【微信公众号推送小程序消息通知】--下发统一消息接口被回收后新方案。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

序言

由于微信小程序长期订阅的消息模板和下发统一消息推送接口全部失效以后,对于小程序的消息推送可以往公众号推可以使用本文章方案。在网上看了挺多方案,有用用户列表做匹配的等,最终觉得通过关注事件触发的方案是最省事。

准备

1、微信公众平台注册服务号(订阅号是不可以推送的)与小程序,两者都需要认证并且认证主体是一致

2、微信开放平台注册账号(该账号也需要认证),绑定小程序与公众号
微信消息推送接口,微信,小程序,spring boot,微信公众平台
3、公众号根据想要的模板消息绑定服务类目,去模板消息中先挑选你的模板消息。(如果是刚注册的公众号还需要去新的功能页面添加模板消息功能,需要微信审核,不过很快)
微信消息推送接口,微信,小程序,spring boot,微信公众平台
4、微信公众号绑定小程序
微信消息推送接口,微信,小程序,spring boot,微信公众平台
5、小程序与公众号配置服务器的ip地址白名单
微信消息推送接口,微信,小程序,spring boot,微信公众平台
6、公众号配置服务器地址
微信消息推送接口,微信,小程序,spring boot,微信公众平台

整体实现流程

通过在开放平台绑定的公众号与小程序后,我们在调用微信code2Session接口的时候会返回unionid,这个unionid就是推送的关键。

  • 用到微信接口:
    1、关注事件推送:用关注事件推送接口文档地址
    2、查询用户基础信息:用户基础信息接口文档地址
    3、获取accessToken:获取accessToken接口文档地址
    4、消息模板推送:消息模板推送接口文档地址
    微信消息推送接口,微信,小程序,spring boot,微信公众平台

实现代码(Java)

这里使用第三方工具包Wx-Java(非常方便),直接实现推送代码。具体源码可以浏览https://gitee.com/binary/weixin-java-tools文章来源地址https://www.toymoban.com/news/detail-763903.html

  • 先在配置文件yml配置公众号信息
# 公众号配置
wx:
  mp:
    appId: xiaochengxuappid
    secret: xiaochengxusecrect
    token: xiaochengxutoken
    aesKey:  xiaochengxuaes
    # token存储在redis
    config-storage:
      type: RedisTemplate
  • 封装推送工具类
	/**
     * 微信公众号推送模板消息
     *
     * @param openid       用户openid
     * @param templateData 模板参数
     */
    public void sendTemplateMsg(String openid, List<WxMpTemplateData> templateData) {
        WxMpTemplateMessage templateMessage = WxMpTemplateMessage.builder()
                .toUser(openid)
                // 模板id
                .templateId(templateId)
                // 跳转小程序appid,跳转路径
                .miniProgram(new WxMpTemplateMessage.MiniProgram(weAppAppId, "", false))
                // 模板参数
                .data(templateData)
                .build();
        try {
            log.debug("微信公众号推送模板消息入参:{}", templateMessage);
            // 成功返回msgId,否则都是抛异常
            wxMpService.getTemplateMsgService().sendTemplateMsg(templateMessage);
        } catch (WxErrorException e) {
            log.error("微信公众号推送模板消息异常", e);
        }
    }
  • 公众号接入服务器开发的代码
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import me.chanjar.weixin.mp.api.WxMpMessageRouter;
import me.chanjar.weixin.mp.api.WxMpService;
import me.chanjar.weixin.mp.bean.message.WxMpXmlMessage;
import me.chanjar.weixin.mp.bean.message.WxMpXmlOutMessage;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

/**
 * @author quan
 * @date 2023/11/7 18:19
 */
@Slf4j
@AllArgsConstructor
@RestController
@RequestMapping("/wx")
public class WxPortalController {
    @Autowired
    private final WxMpService wxService;
    @Autowired
    private final WxMpMessageRouter messageRouter;

    @GetMapping(produces = "text/plain;charset=utf-8")
    public String authGet(@PathVariable String appid,
                          @RequestParam(name = "signature", required = false) String signature,
                          @RequestParam(name = "timestamp", required = false) String timestamp,
                          @RequestParam(name = "nonce", required = false) String nonce,
                          @RequestParam(name = "echostr", required = false) String echostr) {
        log.info("接收到来自微信服务器的认证消息:[{}, {}, {}, {}]", signature, timestamp, nonce, echostr);
        if (StringUtils.isAnyBlank(signature, timestamp, nonce, echostr)) {
            throw new IllegalArgumentException("请求参数非法,请核实!");
        }

        if (!this.wxService.switchover(appid)) {
            throw new IllegalArgumentException(String.format("未找到对应appid=[%s]的配置,请核实!", appid));
        }

        if (wxService.checkSignature(timestamp, nonce, signature)) {
            return echostr;
        }

        return "非法请求";
    }

    @PostMapping(produces = "application/xml; charset=UTF-8")
    public String post(@PathVariable String appid,
                       @RequestBody String requestBody,
                       @RequestParam("signature") String signature,
                       @RequestParam("timestamp") String timestamp,
                       @RequestParam("nonce") String nonce,
                       @RequestParam("openid") String openid,
                       @RequestParam(name = "encrypt_type", required = false) String encType,
                       @RequestParam(name = "msg_signature", required = false) String msgSignature) {
        log.info("接收微信请求:[openid=[{}], [signature=[{}], encType=[{}], msgSignature=[{}],"
                        + " timestamp=[{}], nonce=[{}], requestBody=[\n{}\n] ",
                openid, signature, encType, msgSignature, timestamp, nonce, requestBody);

        if (!this.wxService.switchover(appid)) {
            throw new IllegalArgumentException(String.format("未找到对应appid=[%s]的配置,请核实!", appid));
        }

        if (!wxService.checkSignature(timestamp, nonce, signature)) {
            throw new IllegalArgumentException("非法请求,可能属于伪造的请求!");
        }

        String out = null;
        if (encType == null) {
            // 明文传输的消息
            WxMpXmlMessage inMessage = WxMpXmlMessage.fromXml(requestBody);
            WxMpXmlOutMessage outMessage = this.route(inMessage);
            if (outMessage == null) {
                return "";
            }

            out = outMessage.toXml();
        } else if ("aes".equalsIgnoreCase(encType)) {
            // aes加密的消息
            WxMpXmlMessage inMessage = WxMpXmlMessage.fromEncryptedXml(requestBody, wxService.getWxMpConfigStorage(),
                    timestamp, nonce, msgSignature);
            log.debug("消息解密后内容为:{} ", inMessage);
            WxMpXmlOutMessage outMessage = this.route(inMessage);
            if (outMessage == null) {
                return "";
            }

            out = outMessage.toEncryptedXml(wxService.getWxMpConfigStorage());
        }

        log.debug("组装回复信息:{}", out);
        return out;
    }

    private WxMpXmlOutMessage route(WxMpXmlMessage message) {
        try {
            return this.messageRouter.route(message);
        } catch (Exception e) {
            log.error("路由消息时出现异常!", e);
        }

        return null;
    }
}

  • 微信消息路由配置类
/**
 * @author quan
 * @date 2023/11/7 18:23
 */
@AllArgsConstructor
@Configuration
public class WxMpConfiguration {
    private final SubscribeHandler subscribeHandler;

    @Bean
    public WxMpMessageRouter messageRouter(WxMpService wxMpService) {
        final WxMpMessageRouter newRouter = new WxMpMessageRouter(wxMpService);

        // 关注事件
        newRouter.rule().async(false).msgType(EVENT).event(SUBSCRIBE).handler(this.subscribeHandler).end();

        return newRouter;
    }
}
  • 微信关注事件处理类
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.tfcs.web.domain.bus.BusWxMpUser;
import com.tfcs.web.service.BusWxMpUserService;
import lombok.extern.slf4j.Slf4j;
import me.chanjar.weixin.common.error.WxErrorException;
import me.chanjar.weixin.common.session.WxSessionManager;
import me.chanjar.weixin.mp.api.WxMpMessageHandler;
import me.chanjar.weixin.mp.api.WxMpService;
import me.chanjar.weixin.mp.bean.message.WxMpXmlMessage;
import me.chanjar.weixin.mp.bean.message.WxMpXmlOutMessage;
import me.chanjar.weixin.mp.bean.result.WxMpUser;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.Map;

/**
 * 关注处理器
 *
 * @author quan
 * @date 2023/9/15 14:05
 */
@Slf4j
@Component
public class SubscribeHandler implements WxMpMessageHandler {
    @Autowired
    private BusWxMpUserService wxMpUserService;

    @Override
    public WxMpXmlOutMessage handle(WxMpXmlMessage wxMessage,
                                    Map<String, Object> context, WxMpService weixinService,
                                    WxSessionManager sessionManager) {

        log.info("新关注用户 OPENID: " + wxMessage.getFromUser());

        // 获取微信用户基本信息
        try {
            WxMpUser userWxInfo = weixinService.getUserService()
                    .userInfo(wxMessage.getFromUser(), null);
            if (userWxInfo != null) {
                // TODO 先检查是否存在该用户,不存在再存到数据库
            }
        } catch (WxErrorException e) {
            log.error("微信公众号获取用户信息异常:", e);
            if (e.getError().getErrorCode() == 48001) {
                log.info("该公众号没有获取用户信息权限!");
            }
        }
        return null;
    }
}
  • 业务代码调用demo
// 通过unionid查出公众号openid
BusWxMpUser wxMpUser = wxMpUserService.getOne(new LambdaQueryWrapper<BusWxMpUser>()
         .eq(BusWxMpUser::getUnionid, user.getUnionid()));
 if (null != wxMpUser) {
     List<WxMpTemplateData> templateData = new ArrayList<>(5);
     // 对应消息模板的key
     templateData.add(new WxMpTemplateData("character_string2", event.getFlightNo()));
     templateData.add(new WxMpTemplateData("thing10", event.getStartPlace()));
     templateData.add(new WxMpTemplateData("thing11", event.getDestPlace()));
     templateData.add(new WxMpTemplateData("time3", DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD, event.getFlightStartTime())));
     templateData.add(new WxMpTemplateData("thing9", "请及时处理关注事件"));
     weChatUtil.sendTemplateMsg(wxMpUser.getOpenid(), templateData);
 }
  • 推送效果
    微信消息推送接口,微信,小程序,spring boot,微信公众平台

到了这里,关于【微信公众号推送小程序消息通知】--下发统一消息接口被回收后新方案的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 微信小程序向公众号推送消息模板

    由于微信小程序长期订阅的消息模板全部失效以后,对于小程序的消息推送可以改成往公众号推。 这里将介绍如何使用小程序向公众号推送消息,并且消息可以跳转到小程序 1、微信公众平台注册 服务号 (订阅号是不可以推送的)与小程序,两者都需要认证并且 认证主体是

    2024年02月06日
    浏览(56)
  • 微信小程序服务通知(订阅消息)定时推送消息功能

    首先先说项目需求:向预约参观的用户提前一天晚上8点推送消息。小程序端主要用到的 API 是我是小程序用到的API。以及服务端用到的 API :我是服务端用到的API。 1. 开通订阅消息功能 (1)、 首先需要在小程序管理后台开通订阅消息功能。没开通前如下图所示: (2)、开通之

    2024年02月08日
    浏览(80)
  • 微信小程序向公众号推送消息超详细教程

    官方教程 官方教程 开通一下服务号公众号 超级管理员登录服务号公众号后台 登录地址 开通模板消息 申请一个模板消息,获取模板ID 注意此处的参数,后续接口需要使用 绑定公众号与小程序 官方教程 1.登录微信公众号后台 2.点击小程序管理 3.关联小程序 获取微信公众号

    2024年02月11日
    浏览(63)
  • 如何为微信小程序添加订阅消息和推送通知功能

    为微信小程序添加订阅消息和推送通知功能是非常有用的,它可以让用户在重要的事件发生时及时地收到通知。在本文中,我们将详细介绍如何为微信小程序添加这两种功能。 一、订阅消息 订阅消息是一种新的消息类型,用户可以选择是否订阅它们。订阅消息一般用于向用

    2024年02月04日
    浏览(74)
  • spring boot +微信小程序项目,通过微信公众号实现指定用户消息长期推送

    用户登录小程序,后台记录用户的小程序openId和用户唯一的UnionId。然后用户触发公众号事件(关注公众号或者发送指定消息),后台获取到用户公众号的openId,再调用接口通过公众号的openId查询用户的UnionId,再和数据库里的UnionId进行匹配,将用户的公众号openId存入数据库。此

    2024年02月03日
    浏览(61)
  • uni-app中实现微信小程序/公众号订阅消息推送功能

    👨🏻‍💻 热爱摄影的程序员 👨🏻‍🎨 喜欢编码的设计师 🧕🏻 擅长设计的剪辑师 🧑🏻‍🏫 一位高冷无情的编码爱好者 大家好,我是全栈 IT 工程师摘星人 欢迎分享 / 收藏 / 赞 / 在看! 开发业务时时常遇到需要向用户发送一些通知,如欠费通知、会员到期通知等等。

    2024年02月02日
    浏览(136)
  • 微信小程序统一分享,全局接管页面分享消息的一些技巧

    前言 最近都在折腾自己的个人内容聚合小程序。除了作为原创专栏,视频教程的聚合。我有什么新的想法,产品创意,最终落地的东西都会放到这个小程序里。 而分享功能非常的重要,当某一个功能或文章打动用户的时候,能把这个小程序分享出去,就能带来裂变传播的效

    2024年02月15日
    浏览(52)
  • 微信公众号推送模板消息给用户

    前置条件: 1.公众号为服务号,而非订阅号 2.认证(300元) 3.进入公众号申请模板推送功能 4.添加模板(注意:推送的消息只能使用微信提供的模板,不可自定义,但也是比较全的) 4.2 获取accessToken时,需要将开发环境的电脑ip添加到微信后台的ip白名单(线上环境亦是如此

    2024年02月12日
    浏览(59)
  • java 实现微信公众号消息推送

    这里主要用测试账号来演示:测试账号注册地址 正式账号注册地址:微信公众平台 可参考微信公众号文档:微信公众号文档 模板根据需求设置(注意:参数长度不能超出微信规定,否则将发送失败) 参数要求规则 依赖 请求地址、appid、密钥等信息;信息配置到application配置中

    2024年02月06日
    浏览(56)
  • 小程序推送公众号模板消息

    第一步:先创建微信开放平台:微信开放平台,绑定微信小程序和公众号(是为后面拿共用的unionid进行小程序openid与公众号openid绑定) 第二步:进入公众号开放平台,找到基本配置,配置服务器地址(url):指自己服务器能够访问的域名 第三步:在服务器中就是url写下这个方法

    2024年01月21日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包