內容有點多,請耐心!html
最近公司的有這個業務需求,又很湊巧讓我來完成:java
首先想要對接,先要一個公衆號,再就是開發文檔了:https://developers.weixin.qq.com/doc/offiaccount/Getting_Started/Overview.htmlgit
不過請注意這一點github
ok,咱們繼續:再來完成公衆號的基本配置: spring
服務器地址(URL):必須以http://或https://開頭,分別支持80端口和443端口。這個URL是很重要的,須要響應微信發送的token驗證小程序
令牌(Token):必須爲英文或數字,長度爲3-32字符。上面說過作驗證的安全
消息加解密密鑰:能夠直接隨機生成springboot
消息加解密方式:明文、兼容、安全 看業務需求選擇:我以爲明文省事點(我的看法)服務器
詳解微信開發文檔:https://developers.weixin.qq.com/doc/offiaccount/Getting_Started/Overview.html微信
若是一直用微信的接口調用,會有點麻煩因此這邊我就引用了 ---》WxJava《---
gitub:https://github.com/Wechat-Group/WxJava
gitee:https://gitee.com/binary/weixin-java-tools
先來看看官方文檔對於推送模板消息參數說明:
剛開始看這個開發文檔的時候我仍是有些懵的
openId怎麼拿? 不知道!那好吧,度娘一下、google一下,疑惑不就解決了!
ok,下一步template_id:模板Id;對於這個能夠本身申請 or 選用已有的
我就省去不必的麻煩方正是個Demo,就選擇已有的:
選擇一個進去添加模板就好了:
ok,模板id也拿到了,如今就開始
請你們也詳細的看看 WxJava 的文檔
---先創建 SpringBoot 項目---
導入wxjava公衆號 對應的pom
<!-- WxJava公衆號 --> <dependency> <groupId>com.github.binarywang</groupId> <artifactId>weixin-java-mp</artifactId> <version>3.6.0</version>
</dependency>
而後就須要配置公衆號相關的信息了,我我的比較喜歡在 yml 裏面配置
# 微信公衆號配置
wx:
appid: 11111
secret: 22222
token: 33333
aeskey: 44444
配置了這個就須要對應這個配置的Component了(實體類)
/** * @ClassName WXProperties * @Author chenghao * @Date 2020/1/10 15:44 **/ @Data @Component @ConfigurationProperties(prefix = "wx") public class WxMpProperties { /** * 公衆號appId */
private String appId; /** * 公衆號appSecret */
private String secret; /** * 公衆號token */
private String token; /** * 公衆號aesKey */
private String aesKey; }
關於註解啥的我就不去詳解了 不明白的本身去看看官方文檔
SpringBoot:
Lombok:
https://projectlombok.org/features/all
-----------------------------好的,各位,咱們如今開始-----------------------------
我先給你們一步一步分析
剛剛咱們選擇的模板,這些key都一個一個參數,文檔上面說的很明白,賦值替換!!! 明白了這點就ok了。
好,再來回頭看 WxJava
恩,根據上面的示例代碼,我寫了個Demo
/**
* 微信消息推送
*
* @ClassName WxMsgPush
* @Author chenghao
* @Date 2020/1/10 16:20
**/
@Slf4j
@Component
public class WxMsgPush {
/**
* 微信公衆號API的Service
*/
private final WxMpService wxMpService;
/**
* 構造注入
*/
WxMsgPush(WxMpService wxMpService) {
this.wxMpService = wxMpService;
}
/**
* 發送微信模板信息
*
* @param openId 接受者openId
* @return 是否推送成功
*/
public Boolean SendWxMsg(String openId) {
// 發送模板消息接口
WxMpTemplateMessage templateMessage = WxMpTemplateMessage.builder()
// 接收者openid
.toUser(openId)
// 模板id
.templateId("xxxxxxxxxxxxxxxxxxxxxxxxxxx")
// 模板跳轉連接
.url("http://www.baidu.com")
.build();
// 添加模板數據
templateMessage.addData(new WxMpTemplateData("first", "您好", "#FF00FF"))
.addData(new WxMpTemplateData("keyword1", "這是個測試", "#A9A9A9"))
.addData(new WxMpTemplateData("keyword2", "這又是個測試", "#FF00FF"))
.addData(new WxMpTemplateData("remark", "這仍是個測試", "#000000"));
String msgId = null;
try {
// 發送模板消息
msgId = wxMpService.getTemplateMsgService().sendTemplateMsg(templateMessage);
} catch (WxErrorException e) {
e.printStackTrace();
}
log.warn("·==++--·推送微信模板信息:{}·--++==·", msgId != null ? "成功" : "失敗");
return msgId != null;
}
}
wdnmd!一上來就發現報錯!!!
Could not autowire. No beans of 'WxMpService' type found. -------> 沒法自動接線。找不到「 WxMpService」類型的bean
一臉懵逼,而後看了下這個WxMpService接口 我靠,這些實現類,淦!
後來仔細研究了下須要本身寫個Configuration
/** * @ClassName WxConfig * @Author chenghao * @Date 2020/1/11 09:23 **/ @Configuration public class WxConfig { /** * 聲明實例 * * @return
*/ @Bean public WxMpService wxMpService() { WxMpService wxMpService = new WxMpServiceImpl(); return wxMpService; }
ok,開始分析代碼
首先這個
點進去瞅一眼有四個屬性:
/** * 接收者openid. */
private String toUser; /** * 模板ID. */
private String templateId; /** * 模板跳轉連接. * <pre> * url和miniprogram都是非必填字段,若都不傳則模板無跳轉;若都傳,會優先跳轉至小程序。 * 開發者可根據實際須要選擇其中一種跳轉方式便可。當用戶的微信客戶端版本不支持跳小程序時,將會跳轉至url。 * </pre> */
private String url; /** * 跳小程序所需數據,不需跳小程序可不用傳該數據. * * @see #url */
private MiniProgram miniProgram;
ok,咱們繼續分析
留意一下這個
須要跟你本身申請的模板那些key對應!!!
這個就是賦值的內容了
文字對應的顏色
最後一步:推送
懵逼中·········
點進去,又來個接口
看到相應的方法了
好了,知道了對應方法的做用,終於能夠推送了。可是可是,到如今,我纔想起一件事情,我配置的公衆號信息,他能本身讀?很顯然咱們少配置了信息。
真的是讓我一頓好找啊
他用是Lambda表達式+Stream 這裏我就不用了,我不想太騷(主要是不會)
改了一下本身寫的config,你們要注意這個!!!
/**
* @ClassName WxConfig
* @Author chenghao
* @Date 2020/1/11 09:23
**/
@Configuration
public class WxConfig {
private final WxMpProperties wxMpProperties;
/**
* 構造注入
*
* @param wxMpProperties
*/
WxConfig(WxMpProperties wxMpProperties) {
this.wxMpProperties = wxMpProperties;
}
/**
* 微信客戶端配置存儲
*
* @return
*/
@Bean
public WxMpConfigStorage wxMpConfigStorage() {
WxMpDefaultConfigImpl configStorage = new WxMpDefaultConfigImpl();
// 公衆號appId
configStorage.setAppId(wxMpProperties.getAppId());
// 公衆號appSecret
configStorage.setSecret(wxMpProperties.getSecret());
// 公衆號Token
configStorage.setToken(wxMpProperties.getToken());
// 公衆號EncodingAESKey
configStorage.setAesKey(wxMpProperties.getAesKey());
return configStorage;
}
/**
* 聲明實例
*
* @return
*/
@Bean
public WxMpService wxMpService() {
WxMpService wxMpService = new WxMpServiceImpl();
wxMpService.setWxMpConfigStorage(wxMpConfigStorage());
return wxMpService;
}
ok,主要 code 部分都完成了,開始測試吧。請本身建一個Controller
/**
* 微信消息推送
*/
private final WxMsgPush wxMsgPush;
/**
* 構造注入
*/
protected PushMsgApi(WxMsgPush wxMsgPush) {
this.wxMsgPush = wxMsgPush;
}
/** * 發送微信模板消息 */ @ApiOperation("發送微信模板消息") @ApiImplicitParams({ @ApiImplicitParam(name = "openId", value = "接受者openId", dataType = "String", paramType = "query") }) @PostMapping("/sendWxInfo") public void sendWxInfo(String openId) { // 執行發送
Boolean aBoolean = wxMsgPush.SendWxMsg(openId); System.out.println(aBoolean); }
ok!推送完成!!請你們自行去編寫!!!
(下篇出個微信登陸詳解)