微信公众号开发笔记(一)

将内网地址映射到外网

2016 年 4 月 8 日发现的新工具 网址:

配置文件的写法:

server_addr: "server.ngrok.cc:4443"
auth_token: "abfdc23163c424a7956d0543fe53b4e2" 
tunnels:
  sunny:
   subdomain: "liweismile"
   proto:
    http: 8088

其中,token 是登录平台以后可以查询到的;subdomain 是登录平台以后自己添加的。 启动命令:ngrok.exe -config ngrok.cfg start sunny。

映射的新网址:

所以,我们要将自己的应用配置成 80 端口可以访问的应用就可以了。

工具:ngrok 使用方法非常简单。 命令行:

在 cmd 命令中先切换到 ngrok 所在的位置再进行如下操作

ngrok -config ngrok.cfg -subdomain example 8080

说明:example:自己任意设置;8080:tomcat的端口号。

我的实践:

ngrok -config ngrok.cfg -subdomain liwei 8080

命令行工具非常直观地显示出映射关系:

开发模式接入

第一步:填写服务器配置

这一部分详细信息,可以查看【公众平台开发者文档】【开发者必读】【接入指南】。

第二步:验证服务器地址的有效性

Java 示例代码:

注意事项:我们这里使用了 SpringMVC 框架开发,在这个控制器方法里,我们一定要使用 void 作为返回值,并且将返回给服务器的信息使用 PrintWriter 这个类输出回去。

这里我们还使用到一个校验工具类,代码如下:

接收并且处理文本消息

我们写一个和配置的 URL 相同的控制器方法,注意,这里是 post 请求。请看下面的示例代码:

这里使用到一个工具类:

public class MessageUtil {
          
   

    /**
     * 将 XML 转换为 Map
     * 
     * @param request
     * @return
     * @throws IOException
     * @throws DocumentException
     */
    @SuppressWarnings("unchecked")
    public static Map<String, String> xmlToMap(HttpServletRequest request)
            throws IOException, DocumentException {
        Map<String, String> map = new HashMap<>();
        SAXReader reader = new SAXReader();
        InputStream ins = request.getInputStream();
        Document doc = reader.read(ins);
        Element root = doc.getRootElement();
        List<Element> list = root.elements();
        for (Element e : list) {
            map.put(e.getName(), e.getText());
        }
        ins.close();
        return map;
    }

    /**
     * 将文本消息(TextMessage 对象)转换为 xml 格式
     * 
     * @param textMessage
     * @return
     */
    public static String textMessageToXML(TextMessage textMessage) {
        XStream xtream = new XStream();
        xtream.alias("xml", textMessage.getClass());
        String xmlStr = xtream.toXML(textMessage);
        return xmlStr;
    }
}

实现效果和控制台:


在这篇文章的最后,我们再介绍一种加密的写法:

public static String sha1(String str) {
        StringBuffer sb = new StringBuffer();
        try {
            MessageDigest md = MessageDigest.getInstance("sha1");
            md.update(str.getBytes());
            byte[] msg = md.digest();
            // 将 十进制转换为 十六进制
            for (byte b : msg) {
                sb.append(String.format("%02x", b));
            }
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
        return sb.toString();
    }
经验分享 程序员 微信小程序 职场和发展