官网开发文档:https://developers.weixin.qq.com/doc/offiaccount/Getting_Started/Getting_Started_Guide.html 不过上面开始的简单服务器搭建都是python做的。
注册一个自己的微信公众号 登陆微信公众平台,微信公众平台 - 开发 - 基本配置,开启公众号开发者功能,获取AppID和AppSecret,配置服务器。官网提供的是python的方式配置服务器。
@GetMapping ( "/weixin" )
public String checkSignature ( String echostr, String signature, Long timestamp, Long nonce) {
System . out. println ( "echostr: " + echostr) ;
System . out. println ( "signature: " + signature) ;
System . out. println ( "timestamp: " + timestamp) ;
System . out. println ( "nonce: " + nonce) ;
return echostr;
}
开启服务接收消息的功能。开启功能之后,给公众发送的消息会议下面服务器地址post请求的方式将xml消息数据包填写在url上面。
< xml>
< ToUserName> <![CDATA[toUser]]> </ ToUserName>
< FromUserName> <![CDATA[fromUser]]> </ FromUserName>
< CreateTime> 1348831860</ CreateTime>
< MsgType> <![CDATA[text]]> </ MsgType>
< Content> <![CDATA[this is a test]]> </ Content>
< MsgId> 1234567890123456</ MsgId>
< MsgDataId> xxxx</ MsgDataId>
< Idx> xxxx</ Idx>
</ xml>
参数 官方文档有介绍 描述 ToUserName 开发者微信号 FromUserName 发送方帐号(一个OpenID) CreateTime 消息创建时间 (整型) MsgType 消息类型,文本为text Content 文本消息内容 MsgId 消息id,64位整型 MsgDataId 消息的数据ID(消息如果来自文章时才有) Idx 多图文时第几篇文章,从1开始(消息如果来自文章时才有)
package com. test. verification_code. pojo ;
import javax. xml. bind. annotation. XmlElement ;
import javax. xml. bind. annotation. XmlRootElement ;
import java. io. Serializable ;
@Data
@XmlRootElement ( name = "xml" )
public class ReceiveMessage implements Serializable {
private static final long serialVersionUID = 1L ;
@XmlElement ( name = "ToUserName" )
private String ToUserName ;
@XmlElement ( name = "FromUserName" )
private String FromUserName ;
@XmlElement ( name = "CreateTime" )
private Long CreateTime ;
@XmlElement ( name = "MsgType" )
private String MsgType ;
@XmlElement ( name = "Content" )
private String Content ;
@XmlElement ( name = "MsgId" )
private Long MsgId ;
@XmlElement ( name = "MsgDataId" )
private Long MsgDataId ;
@XmlElement ( name = "Idx" )
private Long Idx ;
}
被动回复消息实体类准备
< xml>
< ToUserName> <![CDATA[toUser]]> </ ToUserName>
< FromUserName> <![CDATA[fromUser]]> </ FromUserName>
< CreateTime> 12345678</ CreateTime>
< MsgType> <![CDATA[text]]> </ MsgType>
< Content> <![CDATA[你好]]> </ Content>
</ xml>
参数 是否必须 描述 ToUserName 是 接收方帐号(收到的OpenID) FromUserName 是 开发者微信号 CreateTime 是 消息创建时间 (整型) MsgType 是 消息类型,文本为text Content 是 回复的消息内容(换行:在 content 中能够换行,微信客户端就支持换行显示)
@XmlRootElement ( name = "xml" )
public class SendMessage implements Serializable {
private static final long serialVersionUID = 1L ;
@XmlElement ( name = "ToUserName" )
private String ToUserName ;
@XmlElement ( name = "FromUserName" )
private String FromUserName ;
@XmlElement ( name = "CreateTime" )
private Long CreateTime ;
@XmlElement ( name = "MsgType" )
private String MsgType ;
@XmlElement ( name = "Content" )
private String Content ;
@Override
public String toString ( ) {
return "<xml>" +
"<ToUserName>" + ToUserName + "</ToUserName>" +
"<FromUserName>" + FromUserName + "</FromUserName>" +
"<CreateTime>" + CreateTime + "</CreateTime>" +
"<MsgType>" + MsgType + "</MsgType>" +
"<Content>" + Content + "</Content>" +
"</xml>" ;
}
}
service准备,用redis缓存验证码,设置过期时间5分钟
@Service
public class CodeServiceImpl implements CodeService {
@Autowired
private RedisTemplate < String , Object > redisTemplate;
public String getCode ( String key) {
Object result = redisTemplate. opsForValue ( ) . get ( key) ;
if ( result == null ) {
return null ;
}
return result. toString ( ) ;
}
public void createCode ( String key, Object code) {
redisTemplate. opsForValue ( ) . set ( key, code, 5 , TimeUnit . MINUTES) ;
}
}
controller处理接收的消息,被动回复消息
@PostMapping ( value = "/weixin" , consumes = "text/xml" , produces = "text/xml" )
public String getMessage ( @RequestBody ReceiveMessage receiveMessage) {
System . out. println ( receiveMessage) ;
if ( receiveMessage. getContent ( ) . equals ( "验证码" ) ) {
String code = codeService. getCode ( receiveMessage. getToUserName ( ) ) ;
if ( code == null ) {
code = CodeUtils . getCode ( 4 ) ;
codeService. createCode ( receiveMessage. getToUserName ( ) , code) ;
}
System . out. println ( "验证码:" + code) ;
SendMessage sendMessage = new SendMessage ( ) ;
sendMessage. setContent ( "验证码是: " + code + ",有效期5分钟" ) ;
sendMessage. setCreateTime ( receiveMessage. getCreateTime ( ) ) ;
sendMessage. setFromUserName ( receiveMessage. getToUserName ( ) ) ;
sendMessage. setToUserName ( receiveMessage. getFromUserName ( ) ) ;
sendMessage. setMsgType ( "text" ) ;
return sendMessage. toString ( ) ;
}
return "success" ;
}