前言
最近做了一个微信客服的后台(基于Springboot),需要自动回复用户的消息,但是,其中遇到有些坑,这里稍微讲一下(前提你已经在小程序的后台配置了相关的参数,如图1)
图1
后台接口
1.获取access_token
根据微信后台文档:https://developers.weixin.qq.com/miniprogram/dev/api-backend/getAccessToken.html
文档里说,不能经常获取,否则就要出错,因此,这里设置定时任务,每一个小时去获取一次。在Springboot中可以使用@Scheduled(fixedDelay = 60 * 60 * 1000)这个注解来实现定时任务,这里代码就略过了
2.接口
这里其实配置两个接口来和微信进行通信,1,验证你的服务器地址URL,就是需要在图1,请求方式是GET,具体的可以看微信的文档;2,接收用户发来的消息,其实地址也是图1中的URL是一样的,只是这个请求方式是POST,见代码
/**
* @author helang
*/
@RestController
public class WxTestController {
/**
* 接收微信后台发来的用户消息
* @return
*/
@RequestMapping(value = "wx/message", method = RequestMethod.POST)
@ResponseBody
public String receiveMessage(@RequestBody Map<String, Object> msg) {
//token
sendMsToCustomer("token",msg.get("FromUserName").toString());
return "success";
}
/**
* 微信校验后台服务器
* 需要做一些sha1等判断后,如果相同的话,直接返回echostr,
* 这里代码略过,直接返回echostr
* @return
*/
@RequestMapping(value = "wx/message", method = RequestMethod.GET)
@ResponseBody
public String checkValid(String signature, long timestamp, String nonce, String echostr) {
return echostr;
}
/**
* 发送消息给用户
* @param fromUserName 用户的openId
*/
private void sendMsToCustomer(String access_token, String fromUserName) {
RestTemplate restTemplate = new RestTemplate();
String messageJson = "";//
//access_token
String result = restTemplate.postForEntity("https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token=xxxxxx",
messageJson, String.class).getBody();
}
}
问题
如上图的接收消息的接口receiveMessage(),当我使用@RequestBody Bean的时候,始终无法接收到消息,微信后台配置的是JSON格式的交互啊,难道我哪里错了?由于配置的是线上服务器,我这边抓包是很困难的,一直无法查清楚微信给发来的http请求的内容是什么,导致困扰了一两天。功夫不负有心人,我多方尝试,那个参数类型,将它从Bean改为map后,终于可以收到微信发来的消息内容了
总结
这个微信后台开发,只要按照微信官方文档来做,其实是很简单的。遇到这个参数问题,能够抓包看,就抓包,当不能抓包的时候,多多尝试其他方法