如何用java編寫微信小程序消息提醒推送
一.先制定模板,我以已刪除的模板為例
二.java后臺(tái)創(chuàng)建小程序 Vo類,用于封裝傳送的參數(shù)。
import lombok.Data;
@Data
public class TemplateDataVo {
/*微信文檔中要求的格式 "data": { "name01": {"value": "某某"},"thing01": {"value": "廣州至北京"
} ,"date01": {"value": "2018-01-01"}
}*/
private String value;
}import lombok.Data;
import java.util.Map;
/*
* 小程序推送所需數(shù)據(jù)
* */
@Data
public class WxMssVo {
private String touser;//用戶openid
private String template_id;//模版id
private String page = "pages/index/index";//默認(rèn)跳到小程序首頁(yè)
// private String emphasis_keyword = "keyword1.DATA";//放大那個(gè)推送字段
private Map<String, TemplateDataVo> data;//推送文字
}1.獲取小程序全局后臺(tái)接口調(diào)用憑據(jù),有效期最長(zhǎng)為7200
/*
* 獲取access_token
* appid和appsecret到小程序后臺(tái)獲取
* */
public String getAccess_token() {
//獲取access_token
String appid = "*****"; //appid和appsecret到小程序后臺(tái)獲取
String appsecret = "*****"; //appid和appsecret到小程序后臺(tái)獲取
String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential" +
"&appid=" + appid + "&secret=" + appsecret;
if(restTemplate==null){
restTemplate = new RestTemplate();
}
String json = restTemplate.getForObject(url, String.class);
JSONObject myJson = JSONObject.parseObject(json);
return myJson.get("access_token").toString();
}2.發(fā)送消息給指定的用戶
public String pushOneUser(String access_token, String openid, String type, String templateId, String[] keywords) {
//如果access_token為空則從新獲取
if(StringUtils.isEmpty(access_token)){
access_token = getAccess_token();
}
String url = "https://api.weixin.qq.com/cgi-bin/message/subscribe/send" +
"?access_token=" + access_token;
//拼接推送的模版
WxMssVo wxMssVo = new WxMssVo();
wxMssVo.setTouser(openid);//用戶openid
/*wxMssVo.setForm_id(formId);//formId*/
wxMssVo.setTemplate_id(templateId);//模版id
Map<String, TemplateDataVo> m = new HashMap<>();
if (type.equals("3")) {
m.put("thing3", new TemplateDataVo(keywords[0]));
m.put("time1", new TemplateDataVo(keywords[1]));
m.put("thing4", new TemplateDataVo(keywords[2]));
wxMssVo.setData(m);
}
if(restTemplate==null){
restTemplate = new RestTemplate();
}
ResponseEntity<String> responseEntity =
restTemplate.postForEntity(url, wxMssVo, String.class);
log.error("小程序推送結(jié)果={}", responseEntity.getBody());
return responseEntity.getBody();
}3.整合
package com.ac.project.task.utils;
import com.ac.project.task.service.impl.applet.WXServiceImpl;
import com.ac.project.task.vo.TemplateDataVo;
import com.ac.project.task.vo.WxMssVo;
import com.alibaba.druid.util.StringUtils;
import com.alibaba.fastjson2.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.client.RestTemplate;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.Map;
/**
* @program: coworking
* @description: 微信工具類
* @author: zhaozehui
* @create: 2023-05-08 10:09
**/
@Slf4j
public class weChatUtil {
private static RestTemplate restTemplate;
final Boolean flag = false;
/**
* description 1.獲取用戶的臨時(shí)code
* param [appid, redirectUrl]
* return java.lang.String
* author
**/
public static String getUserUathUrl(String appid, String redirectUrl) throws UnsupportedEncodingException {
StringBuffer getcodeUrl = new StringBuffer()
.append("https://open.weixin.qq.com/connect/oauth2/authorize")
.append("?appid=" + appid)
.append("&redirect_uri=" + URLEncoder.encode(redirectUrl, "utf-8"))
.append("&response_type=code")
.append("&scope=snsapi_userinfo")
.append("&state=" + System.currentTimeMillis())
.append("#wechat_redirect");
return getcodeUrl.toString();
}
/**
* description 2.獲取用戶的openid和access_token
* param [appid, appSecret, code]
* return java.lang.String
* author
**/
public static String getBaseAccessTokenUrl(String appid, String appSecret, String code) throws UnsupportedEncodingException {
StringBuffer baseAccessTokenUrl = new StringBuffer()
.append("https://api.weixin.qq.com/sns/oauth2/access_token")
.append("?appid=" + appid)
.append("&secret=" + appSecret)
.append("&code=" + code)
.append("&grant_type=authorization_code");
return baseAccessTokenUrl.toString();
}
/**
* description 3.根據(jù)openid 獲取用戶的信息
* param [accessToken, openid]
* return java.lang.String
* author
**/
public static String getBaseUserInfoUrl(String accessToken, String openid) {
StringBuffer baseUserInfoUrl = new StringBuffer()
.append("https://api.weixin.qq.com/sns/userinfo")
.append("?access_token=" + accessToken)
.append("&openid=" + openid)
.append("&lang=zh_CN");
return baseUserInfoUrl.toString();
}
/**
* description 4檢驗(yàn)授權(quán)憑證(access_token)是否有效
* param [openid, accessToken]
* return java.lang.String
**/
public static String checkAccessToken(String openid, String accessToken) {
StringBuffer stringBuffer = new StringBuffer().append(" https://api.weixin.qq.com/sns/auth")
.append("?access_token=" + accessToken)
.append("&openid=" + openid);
return stringBuffer.toString();
}
/**
* description 微信小程序登錄,通過(guò)code獲取session_key和openid
* param [appid, secret, code]
* return java.lang.String
* author
**/
public static String getCode2Session(String appid, String secret, String code) {
StringBuffer code2Session = new StringBuffer()
.append("ttps://api.weixin.qq.com/sns/jscode2session")
.append("?appid=" + appid)
.append("&secret=" + secret)
.append("&js_code=" + code)
.append("&grant_type=authorization_code");
return code2Session.toString();
}
/**
* 推送消息給指定的用戶
* @param access_token app的token
* @param openid 用戶openid
* @param type 類型 1派發(fā)模板 2.反饋提醒 3審核模板 4日期截至提醒模板
* @param templateId 模板ID
* @param keywords {與模板字段一一對(duì)應(yīng)}
* @return
*/
public String pushOneUser(String access_token, String openid, String type, String templateId, String[] keywords) {
//如果access_token為空則從新獲取
if(StringUtils.isEmpty(access_token)){
access_token = getAccess_token();
}
String url = "https://api.weixin.qq.com/cgi-bin/message/subscribe/send" +
"?access_token=" + access_token;
//拼接推送的模版
WxMssVo wxMssVo = new WxMssVo();
wxMssVo.setTouser(openid);//用戶openid
/*wxMssVo.setForm_id(formId);//formId*/
wxMssVo.setTemplate_id(templateId);//模版id
Map<String, TemplateDataVo> m = new HashMap<>();
if (type.equals("3")) {
m.put("thing3", new TemplateDataVo(keywords[0]));
m.put("time1", new TemplateDataVo(keywords[1]));
m.put("thing4", new TemplateDataVo(keywords[2]));
wxMssVo.setData(m);
} else if (type.equals("1")) {
/* [發(fā)起人,發(fā)布時(shí)間,任務(wù)名稱,任務(wù)描述,結(jié)束時(shí)間]*/
m.put("thing12",new TemplateDataVo(keywords[0]));
m.put("date3",new TemplateDataVo(keywords[1]));
m.put("thing4",new TemplateDataVo(keywords[2]));
m.put("thing6",new TemplateDataVo(keywords[3]));
m.put("time9",new TemplateDataVo(keywords[4]));
}else if (type.equals("2")){
}
if(restTemplate==null){
restTemplate = new RestTemplate();
}
ResponseEntity<String> responseEntity =
restTemplate.postForEntity(url, wxMssVo, String.class);
log.error("小程序推送結(jié)果={}", responseEntity.getBody());
return responseEntity.getBody();
}
/*
* 獲取access_token
* appid和appsecret到小程序后臺(tái)獲取,當(dāng)然也可以讓小程序開(kāi)發(fā)人員給你傳過(guò)來(lái)
* */
public String getAccess_token() {
//獲取access_token
String appid = "";
String appsecret = "";
String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential" +
"&appid=" + appid + "&secret=" + appsecret;
if(restTemplate==null){
restTemplate = new RestTemplate();
}
String json = restTemplate.getForObject(url, String.class);
JSONObject myJson = JSONObject.parseObject(json);
return myJson.get("access_token").toString();
}
public static void main(String[] args) {
System.out.println(new WXServiceImpl().getAccess_token());
WXServiceImpl wxService = new WXServiceImpl();
String values[] = {"zzh7878","2023年5月8日 15:01","ceshi"};
wxService.pushOneUser(wxService.getAccess_token()
, "oM47R5KO0kFhsScuitgSJSjiN0s", "3", "QhJq4RvU7qGyf7FY_ZFc1sHJCTD8VkFvtHEx8uHwY4"
, values);
}
}4.測(cè)試
注意:在前端調(diào)用方法時(shí),只有發(fā)生點(diǎn)擊行為或者支付行為才會(huì)出現(xiàn)訂閱欄
微信小程序文檔:wx.requestSubscribeMessage(Object object) | 微信開(kāi)放文檔

