微信官方文档 - 小程序

/*** 客服功能 - 自动回复小程序APP链接* Created by Lance on 2020/10/10 17:52*/
@Slf4j
@Api(description = "客服功能")
@ApiPath("/api/wm-user/autoResponse")
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class AutoResponseApi {private final AutoResponseService autoResponseService;@Value("${token.access_token}")private final String access_token;private final CrmUtils crmUtils; // 用于获取微信的 tocken@ApiOperation("微信消息通知-GET请求校验(确认请求来自微信服务器)")@GetMapping("/getSignature")public String signature(HttpServletRequest request, HttpServletResponse response) {//微信加密签名,signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数String signature = request.getParameter("signature");// 时间戳String timestamp = request.getParameter("timestamp");// 随机数String nonce = request.getParameter("nonce");// 随机字符串String echostr = request.getParameter("echostr");log.info("echostr>>>>>>>>>>" + echostr);//通过检验signature对请求进行校验,若校验成功则原样返回echostr,否则接入失败if (checkSignature(signature, timestamp, nonce)) {log.info("echostr>>>>>>>>>>>>" + echostr);return echostr;}log.info("客服消息验证url验证结果:{}", echostr);return null;}@ApiOperation("微信消息通知-POST请求校验(确认请求来自微信服务器)")@PostMapping("/postSignature")public String response(HttpServletRequest request, HttpServletResponse response) {try {// 接收消息并返回消息String result = acceptMessage(request, response);log.info("接受消息并返回消息result>>>>>>" + result);// 响应消息PrintWriter out = response.getWriter();log.info("out>>>>>>>>" + out);out.print(result);out.close();} catch (Exception ex) {log.error("微信帐号接口配置失败!" + ex.getMessage());ex.printStackTrace();}return null;}/*** 校验(确认请求来自微信服务器)** @param signature* @param timestamp* @param nonce* @return*/public boolean checkSignature(String signature, String timestamp, String nonce) {String[] params = {access_token, timestamp, nonce};log.info("params>>>>>>>>>>>>>" + Arrays.toString(params));//1、将token、timestamp、nonce三个参数进行字典序排序Arrays.sort(params);//2、将三个参数字符串拼接成一个字符串StringBuilder sb = new StringBuilder();for (String param : params) {sb.append(param);}log.info("字符串拼接>>>>>>>>>>>>>>>>>" + sb);MessageDigest messageDigest = null;String tpmStr = null;try {messageDigest = MessageDigest.getInstance("SHA-1");log.info("md>>>>>>>>>>>>" + messageDigest);//3、将三个参数字符串拼接成一个字符串进行sha1加密byte[] digest = messageDigest.digest(sb.toString().getBytes());log.info("digest>>>>>>>>>>>" + Arrays.toString(digest));tpmStr = StringUtils.byteToHex(digest);log.info("加密串>>>>>>>>>>>" + tpmStr);} catch (Exception e) {log.info("错误信息>>>>>>>>>>>>" + e.getMessage());e.printStackTrace();}//4、将sha1加密后的字符串可与signature对比,标识该请求来源于微信return tpmStr != null && tpmStr.equals(signature);}public String acceptMessage(HttpServletRequest request, HttpServletResponse response) {//返回值String result = "success";try {// 将请求、响应的编码均设置为UTF-8(防止中文乱码)request.setCharacterEncoding("UTF-8");response.setCharacterEncoding("UTF-8");Map<String, String> requestMap = MessageUtils.parseXml(request);log.info("requestMap>>>>>>>>>>" + requestMap);// 发送者的openidString fromUserName = requestMap.get("FromUserName");// 小程序的原始IDString toUserName = requestMap.get("ToUserName");// 消息类型String msgType = requestMap.get("MsgType");// 文本消息内容String content = requestMap.get("Content");// 事件类型String event = requestMap.get("Event");log.info("fromUserName=" + fromUserName + ",toUserName=" + toUserName + ",msgType=" + msgType + ",content=" + content + ",event=" + event);StringBuffer contentMessage = new StringBuffer();if (msgType.equals("event")) {contentMessage.append("欢迎进入威马客服咨询!人工服务请输入0").append("\n");log.info(autoResponseService.sendCustomerTextMessage(fromUserName, contentMessage.toString(), crmUtils.getToken()));} else if (msgType.equals("text")) {//文本消息if (content.equals("0")) {return autoResponseService.switchCustomerService(fromUserName, toUserName);} else {contentMessage.append("欢迎进入威马客服咨询!人工服务请输入0").append("\n");log.info(autoResponseService.sendCustomerTextMessage(fromUserName, contentMessage.toString(), crmUtils.getToken()));}} else {contentMessage.append("欢迎进入XXX客服咨询!人工服务请输入0").append("\n");log.info(autoResponseService.sendCustomerTextMessage(fromUserName, contentMessage.toString(), crmUtils.getToken()));}} catch (Exception e) {log.info("错误信息打印>>>>>>>>>>>" + e.getMessage());e.printStackTrace();}return result;}}
/*** 客服功能 - 字符串转换* Created by Lance on 2020/10/12 10:52*/
@Slf4j
public class StringUtils {/*** 十六进制字节数组转为字符串** @param hash* @return*/public 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;}
}
/*** 客服功能 - 消息工具类* Created by Lance on 2020/10/10 17:52*/
public class MessageUtils {public static Map<String, String> parseXml(HttpServletRequest request) throws Exception {// 将解析结果存储在HashMap 中Map<String, String> map = new HashMap<String, String>();// 从request 中取得输入流InputStream inputStream = request.getInputStream();// 读取输入流SAXReader reader = new SAXReader();Document document = reader.read(inputStream);// 得到xml 根元素Element root = document.getRootElement();// 得到根元素的所有子节点List<Element> elementList = root.elements();// 遍历所有子节点for (Element e : elementList) {map.put(e.getName(), e.getText());}// 释放资源inputStream.close();return map;}
}

/*** 客服功能 - 消息发送请求工具类* Created by Lance on 2020/10/10 17:52*/
public class HttpUtils {/*** Get 发送的请求* @param url* @return*/public static String sendGetRequest(String url) {RestTemplate restTemplate = new RestTemplate();return restTemplate.getForObject(url, String.class);}public static String sendPostRequest(String url, HttpMethod method, HttpEntity<Map<String, Object>> httpEntity) {RestTemplate restTemplate = new RestTemplate();ResponseEntity<String> response = restTemplate.exchange(url, method, httpEntity, String.class);return response.getBody();}
}
/*** 客服功能 - 自动回复小程序APP链接* Created by Lance on 2020/10/10 11:03*/
@Slf4j
@Service
public class AutoResponseService {/*** 人工服务** @param fromUserName* @param toUserName* @param requestMap* @return*/public String switchCustomerService(String fromUserName, String toUserName) {String returnXml = "<xml>\n" +"    <ToUserName><![CDATA[" + fromUserName + "]]></ToUserName>\n" +"    <FromUserName><![CDATA[" + toUserName + "]]></FromUserName>\n" +"    <CreateTime>" + System.currentTimeMillis() / 1000 + "</CreateTime>\n" +"    <MsgType><![CDATA[transfer_customer_service]]></MsgType>\n" +"</xml>";log.info("人工服务result>>>>>>>" + returnXml);return returnXml;}/*** 文本消息** @param openid* @param text* @param accessToken* @return*/private static String SEND_URL = "https://api.weixin.qq.com/cgi-bin/message/custom/send";//固定发送地址public String sendCustomerTextMessage(String openid, String text, String accessToken) throws IOException {HashMap<String, Object> map_content = new HashMap<>();map_content.put("content", text);HashMap<String, Object> map = new HashMap<>();map.put("touser", openid);map.put("msgtype", "text");map.put("text", map_content);String content = JSON.toJSONString(map);log.info("文本消息content" + content);HttpHeaders headers = new HttpHeaders();headers.setContentType(MediaType.APPLICATION_JSON);HttpEntity httpEntity = new HttpEntity(map, headers);String str = HttpUtils.sendPostRequest(SEND_URL + "?access_token=" + accessToken, HttpMethod.POST, httpEntity);log.info("文本消息str>>>>>>>>>>"+str);return str;}
}

Java实现微信小程序客服功能相关推荐

