微信小程序——服务通知,发送订阅消息

news/2024/11/7 23:37:51/

一、什么是消息推送

879572be08624b21959549689920618f.png

二、整体效果

在这里插入图片描述

三、实现步骤

1 小程序开通订阅消息

image.png
image.png

2 postApi测试效果

image.png

三、uniapp配置

这里有个需要特别注意的点,我们要给用户发送消息,就必须引导用户授权,如下

image.png
因为用户不点击允许,你是没有办法给用户推送消息的。每一次授权只允许发送一条消息,所以如果你想尽量多的发送消息,就得尽量多的引导用户授权。

wx.requestSubscribeMessage这个方法,来获取用户的授权。
前端代码:

<button bindtap="getAuthority" type='primary'>获取订阅消息授权</button>//获取授权的点击事件getAuthority() {console.log("点击了")wx.requestSubscribeMessage({tmplIds: ['grwQUkOPAaJg-pzSZWeZawYTRFjmKmVPbkfckxWcPYQ'], //这里填入我们生成的模板idsuccess(res) {console.log('授权成功', res)wx.getUserInfo({//成功后会返回success:(res)=>{console.log(res);// 把你的用户信息存到一个变量中方便下面使用let userInfo= res.userInfo//获取openId(需要code来换取)这是用户的唯一标识符// 获取code值wx.login({//成功放回success:(res)=>{console.log("返回",res);let code=res.codeconsole.log("code",code);// 通过code换取openIdwx.request({url: `https://api.weixin.qq.com/sns/jscode2session?appid=wxf85bf469c5f5d12b&secret=76a1479c2adc31ab8eeefd23a09d4410&js_code=${code}&grant_type=authorization_code`,success:(res)=>{console.log(res);userInfo.openid=res.data.openidconsole.log("openid",userInfo.openid);}})}})	}})},fail(res) {console.log('授权失败', res)}})},

四、 后台整体编写

image.png
1、对应实体类
PushDTO.java

package com.soil.data.dto.push;import lombok.Data;import java.util.Map;/*** 小程序推送所需数据** @author hlc*/
@Data
public class PushDTO {/*** 用户openid*/private String touser;/*** //模版id*/private String template_id;/*** 默认*/private String page = "pages/index/index";/*** 跳转小程序页面*/private MiniprogramData miniprogram;/*** 放大那个推送字段*/private String emphasisKeyword = "keyword1.DATA";/*** 推送文字*/private Map<String, TemplateData> data;}

TemplateData.java

package com.soil.data.dto.push;import lombok.Data;/*** 设置推送的文字** @author hlc*/
@Data
public class TemplateData {private String value;public TemplateData(String value) {this.value = value;}
}

MiniprogramData.java

package com.soil.data.dto.push;import lombok.Data;/*** 跳转小程序时填写** @author hlc*/
@Data
public class MiniprogramData {private String appid;private String pagepath;
}

2、代码实现

