微信开发环境搭建
前言:目前在做微信公众号后台开发,用测试公众号回顾和总结一下。
传送门:完整demo传送门
先看看完整demo目录:
微信测试公众号进行测试需要让自己的程序与微信的服务器进行交互,所以需要一个软件将我们的内网穿透到外网,我在这推荐一个免费的软件下载一下免费内网穿透软件,内有教程,在这里就不过讲述了。
PS:记得保证自己是唯一的,所以我使用了自己的QQ账号,保证域名唯一。
一、进入微信个人测试号公众号点我。
二、进入微信测试公众号进行配置
appID以及appsecret是微信生成的,下面就要自己配置了
URL就是上面穿透软件的网址;
Token是自己定义的;
域名也是内网穿透软件的域名。
中间的接口配置信息先不着急配置 你也配不了
配置oauth2认证机制,也是填写域名(不加http)
三、Java后台配置
1.新建一个spring boot项目 加入微信SDK的包
<dependency>
<groupId>com.github.binarywang</groupId>
<artifactId>weixin-java-common</artifactId>
<version>2.9.0</version>
</dependency>
<dependency>
<groupId>com.github.binarywang</groupId>
<artifactId>weixin-java-mp</artifactId>
<version>2.9.0</version>
</dependency>
2.在spring boot的配置文件application.yml(个人习惯)中进行微信配置
(PS:不需要强调格式吧)
3.新建一个WechatMpProperties来读取配置文件中的属性。
package com.dxg.wechatdemo.weixin.pm.config;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import org.springframework.boot.context.properties.ConfigurationProperties;
/**
* wechat mp properties
*
* @author Binary Wang(https://github.com/binarywang)
*/
@ConfigurationProperties(prefix = "wechat.mp")
public class WechatMpProperties {
/**
* 设置微信公众号的appid
*/
private String appId;
/**
* 设置微信公众号的app secret
*/
private String secret;
/**
* 设置微信公众号的token
*/
private String token;
/**
* 设置微信公众号的EncodingAESKey
*/
private String aesKey;
private String webURL;
private String host;
public String getAppId() {
return this.appId;
}
public void setAppId(String appId) {
this.appId = appId;
}
public String getSecret() {
return this.secret;
}
public void setSecret(String secret) {
this.secret = secret;
}
public String getToken() {
return this.token;
}
public void setToken(String token) {
this.token = token;
}
public String getAesKey() {
return this.aesKey;
}
public void setAesKey(String aesKey) {
this.aesKey = aesKey;
}
@Override
public String toString() {
return ToStringBuilder.reflectionToString(this,
ToStringStyle.MULTI_LINE_STYLE);
}
public String getWebURL() {
return webURL;
}
public void setWebURL(String webURL) {
this.webURL = webURL;
}
public String getHost() {
return host;
}
public void setHost(String host) {
this.host = host;
}
}
4.新建一个WechatMpConfiguration来读取配置,装载微信SDK服务。
对于里面包含微信的各种事件,如果不需要的话可以删除,百度一下微信回调,用百度到的那个方法也行。但是其中的那些被@bean注解注释的服务还是需要保留装载的。除了最后一个route()。
其次微信各种事件太多了,这边就不一一罗列了,我已经将完整的demo上传的csdn了有需要的点击下方传送门下载。
传送门:完整demo传送门
package com.dxg.wechatdemo.weixin.pm.config;
import com.dxg.wechatdemo.weixin.pm.handler.AbstractHandler;
import com.dxg.wechatdemo.weixin.pm.handler.KfSessionHandler;
import com.dxg.wechatdemo.weixin.pm.handler.LocationHandler;
import com.dxg.wechatdemo.weixin.pm.handler.MenuHandler;
import com.dxg.wechatdemo.weixin.pm.handler.MsgHandler;
import com.dxg.wechatdemo.weixin.pm.handler.NullHandler;
import com.dxg.wechatdemo.weixin.pm.handler.ScanHandler;
import com.dxg.wechatdemo.weixin.pm.handler.StoreCheckNotifyHandler;
import com.dxg.wechatdemo.weixin.pm.handler.SubscribeHandler;
import com.dxg.wechatdemo.weixin.pm.handler.UnsubscribeHandler;
import me.chanjar.weixin.common.api.WxConsts.EventType;
import me.chanjar.weixin.common.api.WxConsts.MenuButtonType;
import me.chanjar.weixin.common.api.WxConsts.XmlMsgType;
import me.chanjar.weixin.mp.api.WxMpConfigStorage;
import me.chanjar.weixin.mp.api.WxMpInMemoryConfigStorage;
import me.chanjar.weixin.mp.api.WxMpMessageRouter;
import me.chanjar.weixin.mp.api.WxMpService;
import me.chanjar.weixin.mp.constant.WxMpEventConstants;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* wechat mp configuration
*
* @author Binary Wang(https://github.com/binarywang)
*/
@Configuration
@ConditionalOnClass(WxMpService.class)
@EnableConfigurationProperties(WechatMpProperties.class)
public class WechatMpConfiguration {
// @Autowired
// protected LogHandler logHandler;
@Autowired
protected NullHandler nullHandler;
@Autowired
protected KfSessionHandler kfSessionHandler;
@Autowired
protected StoreCheckNotifyHandler storeCheckNotifyHandler;
@Autowired
private WechatMpProperties properties;
@Autowired
private LocationHandler locationHandler;
@Autowired
private MenuHandler menuHandler;
@Autowired
private MsgHandler msgHandler;
@Autowired
private UnsubscribeHandler unsubscribeHandler;
@Autowired
private SubscribeHandler subscribeHandler;
@Autowired
private ScanHandler scanHandler;
@Bean
@ConditionalOnMissingBean
public WxMpConfigStorage configStorage() {
WxMpInMemoryConfigStorage configStorage = new WxMpInMemoryConfigStorage();
configStorage.setAppId(this.properties.getAppId());
configStorage.setSecret(this.properties.getSecret());
configStorage.setToken(this.properties.getToken());
configStorage.setAesKey(this.properties.getAesKey());
return configStorage;
}
@Bean
@ConditionalOnMissingBean
public WxMpService wxMpService(WxMpConfigStorage configStorage) {
// WxMpService wxMpService = new me.chanjar.weixin.mp.api.impl.okhttp.WxMpServiceImpl();
// WxMpService wxMpService = new me.chanjar.weixin.mp.api.impl.jodd.WxMpServiceImpl();
// WxMpService wxMpService = new me.chanjar.weixin.mp.api.impl.apache.WxMpServiceImpl();
WxMpService wxMpService = new me.chanjar.weixin.mp.api.impl.WxMpServiceImpl();
wxMpService.setWxMpConfigStorage(configStorage);
return wxMpService;
}
@Bean
public WxMpMessageRouter router(WxMpService wxMpService) {
final WxMpMessageRouter newRouter = new WxMpMessageRouter(wxMpService);
// 记录所有事件的日志 (异步执行)
// newRouter.rule().handler(this.logHandler).next();
// 接收客服会话管理事件
newRouter.rule().async(false).msgType(XmlMsgType.EVENT)
.event(WxMpEventConstants.CustomerService.KF_CREATE_SESSION)
.handler(this.kfSessionHandler).end();
newRouter.rule().async(false).msgType(XmlMsgType.EVENT)
.event(WxMpEventConstants.CustomerService.KF_CLOSE_SESSION)
.handler(this.kfSessionHandler)
.end();
newRouter.rule().async(false).msgType(XmlMsgType.EVENT)
.event(WxMpEventConstants.CustomerService.KF_SWITCH_SESSION)
.handler(this.kfSessionHandler).end();
// 门店审核事件
newRouter.rule().async(false).msgType(XmlMsgType.EVENT)
.event(WxMpEventConstants.POI_CHECK_NOTIFY)
.handler(this.storeCheckNotifyHandler).end();
// 自定义菜单事件
newRouter.rule().async(false).msgType(XmlMsgType.EVENT)
.event(MenuButtonType.CLICK).handler(this.getMenuHandler()).end();
// 点击菜单连接事件
newRouter.rule().async(false).msgType(XmlMsgType.EVENT)
.event(MenuButtonType.VIEW).handler(this.nullHandler).end();
// 关注事件
newRouter.rule().async(false).msgType(XmlMsgType.EVENT)
.event(EventType.SUBSCRIBE).handler(this.getSubscribeHandler())
.end();
// 取消关注事件
newRouter.rule().async(false).msgType(XmlMsgType.EVENT)
.event(EventType.UNSUBSCRIBE)
.handler(this.getUnsubscribeHandler()).end();
// 上报地理位置事件
newRouter.rule().async(false).msgType(XmlMsgType.EVENT)
.event(EventType.LOCATION).handler(this.getLocationHandler())
.end();
// 接收地理位置消息
newRouter.rule().async(false).msgType(XmlMsgType.LOCATION)
.handler(this.getLocationHandler()).end();
// 扫码事件
newRouter.rule().async(false).msgType(XmlMsgType.EVENT)
.event(EventType.SCAN).handler(this.getScanHandler()).end();
// 默认
newRouter.rule().async(false).handler(this.getMsgHandler()).end();
return newRouter;
}
protected MenuHandler getMenuHandler() {
return this.menuHandler;
}
protected SubscribeHandler getSubscribeHandler() {
return this.subscribeHandler;
}
protected UnsubscribeHandler getUnsubscribeHandler() {
return this.unsubscribeHandler;
}
protected AbstractHandler getLocationHandler() {
return this.locationHandler;
}
protected MsgHandler getMsgHandler() {
return this.msgHandler;
}
protected AbstractHandler getScanHandler() {
return this.scanHandler;
}
}
四、微信公众与后台对接
将服务跑起来之后(端口是80),前往微信测试公众号;
修改–》保存 这时候最上方会有保存成功字样出现。
就此spring boot 就算接入微信开发中,希望这篇博客可以帮到你,如果帮你点个赞呗。
有什么问题可以私信或者留言询问,我看到就会回复。