如何用java編寫微信小程序消息提醒推送
一.先制定模板,我以已刪除的模板為例
二.java后臺創(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";//默認跳到小程序首頁 // private String emphasis_keyword = "keyword1.DATA";//放大那個推送字段 private Map<String, TemplateDataVo> data;//推送文字 }
1.獲取小程序全局后臺接口調(diào)用憑據(jù),有效期最長為7200
/* * 獲取access_token * appid和appsecret到小程序后臺獲取 * */ public String getAccess_token() { //獲取access_token String appid = "*****"; //appid和appsecret到小程序后臺獲取 String appsecret = "*****"; //appid和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(); }
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.獲取用戶的臨時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檢驗授權(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 微信小程序登錄,通過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 {與模板字段一一對應(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ā)布時間,任務(wù)名稱,任務(wù)描述,結(jié)束時間]*/ 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到小程序后臺獲取,當(dāng)然也可以讓小程序開發(fā)人員給你傳過來 * */ 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.測試
注意:在前端調(diào)用方法時,只有發(fā)生點擊行為或者支付行為才會出現(xiàn)訂閱欄
微信小程序文檔:wx.requestSubscribeMessage(Object object) | 微信開放文檔
會出現(xiàn)以下彈窗
未允許的話,會出現(xiàn)以下日志
點擊允許后,再次測試收到通知
總結(jié)
到此這篇關(guān)于如何用java編寫微信小程序消息提醒推送的文章就介紹到這了,更多相關(guān)java微信小程序消息提醒推送內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java Web項目創(chuàng)建并實現(xiàn)前后端交互
本文主要介紹了Java Web項目創(chuàng)建并實現(xiàn)前后端交互,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07java安全fastjson1.2.24反序列化TemplatesImpl分析
這篇文章主要介紹了java安全fastjson1.2.24反序列化TemplatesImpl分析,fastjson是alibaba開源的一個用于處理json數(shù)據(jù)格式的解析庫,它支持將java對象解析成json字符串格式的數(shù)據(jù),也可以將json字符串還原成java對象2022-07-07關(guān)于SpringGateway調(diào)用服務(wù) 接受不到參數(shù)問題
這篇文章主要介紹了關(guān)于SpringGateway調(diào)用服務(wù)接受不到參數(shù)問題,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-12-12Java關(guān)鍵字finally_動力節(jié)點Java學(xué)院整理
java關(guān)鍵字finally不管是否出現(xiàn)異常,finally子句總是在塊完成之前執(zhí)行。下面通過實現(xiàn)代碼給大家介紹Java關(guān)鍵字finally相關(guān)知識,需要的的朋友參考下吧2017-04-04學(xué)習(xí)在一臺新電腦上配置JAVA開發(fā)環(huán)境
本文主要介紹了如何在一臺新電腦上配置JAVA開發(fā)環(huán)境,每一個步驟都有對應(yīng)的截圖和文字說明,需要的朋友可以參考下2015-07-07Java中if...else語句使用的學(xué)習(xí)教程
這篇文章主要介紹了Java中if...else語句使用的學(xué)習(xí)教程,是Java入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下2015-11-11Myeclipse部署Tomcat_動力節(jié)點Java學(xué)院整理
這篇文章給大家介紹了Myeclipse部署Tomcat的相關(guān)知識,非常不錯,具有參考借鑒價值,需要的的朋友參考下吧2017-07-07