package com.soil.biz.service.push;import com.alibaba.fastjson.JSONObject;
import com.soil.core.exception.AppServiceException;
import com.soil.core.exception.ExceptionDefinition;
import com.soil.core.util.DateUtils;
import com.soil.core.util.Log;
import com.soil.data.dto.push.MiniprogramData;
import com.soil.data.dto.push.PushDTO;
import com.soil.data.dto.push.TemplateData;
import com.soil.data.enums.UserLoginType;
import lombok.SneakyThrows;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;import java.util.Date;
import java.util.HashMap;
import java.util.Map;/*** hlc*/
@Service
public class PushBizService {private OkHttpClient okHttpClient = new OkHttpClient();public static final String WX_ACCESS_TOKEN = "https://api.weixin.qq.com/cgi-bin/token?grant_type={grant_type}&appid={appid}&secret={secret}";/*** 发送方法* @param pushDTO 所需数据* @return responseEntity*/@SneakyThrowspublic ResponseEntity<String> pushOneUser(PushDTO pushDTO) {final String SEND_INFO_URL = "https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token=";RestTemplate restTemplate = new RestTemplate();String appId = "wxf85bf469c5f5d12b";String appSecret = "76a1479c2adc31ab8eeefd23a09d4410";// 获取accessTokenJsonString accessTokenJson = getAccessTokenJSON(appId, appSecret);// 获取accessTokenJSONObject jsonObject = JSONObject.parseObject(accessTokenJson);String accessToken = jsonObject.getString("access_token");// 获取过期时间Long expiresTime = jsonObject.getLong("expires_in");System.out.println(accessToken);String url = SEND_INFO_URL + accessToken;return restTemplate.postForEntity(url, pushDTO, String.class);}/*** 测试方法*/public static void main(String[] args) {String openid = "o7TAS4zVL5D3IlVEnucI09FrCwjE";String templateId = "grwQUkOPAaJg-pzSZWeZawYTRFjmKmVPbkfckxWcPYQ";//拼接推送的模版PushDTO pushDTO = new PushDTO();//用户的openIdpushDTO.setTouser(openid);pushDTO.setTemplate_id(templateId);MiniprogramData miniprogram = new MiniprogramData();pushDTO.setMiniprogram(miniprogram);Map<String, TemplateData> data = new HashMap<>();data.put("thing9", new TemplateData("新婴儿奶瓶"));data.put("character_string1", new TemplateData("11231323"));data.put("amount24", new TemplateData("0.01"));data.put("time21", new TemplateData("2023-02-16"));pushDTO.setData(data);System.out.println("发送的模板" + data);Date date = new Date();System.out.println(DateUtils.format(date, DateUtils.DATE_TIME_PATTERN));PushBizService pushBizService = new PushBizService();ResponseEntity<String> stringResponseEntity = pushBizService.pushOneUser(pushDTO);System.out.println(stringResponseEntity);}/*** 查微信AcessToken,返回JSON值** @param appId* @param appSecret* @return* @throws Exception*/private String getAccessTokenJSON(String appId, String appSecret) throws Exception {String json = okHttpClient.newCall(new Request.Builder().url("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid="+ appId + "&secret=" + appSecret).build()).execute().body().string();JSONObject jsonObject = JSONObject.parseObject(json);Integer errcode = jsonObject.getInteger("errcode");if (errcode == null || errcode == 0) {return json;} else {Log.info("[微信 getAccessToken] 回复失败 回复报文:" + json);throw new AppServiceException(ExceptionDefinition.THIRD_PART_SERVICE_EXCEPTION);}}}

http://www.ppmy.cn/news/764519.html

相关文章

服务器发送 微信通知,方糖,使用微信通知的小接口

最近碰到一个好玩的通知接口&#xff0c;可以使用接口来触发微信通知&#xff0c;特别适合一些需要触发通知的任务。 比如说最近很多服务器都被墙了&#xff0c;什么时候解封是个问题&#xff0c;总不能每天去看一下吧……这个时候就可以在国内的没被强的服务器上定时一个脚本&…

java实现微信订阅消息(服务通知)

1. 首先定义自己小程序中APPID以及SECRET public static final String APPID "自己的appid"; public static final String SECRET "自己的secret"; 2. 获得session_key public static String getAccessToken() throws Exception {String accessTokenUr…

服务器推送微信订阅消息,微信小程序-订阅消息服务通知

微信小程序目前支持一次性订阅模板消息,也就是首先在微信客户端用户允许订阅消息后,服务端可以按照指定模板推送消息给微信客服端,具体会在微信客户端的 服务通知 通知用户,可以快速跳转至微信小程序页面 在我之前文章 微信小程序-活动抽奖 中也有这种场景,用户使用抽奖小…

微信小程序服务通知模板的实现

小程序服务通知对应的技术实现是模板消息,是需要做技术开发的,对于工程师们来说,看一下官方文档就能上手。 下面直接上代码: wxml: <form namepushMsgFm report-submit bindsubmitform><button form-type"submit">submit</button> </form>…

【服务通知】微信小程序服务通知

根据小程序开放平台配置的相关信息 private String appId "";private String secret "";private String openid "";// 消息模板private String templateId ""; 1、获取到access_token,这个access_token一般是2个小时 public Stri…

Java实现微信小程序发送服务通知

Java代码实现发送微信小程序服务通知 笔者在上个月接到一个需求&#xff0c;大概是需要计算一条数据的最大办理时间从而发送任务超期的微信小程序服务通知&#xff0c;俺也是第一次接触到需要调用微信的API去进行发送消息&#xff0c;该博客权当记录此次功能开发的过程了~ 文…

微信小程序服务通知开发

微信服务通知类似短信&#xff0c;但是开发相对简单&#xff0c;在发开前必须搞懂下面的几个参数&#xff0c;因为这几个参数关系到你开发是否成功。 1&#xff1a;参数 这里先说参数的意义&#xff0c;如何获取下面详细讲解。 openid&#xff1a;每个微信唯一的id&#xff0c;…

java微信服务通知

微信官方文档地址:subscribeMessage.send | 微信开放文档 相关开发代码: @Service public class WxMessageSendServiceImpl extends BaseService implements IWxMessageSendService { /** * 定义编码格式 UTF-8 */ public static final String URL_PARAM_…