1 文本超连接
微信开发中,文本超链接的实现其实就是将HTML中的<a>标签嵌入Java程序中。
以以下代码为例:
1 <a href=\"http://blog.leanote.com/qce.hui@qq.com\">祁俊辉's Blog</a>
实际上这段代码将存储在String类型的变量中。
众所周知,String类型的值应该使用双引号括起来的,但是超链接中也有双引号,需要注意的是,在超链接双引号的前面需要加转义字符“\”,否则编译器报错。
2 表情
需要注意:表情虽然呈现的是一个动态表情图片,但实际上在微信公众平台的消息接口中却属于文本消息类型(text)。
现在微信已改版,不管是QQ表情、emoji表情,或是新增的表情,总之每个表情都有一个与之对应的代码。这个代码可以通过往公众号发送表情的方式查看,公众号接收到的信息就是这个表情的代码。
同样,公众号若将此代码以String类型返回给用户,用户所看到的会自动转为表情。
公共表情(即微信支持的表情)可以以这样的方法发送并正常显示,若是使用输入法自带的表情,可能会因为手机版本、类型不同而导致表情无法正常显示。
3 代码更新
1 protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 2 3 req.setCharacterEncoding("UTF-8");//转换编码方式 4 resp.setCharacterEncoding("UTF-8"); 5 PrintWriter out = resp.getWriter();//通过PrintWriter返回消息至微信后台 6 7 //接收消息 8 try { 9 Map<String,String> map = MessageUtil.xmlToMap(req); 10 String fromUserName = map.get("FromUserName");//发送方帐号(一个OpenID) 11 String toUserName = map.get("ToUserName");//开发者微信号 12 String msgType = map.get("MsgType");//text//如果是文本消息的话,MsgType="text" 13 String content = map.get("Content");//文本消息内容 14 15 String message = null;//存储返回的xml文件内容 16 //判断是否为文本消息 17 if("text".equals(msgType)) { 18 String content_result = null;//存储返回的文本消息内容 19 //如果是前缀是回复,则返回使用者的话 20 if(content.startsWith("回复:")) { 21 content_result = "您发送的消息是:" + content.substring(3);//返回消息。注:从第一个分号开始截取 22 } 23 //如果前缀是翻译,则返回使用者翻译后的话 24 else if(content.startsWith("翻译:")) { 25 //1.先翻译 26 final String APP_ID = "20170709000063735";//账号 27 final String SECURITY_KEY = "EiXpUVJAu4mLYinEqgzN";//密码 28 com.baidu.translate.TransApi api = new com.baidu.translate.TransApi(APP_ID, SECURITY_KEY); 29 content_result = api.getTransResult(content.substring(3), "auto", "en"); 30 //2.处理翻译的结果并存储 31 //如:{"from":"zh","to":"en","trans_result":[{"src":"\u4e2d\u56fd","dst":"Chinese"}]} 32 char [] content_result_temp = content_result.toCharArray(); 33 content_result = "";//清空数据 34 for(int i = content_result_temp.length-5;;i--) { 35 if(content_result_temp[i] == '"') { 36 break; 37 } 38 content_result = content_result_temp[i] + content_result; 39 } 40 } 41 //如果是前缀是计算,则返回使用者的计算结果 42 else if(content.startsWith("计算:")) { 43 //1.先计算 44 ScriptEngine jse = new ScriptEngineManager().getEngineByName("JavaScript"); 45 content_result = content.substring(3); 46 content_result = "" + jse.eval(content_result); 47 //2.再存储 48 content_result = content.substring(3) + "=" + content_result; 49 } 50 else { 51 content_result = "输入不符规范!\n请按照以下规范进行输入:\n"; 52 content_result += "1.回复。如输入“回复:微信”\n"; 53 content_result += "2.翻译。如输入“翻译:微信”\n"; 54 content_result += "3.计算。如输入“计算:5+2”\n"; 55 //注意:下面调用的<a>标签,需要在双引号前使用转义\ 56 content_result += "/::)\n欢迎关注我的博客:<a href=\"http://blog.leanote.com/qce.hui@qq.com\">祁俊辉's Blog</a>"; 57 } 58 59 com.po.TextMessage text = new com.po.TextMessage(); 60 text.setFromUserName(toUserName);//注意,这里发送者与接收者调换了 61 text.setToUserName(fromUserName); 62 text.setMsgType("text");//文本类型 63 text.setCreateTime("" + new Date().getTime());//当前时间 64 text.setContent(content_result); 65 //将文本消息转换为xml 66 message = MessageUtil.textMessageToXml(text); 67 //输出到控制台 68 System.out.println(message); 69 } 70 71 out.print(message);//返回消息 72 } catch (DocumentException | ScriptException e) { 73 e.printStackTrace(); 74 } finally { 75 out.close(); 76 } 77 }
运行效果: