java實(shí)現(xiàn)微信公眾號消息推送的方法詳解
一、注冊公眾號
1,官網(wǎng)地址:申請測試公眾號
地址: 微信公眾平臺 (qq.com)
文檔地址:微信開放文檔 (qq.com)
2,注冊后可以查看自己的appId 和 appsecret
3,創(chuàng)建模板
請注意:
1、測試模板的模板ID僅用于測試,不能用來給正式帳號發(fā)送模板消息
2、為方便測試,測試模板可任意指定內(nèi)容,但實(shí)際上正式帳號的模板消息,只能從模板庫中獲得
3、需為正式帳號申請新增符合要求的模板,需使用正式號登錄公眾平臺,按指引申請
4、模板內(nèi)容可設(shè)置參數(shù)(模板標(biāo)題不可),供接口調(diào)用時(shí)使用,參數(shù)需以{{開頭,以.DATA}}結(jié)尾
我創(chuàng)建的模板
早安!:{{name.DATA}} 天氣:{{weather.DATA}} 距離破殼日:{{birthday.DATA}}
二、代碼部分
? 發(fā)送消息和推送消息都是需要 token 的,所以第一步就可以獲取token,再拿獲取的token 進(jìn)行發(fā)送消息,每天獲取token的是有次數(shù)限制的(2000次)
添加依賴
使用微信公眾號需要的依賴
<dependency> <groupId>com.github.binarywang</groupId> <artifactId>weixin-java-mp</artifactId> <version>3.3.0</version> </dependency>
我這里把 也添上,等下可以在swagger測試
<dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> <version>2.9.2</version> </dependency> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger-ui</artifactId> <version>2.9.2</version> </dependency> <!-- knife4j 依賴--> <dependency> <groupId>com.github.xiaoymin</groupId> <artifactId>knife4j-spring-boot-starter</artifactId> <version>2.0.7</version> </dependency>
具體代碼
controller 層
這里就兩個(gè)部分,getToken() 方法 是獲取token, pushMessage() 是推送消息(這里代碼中沒有模板id,需要修改成上面自己創(chuàng)建的模板id)
@Api(tags = "各項(xiàng)測試") @RestController @RequestMapping("/loginInfo") public class SendWeChatMessageController { // /* // * 功能: 公眾號:appid,這里也可以配置到y(tǒng)aml 文件里面 // */ // // @Value("${wx.appId}") // private String appId; // // /* // * 功能: 公眾號:appsecret // */ // // @Value("${wx.appsecret}") // private String appsecret; private final Logger logger = LoggerFactory.getLogger(SendWeChatMessageController.class); @ApiOperation("獲取token") @GetMapping("/getToken") public Object getToken(@PathParam("grantType") String grantType,@PathParam("appId") String appId,@PathParam("secret") String secret) throws Exception { String tokenUrl = WeChatUrlEnum.TOKEN.getUrl(); String params = "grant_type=" + grantType + "&appid=" + appId + "&secret=" + secret; logger.info("請求地址為:" + tokenUrl + params); String tokenResponse = HttpUtils.sendGet(tokenUrl, params); JSON parse = JSONUtil.parseObj(tokenResponse); System.out.println(parse); return parse; } @ApiOperation("發(fā)送消息") @PostMapping("/testPushMessage") public String pushMessage(@RequestBody PushMessageToUserVo pushMessageToUserVo) { // 組裝要發(fā)送的數(shù)據(jù) JSONObject body = new JSONObject(); // 要推給誰 body.put("touser", pushMessageToUserVo.getTouser()); // 模板ID body.put("template_id", "這里填寫自己的模板id"); String accessToken = pushMessageToUserVo.getAccessToken(); // 創(chuàng)建消息和內(nèi)容,這里可以自己定義,對應(yīng)好模板就行 JSONObject data = new JSONObject(); data.put("name", new JSONObject().put("value", "做一個(gè)身體和心靈都勇敢的人,趁著身體未老,心靈還透明。晚安!")); data.put("weather", new JSONObject().put("value", "陰天 19°c")); data.put("birthday", new JSONObject().put("value", "53 天")); body.put("data", data); logger.info("body---->{}", body.toString()); String post = HttpUtil.post("https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + accessToken, body.toString()); logger.info("通知到用戶--->{}", post); return body.toString(); } }
其他代碼
config
這里使用 knife4j,等下好測試接口
@Configuration @EnableSwagger2 public class SwaggerConfiguration { @Bean(value = "defaultApi2") public Docket defaultApi2() { return new Docket(DocumentationType.SWAGGER_2) .apiInfo(new ApiInfoBuilder() //.title("swagger-bootstrap-ui-demo RESTful APIs") .description("# swagger-bootstrap-ui-demo RESTful APIs") .termsOfServiceUrl("http://www.xx.com/") .contact("xx@qq.com") .version("1.0") .build()) //分組名稱 .groupName("2.X版本") .select() //這里指定Controller掃描包路徑,自行記得修改?。。?! .apis(RequestHandlerSelectors.basePackage("com.example.springbootwechat.controller")) .paths(PathSelectors.any()) .build(); } }
entity
這個(gè)是推送消息vo,給那個(gè)用戶推送消息,并帶上token
@Data @ApiModel(description = "用戶推送vo") public class PushMessageToUserVo { @ApiModelProperty(value = "用戶微信關(guān)注號", required = true) private String touser; @ApiModelProperty(value = "用戶Token", required = true) private String accessToken; }
enum
我這里是把地址都變成枚舉,因?yàn)楹竺娴刂窌容^多,便于維護(hù),當(dāng)然也可以配置在yaml ,或者定義在使用處。
public enum WeChatUrlEnum { /** * 獲取token */ TOKEN("獲取微信 token的地址","https://api.weixin.qq.com/cgi-bin/token"); private String info; private String url; WeChatUrlEnum(String info,String url) { this.info =info; this.url = url; } public String getInfo() { return info; } public void setInfo(String info) { this.info = info; } public String getUrl() { return url; } public void setUrl(String url) { this.url = url; } }
utils
工具類:發(fā)送http get,post 請求
public class HttpUtils { public static String sendGet(String url, String query) throws Exception { String fullUrl = url + "?" + query; HttpURLConnection connection = (HttpURLConnection) new URL(fullUrl).openConnection(); connection.setRequestMethod("GET"); connection.setRequestProperty("Accept", "application/json"); if (connection.getResponseCode()!= 200) { throw new RuntimeException("Failed : HTTP error code : " + connection.getResponseCode()); } BufferedReader br = new BufferedReader(new InputStreamReader((connection.getInputStream()))); StringBuilder sb = new StringBuilder(); String output; while ((output = br.readLine())!= null) { sb.append(output); } connection.disconnect(); return sb.toString(); } public static String sendPost(String url, String data) throws Exception { URL fullUrl = new URL(url); HttpURLConnection connection = (HttpURLConnection) fullUrl.openConnection(); connection.setRequestMethod("POST"); connection.setRequestProperty("Content-Type", "application/json"); connection.setRequestProperty("Accept", "application/json"); connection.setDoOutput(true); DataOutputStream wr = new DataOutputStream(connection.getOutputStream()); wr.writeBytes(data); wr.flush(); wr.close(); if (connection.getResponseCode()!= 200) { throw new RuntimeException("Failed : HTTP error code : " + connection.getResponseCode()); } BufferedReader br = new BufferedReader(new InputStreamReader((connection.getInputStream()))); StringBuilder sb = new StringBuilder(); String output; while ((output = br.readLine())!= null) { sb.append(output); } connection.disconnect(); return sb.toString(); } }
三、測試
接口swagger地址:http://127.0.0.1:1955/doc.html 自己注意端口
1,獲取token
2,發(fā)送消息
手機(jī)端:接收到的消息
到此這篇關(guān)于java實(shí)現(xiàn)微信公眾號消息推送的方法詳解的文章就介紹到這了,更多相關(guān)java微信公眾號推送內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot項(xiàng)目引入第三方sdk?jar包的解決方案
這篇文章主要介紹了SpringBoot項(xiàng)目引入第三方sdk?jar包,個(gè)人感覺比較好的解決方案是將 jar上傳到本地的maven倉庫,然后通過pom依賴,引入第三方j(luò)ar包,需要的朋友可以參考下2022-05-05Mybatis實(shí)現(xiàn)自動生成增刪改查代碼
這篇文章主要為大家詳細(xì)介紹了Mybatis如何實(shí)現(xiàn)自動生成增刪改查代碼的功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-01-01Java實(shí)現(xiàn)簡易撲克牌游戲的完整實(shí)例
這篇文章主要介紹了Java實(shí)現(xiàn)簡易撲克牌游戲的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04spring cloud 使用Zuul 實(shí)現(xiàn)API網(wǎng)關(guān)服務(wù)問題
這篇文章主要介紹了spring cloud 使用Zuul 實(shí)現(xiàn)API網(wǎng)關(guān)服務(wù)問題,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-05-05Java構(gòu)造函數(shù)與普通函數(shù)用法詳解
本篇文章給大家詳細(xì)講述了Java構(gòu)造函數(shù)與普通函數(shù)用法以及相關(guān)知識點(diǎn),對此有興趣的朋友可以參考學(xué)習(xí)下。2018-03-03