Java实现微信公众号客服功能
微信公众平台设置
生产环境 公众号 设置
【开发】–> 【基本配置】–> 【服务器配置】
注:
a、服务器地址(URL) 是开发者用来接收微信消息和事件的接口URL。
b、令牌(Token) 是自定义的。
测试环境 公众号 设置 (用于本地环境测试)
【开发】 -->【开发者工具】–> 【公众平台测试账号】

登录之后,在【接口配置信息】处配置URL
注: 生产环境公众号的服务器地址就是测试账号 接口配置信息 的URL。
Java 代码
注: 用户发送消息给微信公众号时,微信会Get请求上面设置的服务器地址,并传递四个参数:signature、timestamp、nonce、echostr。
这几个参数是用来验证请求是否来源于微信。
代码如下:
- interface类
public interface WechatServiceI {
/**
* token验证
* @param signature
* @param timestamp
* @param nonce
* @return
*/
boolean checkSignature(String signature,String timestamp,String nonce);
}
- 实现类
@Service("wechatService")
public class WechatServiceImpl implements WechatServiceI {
@Override
public boolean checkSignature(String signature,String timestamp,String nonce) {
return WechatUtil.checkSignature(signature,timestamp,nonce);
}
}
- WechatUtil类
public class WechatUtil {
private static final String TOKEN = "自定义";
public static boolean checkSignature(String signature, String timestamp, String nonce){
String [] arr = new String[]{TOKEN,timestamp,nonce};
// 将token、timestamp、nonce三个参数进行字典序排序
Arrays.sort(arr);
StringBuilder content = new StringBuilder();
for (int i = 0; i < arr.length; i++){
content.append(arr[i]);
}
MessageDigest digest = null;
String tempStr = null;
try {
digest = MessageDigest.getInstance("SHA-1");
// 将三个参数字符串拼接成一个字符串进行sha1加密
byte [] str = digest.digest(content.toString().getBytes());
tempStr = byteToHex(str);
}catch (NoSuchAlgorithmException e){
e.printStackTrace();
}
// 将sha1加密后的字符串可与signature对比,标识该请求来源于微信
return tempStr != null ? tempStr.equals(signature) : false;
}
private static String byteToHex(final byte[] hash){
Formatter formatter = new Formatter();
for (byte b : hash){
formatter.format("%02x",b);
}
String result = formatter.toString();
formatter.close();
return result;
}
}
- Controller
@Controller
@RequestMapping("/wechatService")
public class WechatController extends BaseController {
private static final Logger logger = Logger.getLogger(WechatController.class);
@Autowired
private WechatServiceI wechatService;
@RequestMapping(value = "/checkToken",method = RequestMethod.GET)
public void checkToken(HttpServletRequest request, HttpServletResponse response){
boolean isGet = request.getMethod().toLowerCase().equals("get");
if(isGet){
//微信加密签名
String signature = request.getParameter("signature");
// 时间戳
String timestamp = request.getParameter("timestamp");
// 随机数
String nonce = request.getParameter("nonce");
// 随机字符串
String echostr = request.getParameter("echostr");
// 通过检验signature对请求进行校验,若校验成功则原样返回echostr,表示接入成功,否则接入失败
if(null != signature && wechatService.checkSignature(signature,timestamp,nonce)){
try {
PrintWriter printWriter = response.getWriter();
printWriter.write(echostr);
printWriter.flush();
}catch (Exception e){
logger.error("微信消息接收和token验证异常", e);
}
}
}
}
}
将本地项目地址映射到公网
这里我建议大家使用natapp,免费的。
- 注册账号

- 下载
- 登录,申请免费隧道


- 在 【我的隧道】 配置


- 双击 natapp.exe

执行命令:natapp -authtoken authtoken码
authtoken码在【我的隧道】复制出来就好了。
这样表示映射到公网了:
将整个路径配置到微信公众平台
我这里的全路径是:http://ffhrug.natappfree.cc/wechatService/checkToken.do
你们按照自己的路径配置就好。最最最重要的一点,这个地址必须是免登录的,不能被框架拦截跳转去登录页面,在springmvc拦截器配置一下。
测试
【点击提交】
成功进入断点

实现用户消息转发给客服
流程:
a、用户发送消息给微信公众号
b、微信公众号接收消息,并通过Post方式请求【服务器配置】中配置的URL,并将参数通过服务器方式传递过去
c、将消息分配给在线的客服,msgType 设置为 “transfer_customer_service” 时,微信会自动帮你推送给在线客服,在线客服在客服平台接入之后,即可回复用户。
代码:
Controller
实体类:@XStreamCDATA注解是自定义的
接收用户消息类
回复用户消息类
注解类
创建XStreamFactory类,用于将对象转为 xml字符串,或者将xml字符串转为对象。
Util类
效果:

版权声明:本文为helloLadyYang原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。