Java实现微信公众号客服功能和本地联调

Java实现微信公众号客服功能

微信公众平台设置

  1. 生产环境 公众号 设置
    【开发】–> 【基本配置】–> 【服务器配置】
    在这里插入图片描述
    注:
    a、服务器地址(URL) 是开发者用来接收微信消息和事件的接口URL。
    b、令牌(Token) 是自定义的。
    在这里插入图片描述

  2. 测试环境 公众号 设置 (用于本地环境测试)
    【开发】 -->【开发者工具】–> 【公众平台测试账号】
    在这里插入图片描述
    在这里插入图片描述
    登录之后,在【接口配置信息】处配置URL
    在这里插入图片描述
    注: 生产环境公众号的服务器地址就是测试账号 接口配置信息 的URL。

Java 代码

注: 用户发送消息给微信公众号时,微信会Get请求上面设置的服务器地址,并传递四个参数:signaturetimestampnonceechostr
这几个参数是用来验证请求是否来源于微信。
在这里插入图片描述

代码如下:

  1. interface类
public interface WechatServiceI {

    /**
     * token验证
     * @param signature
     * @param timestamp
     * @param nonce
     * @return
     */
    boolean checkSignature(String signature,String timestamp,String nonce);

}
  1. 实现类
@Service("wechatService")
public class WechatServiceImpl implements WechatServiceI {

    @Override
    public boolean checkSignature(String signature,String timestamp,String nonce) {
        return WechatUtil.checkSignature(signature,timestamp,nonce);
    }

}
  1. 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;
    }

}
  1. 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,免费的。

  1. 注册账号在这里插入图片描述
  2. 下载
  3. 登录,申请免费隧道
    在这里插入图片描述
    在这里插入图片描述
  4. 在 【我的隧道】 配置
    在这里插入图片描述
    在这里插入图片描述
  5. 双击 natapp.exe
    在这里插入图片描述
    执行命令:natapp -authtoken authtoken码
    authtoken码在【我的隧道】复制出来就好了。
    这样表示映射到公网了:
    在这里插入图片描述

将整个路径配置到微信公众平台

我这里的全路径是:http://ffhrug.natappfree.cc/wechatService/checkToken.do
wechatService是controller设置的路径
你们按照自己的路径配置就好。最最最重要的一点,这个地址必须是免登录的,不能被框架拦截跳转去登录页面,在springmvc拦截器配置一下。

测试

【点击提交】
在这里插入图片描述
成功进入断点
在这里插入图片描述
在这里插入图片描述

实现用户消息转发给客服

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


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