會(huì)出現(xiàn)以下彈窗

未允許的話,會(huì)出現(xiàn)以下日志

點(diǎn)擊允許后,再次測(cè)試收到通知

總結(jié)
到此這篇關(guān)于如何用java編寫微信小程序消息提醒推送的文章就介紹到這了,更多相關(guān)java微信小程序消息提醒推送內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java Web項(xiàng)目創(chuàng)建并實(shí)現(xiàn)前后端交互
本文主要介紹了Java Web項(xiàng)目創(chuàng)建并實(shí)現(xiàn)前后端交互,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07
java安全fastjson1.2.24反序列化TemplatesImpl分析
這篇文章主要介紹了java安全fastjson1.2.24反序列化TemplatesImpl分析,fastjson是alibaba開(kāi)源的一個(gè)用于處理json數(shù)據(jù)格式的解析庫(kù),它支持將java對(duì)象解析成json字符串格式的數(shù)據(jù),也可以將json字符串還原成java對(duì)象2022-07-07
關(guān)于SpringGateway調(diào)用服務(wù) 接受不到參數(shù)問(wèn)題
這篇文章主要介紹了關(guān)于SpringGateway調(diào)用服務(wù)接受不到參數(shù)問(wèn)題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-12-12
Java關(guān)鍵字finally_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
java關(guān)鍵字finally不管是否出現(xiàn)異常,finally子句總是在塊完成之前執(zhí)行。下面通過(guò)實(shí)現(xiàn)代碼給大家介紹Java關(guān)鍵字finally相關(guān)知識(shí),需要的的朋友參考下吧2017-04-04
Java大文本并行計(jì)算實(shí)現(xiàn)過(guò)程解析
這篇文章主要介紹了Java大文本并行計(jì)算如何實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-06-06
學(xué)習(xí)在一臺(tái)新電腦上配置JAVA開(kāi)發(fā)環(huán)境
本文主要介紹了如何在一臺(tái)新電腦上配置JAVA開(kāi)發(fā)環(huán)境,每一個(gè)步驟都有對(duì)應(yīng)的截圖和文字說(shuō)明,需要的朋友可以參考下2015-07-07
Java中if...else語(yǔ)句使用的學(xué)習(xí)教程
這篇文章主要介紹了Java中if...else語(yǔ)句使用的學(xué)習(xí)教程,是Java入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-11-11
Myeclipse部署Tomcat_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
這篇文章給大家介紹了Myeclipse部署Tomcat的相關(guān)知識(shí),非常不錯(cuò),具有參考借鑒價(jià)值,需要的的朋友參考下吧2017-07-07

