一,註冊公眾號 1,官網地址:申請測試公眾號 地址: 微信公眾平臺 (qq.com) 文檔地址:微信開放文檔 (qq.com) 2,註冊後可以查看自己的appId 和 appsecret 3,創建模板 請註意: 1、測試模板的模板ID僅用於測試,不能用來給正式帳號發送模板消息 2、為方便測試,測試模 ...
一,註冊公眾號
1,官網地址:申請測試公眾號
地址: 微信公眾平臺 (qq.com)
文檔地址:微信開放文檔 (qq.com)
2,註冊後可以查看自己的appId 和 appsecret
3,創建模板
- 請註意:
- 1、測試模板的模板ID僅用於測試,不能用來給正式帳號發送模板消息
- 2、為方便測試,測試模板可任意指定內容,但實際上正式帳號的模板消息,只能從模板庫中獲得
- 3、需為正式帳號申請新增符合要求的模板,需使用正式號登錄公眾平臺,按指引申請
- 4、模板內容可設置參數(模板標題不可),供介面調用時使用,參數需以{{開頭,以.DATA}}結尾
我創建的模板
早安!:{{name.DATA}}
天氣:{{weather.DATA}}
距離破殼日:{{birthday.DATA}}
二,代碼部分
發送消息和推送消息都是需要 token 的,所以第一步就可以獲取token,再拿獲取的token 進行發送消息,每天獲取token的是有次數限制的(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 層
這裡就兩個部分,getToken() 方法 是獲取token, pushMessage() 是推送消息(這裡代碼中沒有模板id,需要修改成上面自己創建的模板id)
@Api(tags = "各項測試")
@RestController
@RequestMapping("/loginInfo")
public class SendWeChatMessageController {
// /*
// * 功能: 公眾號:appid,這裡也可以配置到yaml 文件裡面
// */
//
// @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("發送消息")
@PostMapping("/testPushMessage")
public String pushMessage(@RequestBody PushMessageToUserVo pushMessageToUserVo) {
// 組裝要發送的數據
JSONObject body = new JSONObject();
// 要推給誰
body.put("touser", pushMessageToUserVo.getTouser());
// 模板ID
body.put("template_id", "這裡填寫自己的模板id");
String accessToken = pushMessageToUserVo.getAccessToken();
// 創建消息和內容,這裡可以自己定義,對應好模板就行
JSONObject data = new JSONObject();
data.put("name", new JSONObject().put("value", "做一個身體和心靈都勇敢的人,趁著身體未老,心靈還透明。晚安!"));
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("[email protected]")
.version("1.0")
.build())
//分組名稱
.groupName("2.X版本")
.select()
//這裡指定Controller掃描包路徑,自行記得修改!!!!
.apis(RequestHandlerSelectors.basePackage("com.example.springbootwechat.controller"))
.paths(PathSelectors.any())
.build();
}
}
entity
這個是推送消息vo,給那個用戶推送消息,並帶上token
@Data
@ApiModel(description = "用戶推送vo")
public class PushMessageToUserVo {
@ApiModelProperty(value = "用戶微信關註號", required = true)
private String touser;
@ApiModelProperty(value = "用戶Token", required = true)
private String accessToken;
}
enum
我這裡是把地址都變成枚舉,因為後面地址會比較多,便於維護,當然也可以配置在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
工具類:發送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,發送消息
手機端:接收到的消息
謝謝看到這!!!有不對地方,可以留言評論討論哦!!!
希望可以動動小手,點個關註!!!