在调试微信客服自动回复图片时,所有都是按照文档要求开发,但是无法自动回复
首先:自动回复配置如下:
第二:验证加密(通过):
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 (signature != null && WeChatUtil.checkSignature(signature, timestamp, nonce)) { logger.debug("signature == " + signature); try { PrintWriter print = response.getWriter(); print.write(echostr); print.flush(); } catch (IOException e) { logger.error("微信消息接收和token验证异常", e); } } } |
第三:自动回复
自动回复先上传临时素材到回信服务,并获取mediaId
//先上传临时素材到微信服务 String mediaId = uploadFileToWeChat(WeChatUtil.REQ_MESSAGE_TYPE_IMAGE); /** * 上传图片到微信服务 * * @param * @return */ @Override public String uploadFileToWeChat(String type) { String accessToken = weiXinToken.getAccessToken(); System.out.println("token == " + accessToken); RestTemplate restTemplate = new RestTemplate(); HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED); File file = new File(IMAGE_PATH); if (!file.exists() || !file.isFile()) { return null; } StringBuilder sb = new StringBuilder(); sb.append(weixinImageUpload) .append("access_token=") .append(accessToken) .append("&type=") .append(type); String mediaId = WeChatUtil.httpRequest(sb.toString(), file); return mediaId; } |
获取到mediaId后,然后自动回复开发
/** * 此处自动回复文本 */ TextMessageResponseVo textMessageResponseVo = new TextMessageResponseVo(); textMessageResponseVo.setFromUserName(requestMessageMap.get("ToUserName")); textMessageResponseVo.setToUserName(requestMessageMap.get("FromUserName")); textMessageResponseVo.setMsgType("text"); textMessageResponseVo.setCreateTime(System.currentTimeMillis() / 1000); textMessageResponseVo.setContent("你好"); /** * 此处自动回复图片 */ ImageMessageResponseVo imageMessageResponseVo = new ImageMessageResponseVo(); imageMessageResponseVo.setFromUserName(requestMessageMap.get("FromUserName")); imageMessageResponseVo.setToUserName(requestMessageMap.get("ToUserName")); imageMessageResponseVo.setMsgType("image"); imageMessageResponseVo.setCreateTime(System.currentTimeMillis() / 1000); AutoAnswer autoAnswer = new AutoAnswer(); autoAnswer.setMediaId(mediaId); imageMessageResponseVo.setImage(autoAnswer); System.out.println("textMessageResponseVo>>>>>>>>"+imageMessageResponseVo.toString()); String result = WeChatUtil.messageToXml(textMessageResponseVo); System.out.println("result XML CDATA +++++++++++++++++++++++++" + result); return result; /** * 文本消息转换成xml */ public static String messageToXml(TextMessageResponseVo textMessageResponseVo) { xstream.alias("xml", textMessageResponseVo.getClass()); return xstream.toXML(textMessageResponseVo); } /** * 图片 * @param imageMessageResponseVo * @return */ public static String messageToXml(ImageMessageResponseVo imageMessageResponseVo) { xstream.alias("xml", imageMessageResponseVo.getClass()); return xstream.toXML(imageMessageResponseVo); } /** * 扩展xstream使其支持CDATA */ private static XStream xstream = new XStream(new XppDriver() { @Override public HierarchicalStreamWriter createWriter(Writer out) { return new PrettyPrintWriter(out) { // 对所有xml节点的转换都增加CDATA标记 boolean cdata = true; @Override @SuppressWarnings("unchecked") public void startNode(String name, Class clazz) { super.startNode(name, clazz); } @Override protected void writeText(QuickWriter writer, String text) { if (cdata) { writer.write("<![CDATA["); writer.write(text); writer.write("]]>"); } else { writer.write(text); } } }; } }); |
最后,响应微信服务的是一串String的xml
//文本响应微信的xml<xml> <ToUserName><![CDATA[onv1V4-zyxgliQlXbaBujrNT-ycs]]></ToUserName> <FromUserName><![CDATA[gh_dc0815388d0f]]></FromUserName> <CreateTime><![CDATA[1570614951]]></CreateTime> <MsgType><![CDATA[text]]></MsgType> <Content><![CDATA[你好]]></Content></xml> //图片响应微信的xml <xml> <ToUserName><![CDATA[onv1V4-zyxgliQlXbaBujrNT-ycs]]></ToUserName> <FromUserName><![CDATA[gh_dc0815388d0f]]></FromUserName> <CreateTime><![CDATA[1570670451]]></CreateTime> <MsgType><![CDATA[image]]></MsgType> <Image> <MediaId><![CDATA[ukM01FczEHwYUthTQ_Sf_6XNgI1_2lScqCFuIWOs8zQ8CGp0kgH98SS8B4SxdznU]]></MediaId> </Image></xml> |
但是最后没有收到微信自动回复,请求各位大佬指教
;

这是httpRequest方法
/*** @param requestUrl 微信上传临时素材的接口url* @param file 要上传的文件* @return String 上传成功后,微信服务器返回的消息* @desc :微信上传素材的请求方法*/publicstaticString httpRequest(String requestUrl, File file) {StringBuffer buffer =newStringBuffer();try{//1.建立连接URL url =newURL(requestUrl);HttpURLConnection httpUrlConn = (HttpURLConnection) url.openConnection();//打开链接//1.1输入输出设置httpUrlConn.setDoInput(true);httpUrlConn.setDoOutput(true);httpUrlConn.setUseCaches(false);// post方式不能使用缓存//1.2设置请求头信息httpUrlConn.setRequestProperty("Connection","Keep-Alive");httpUrlConn.setRequestProperty("Charset","UTF-8");//1.3设置边界String BOUNDARY ="----------"+ System.currentTimeMillis();httpUrlConn.setRequestProperty("Content-Type","multipart/form-data; boundary="+ BOUNDARY);// 请求正文信息// 第一部分://2.将文件头输出到微信服务器StringBuilder sb =newStringBuilder();sb.append("--");// 必须多两道线sb.append(BOUNDARY);sb.append("\r\n");sb.append("Content-Disposition: form-data;name=\"media\";filelength=\""+ file.length()+"\";filename=\""+ file.getName() +"\"\r\n");sb.append("Content-Type:application/octet-stream\r\n\r\n");byte[] head = sb.toString().getBytes("utf-8");// 获得输出流OutputStream outputStream =newDataOutputStream(httpUrlConn.getOutputStream());// 将表头写入输出流中:输出表头outputStream.write(head);//3.将文件正文部分输出到微信服务器// 把文件以流文件的方式 写入到微信服务器中DataInputStream in =newDataInputStream(newFileInputStream(file));intbytes =0;byte[] bufferOut =newbyte[1024];while((bytes = in.read(bufferOut)) != -1) {outputStream.write(bufferOut,0, bytes);}in.close();//4.将结尾部分输出到微信服务器byte[] foot = ("\r\n--"+ BOUNDARY +"--\r\n").getBytes("utf-8");// 定义最后数据分隔线outputStream.write(foot);outputStream.flush();outputStream.close();//5.将微信服务器返回的输入流转换成字符串InputStream inputStream = httpUrlConn.getInputStream();InputStreamReader inputStreamReader =newInputStreamReader(inputStream,"utf-8");BufferedReader bufferedReader =newBufferedReader(inputStreamReader);String str =null;while((str = bufferedReader.readLine()) !=null) {buffer.append(str);}bufferedReader.close();inputStreamReader.close();// 释放资源inputStream.close();inputStream =null;httpUrlConn.disconnect();}catch(IOException e) {System.out.println("发送POST请求出现异常!"+ e);e.printStackTrace();}//4.json字符串转对象:解析返回值,json反序列化String result = buffer.toString().replaceAll("[\\\\]","");System.out.println("result:"+ result);JSONObject resultJSON = JSONObject.parseObject(result);returnresultJSON.getString("media_id");}检查下有没有拼错的单词~