  1. 最全的java对接微信小程序客服功能实现(包含自动回复文本消息、图片消息,进入人工客服)

    java对接微信小程序客服功能实现(包含自动回复文本消息.图片消息,进入人工客服) 第一步:请求校验(确认请求来自微信服务器) 代码如下: @ApiOperation(value = " 微 ...

  2. java实现微信小程序客服功能开发,后台接受用户发送消息实现关键词自动回复

    最近做了一个小程序中间用到了小程序客服功能,主要实现采集用户提问,并且针对关键词自动回复及手动回复.中间踩过很多坑,所也现在记录下来提供给大家. 准备 首先准备一个小程序,配置好域名,左边菜单栏目点击 ...

  3. java实现微信小程序客服功能开发

    第一步:先在后台接入配置URL 官方文档:https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/custome ...

  4. 微信小程序客服功能 把当前页面的信息卡片发送给客服

    微信小程序开发交流qq群   173683895    承接微信小程序开发.扫码加微信. 正文: 需求:微信小程序客服带详情页 , 场景:一个人通过微信小程序接入微信客服,聊天后带上入口链接 效果图: ...

  5. 微信小程序客服功能简单使用

    有时候在小程序中我们需要客服功能,翻看了文档之后发现小程序有内置的客户功能,最简答的用法就是用button组件的开发能力就可以直接调用 <button open-type='contact'&g ...

  6. 微信小程序 客服功能 客服消息

    很多应用场景,需要小程序的客服功能,只需要按照官方配置设置好,就OK. 官网文档参考地址: https://developers.weixin.qq.com/miniprogram/dev/compo ...

  7. 微信小程序客服功能,并在聊天页面获取用户头像昵称

    1.页面内容 利用定位设置button为透明按钮触发客服功能 <view class='list'> <button type='default' open-type="c ...

  8. 微信小程序客服系统手机版五大功能介绍

    很多朋友小程序上线后,客服消息这块一直没得到解决.小程序客服消息只能在PC端回复,是让众多小程序运营商及商家头疼的问题,因为一个再牛逼的客服,也不可能随时随地都抱着电脑,这就导致很多用户的留言不能及时 ...

  9. 史上最简单最全 java后端对接微信小程序客服教程

    文章参考--配置消息推送 小程序发版体验成员使用步骤 遇到的几个问题 先分享一下遇到的几个问题 提交消息推送服务起一直提示token校验失败 是因为没有启动项目 微信无法校验链接正确性 体验用户无法正 ...

最新文章

  1. Android 获取联网的IP地址
  2. 广义的B端产品人,都是什么职位?
  3. WPF中桌面屏保的制作(主要代码)
  4. eclipse web项目 解决“Dynamic Web Module 3.0 requires J
  5. 【GNN】2022年最新3篇GNN领域综述!
  6. 使用C# lock同时访问共享数据
  7. 如何从零开始开发一款嵌入式产品(20年的嵌入式经验分享学习,来自STM32神舟系列开发板设计师的总结)
  8. 英文书: Python 网络编程基础手册
  9. 你想让网站排名在百度或GOOGLE的第一位吗
  10. 静态编译和动态编译的区别【转】
  11. 数学建模冲刺篇(灵敏度分析)
  12. vivado查看原理图
  13. 改变iOS searchBar中textField的背景颜色
  14. matlab如何编newton-raphson,Matlab中的Newton-Raphson方法
  15. android连路由器 mtu,解决app无网络问题,将宽带路由器MTU从1500修改成1480
  16. 无觅科技分析:如何通过WhatsApp云手机,抢滩海外私域运营市场
  17. PAT 7-5 哥尼斯堡的“七桥问题” (25 分)(解题报告)
  18. Mixins在组件中的使用方法
  19. Maven插件wagon-maven-plugin自动化部署Java项目到Linux远程服务器
  20. 642-825 认证题库

热门文章

  1. POJ - 3287 The Trip, 2007
  2. 信用卡欺诈检测案例实践(机器学习)
  3. 可变频率正弦信号发生器的FPGA实现(Quartus)
  4. Linux系统性能监控命令系列之 lsof
  5. 各国语言代码表与多语言支持
  6. ADS处理lpc文件
  7. 招商银行信用卡重要通知:消费提醒服务调整,300元以下消费不再逐笔发送短信...
  8. 倾情奉献 绝色美男《青空下》漫画教程
  9. 论文笔记11:Understanding the seasonal variations of land surface temperature in Nanjing urban area based
  10. python写个消消乐小游戏