准备
外网映射工具
Natapp网址ngrok
NATAPP-内网穿透 基于ngrok的国内高速内网映射工具
windows环境运行
运行 natapp -authtoken=a021a8fe913ea048
http://dm.natapp1.cc/wx/portal/ wx6f8ce0ccadf3afff
WxJava框架快速开发微信公众号
WxJava 微信公众号框架 GitHub - Wechat-Group/WxJava: 微信开发 Java SDK ,支持包括微信支付,开放平台,小程序,企业微信,公众号等的后端开发
微服务电商项目引入WxJava框架
<dependency>
<groupId>com.github.binarywang</groupId>
<artifactId>weixin-java-mp</artifactId>
<version>3.3.0</version>
</ dependency>
java.lang.NoSuchMethodError: com.thoughtworks.xstream.io.xml.XppDriver.<init>(Lcom/thoughtworks/xstream/io/naming/NameCoder;)
错误原因是微信框架引入了xstream的版本为1.4.1 而springCloud中eureka-client也引入了xstream为了1.4.9从而版本有冲突。
正确方式:
<dependency>
<groupId>com.github.binarywang</groupId>
<artifactId>weixin-java-mp</artifactId>
<version>3.3.0</version>
<exclusions>
<exclusion>
<artifactId>xstream</artifactId>
<groupId>com.thoughtworks.xstream</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>
spring-cloud-starter-netflix-eureka-client
</artifactId>
<exclusions>
<exclusion>
<artifactId>xstream</artifactId>
<groupId>com.thoughtworks.xstream</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<artifactId>xstream</artifactId>
<groupId>com.thoughtworks.xstream</groupId>
<version>1.4.10</version>
</dependency>
yml配置 :
logging:
level:
org.springframework.web: INFO
com.github.binarywang.demo.wx.mp: DEBUG
me.chanjar.weixin: DEBUG
wx:
mp:
configs:
- appId: wx6f8ce0ccadf3afff #(一个公众号的appid)
secret: cf2b0b4908a84d92b38b939a6fbabe09#(公众号的appsecret)
token: dmabc123#(接口配置里的Token值)dm:
weixin:
registration:
code:
###微信注册码消息
message: 您的注册码为:registrationCodeMessage。
###默认提示消息
default:
registration:
code:
message: 您的消息,我们已经收到,会及时回复给您的!
微信公众号开发案例
案例1
关注微信公众号,在公众号输入手机号码,对应返回验证码
@Component
public class MsgHandler extends AbstractHandler {
// 用户发送手机验证码提示
@Value("${dm.weixin.registration.code.message}")
private String registrationCodeMessage;
// 默认用户发送验证码提示
@Value("${dm.weixin.default.registration.code.message}")
private String defaultRegistrationCodeMessage;
@Override
public WxMpXmlOutMessage handle(WxMpXmlMessage wxMessage, Map<String, Object> context, WxMpService weixinService,
WxSessionManager sessionManager) {
if (!wxMessage.getMsgType().equals(XmlMsgType.EVENT)) {
// TODO 可以选择将消息保存到本地
}
// 当用户输入关键词如“你好”,“客服”等,并且有客服在线时,把消息转发给在线客服
try {
if (StringUtils.startsWithAny(wxMessage.getContent(), "你好", "客服")
&& weixinService.getKefuService().kfOnlineList().getKfOnlineList().size() > 0) {
return WxMpXmlOutMessage.TRANSFER_CUSTOMER_SERVICE().fromUser(wxMessage.getToUser())
.toUser(wxMessage.getFromUser()).build();
}
} catch (WxErrorException e) {
e.printStackTrace();
}
// TODO 组装回复消息
// 1.验证关键字是否为手机号码类型
String fromMsg = wxMessage.getContent();
if (RegexUtils.checkMobile(fromMsg)) {
// 如果发送消息为手机号码类型,则发送短信验证码
int registCode = registCode();
String retContext = registrationCodeMessage.replaceAll("registrationCodeMessage", registCode + "");
return new TextBuilder().build(retContext, wxMessage, weixinService);
}
return new TextBuilder().build(defaultRegistrationCodeMessage, wxMessage, weixinService);
}
// 获取注册码
private int registCode() {
int registCode = (int) (Math.random() * 9000 + 1000);
return registCode;
}
}
注意:后期可以将验证码放到redis中。