微信 - 接口配置及外网映射《巨详细》

1成为微信开发者

  • 申请微信公众号
  • 补全基本资料,公众帐号头像、描述和运营地区。

2 接口配置

  • 进入配置页面:基本配置 > 修改配置

其中

  • URL:指的是能够接收处理微信服务器发送的GET/POST请求的地址,并且是已经存在的,现在就能够在浏览器访问到的地址,这就要求我们先把公众帐号后台处理程序开发好(至少应该完成了对GET请求的处理)并部署在公网服务器上,如果是测试的话可以使用ngrok(一会详细会讲使用说明 )

  • Token :可以自己随意填,但是要和后面服务器的保持一致

3 填写服务器配置


点击提交后,服务器会收到由微信服务器发送过来的GET请求,请求参数如下:

  • signature :微信加密签名,signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数。
  • timestamp 时间戳
  • nonce 随机数
  • echostr 随机字符串

服务器需会对signature进行校验,若确认此次GET请求来自微信服务器,请原样返回echostr参数内容,则接入生效,成为开发者成功,否则接入失败。

4 具体代码(JAVA)

DealServlet.class 核心处理类

@WebServlet("/do")
public class DealServletextends HttpServlet {  
    private static final long serialVersionUID = 4440739483644821986L;  
  
    /** 
     * 确认请求来自微信服务器 
     */  
    public void doGet(HttpServletRequest request, HttpServletResponse response)
         throws ServletException, IOException {  
        // 微信加密签名  
        String signature = request.getParameter("signature");  
        // 时间戳  
        String timestamp = request.getParameter("timestamp");  
        // 随机数  
        String nonce = request.getParameter("nonce");  
        // 随机字符串  
        String echostr = request.getParameter("echostr");  
  
        PrintWriter out = response.getWriter();  
        // 通过检验signature对请求进行校验,若校验成功则原样返回echostr,表示接入成功,
            否则接入失败  
        if (SignUtil.checkSignature(signature, timestamp, nonce)) {  
            out.print(echostr);  
        }  
        out.close();  
        out = null;  
    }  
  
    /** 
     * 处理微信服务器发来的消息 
     */  
    public void doPost(HttpServletRequest request, HttpServletResponse response) 
      throws ServletException, IOException {  
        // TODO 消息的接收、处理、响应  
    }  
  
} 

SignUtil.class 校验工具类

public class SignUtil {  
    // 与接口配置信息中的Token要一致  
    private static String token = "weixinhaha";  
  
    /** 
     * 验证签名 
     *  
     * @param signature 
     * @param timestamp 
     * @param nonce 
     * @return 
     */  
    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 md = null;  
        String tmpStr = null;  
  
        try {  
            md = MessageDigest.getInstance("SHA-1");  
            // 将三个参数字符串拼接成一个字符串进行sha1加密  
            byte[] digest = md.digest(content.toString().getBytes());  
            tmpStr = byteToStr(digest);  
        } catch (NoSuchAlgorithmException e) {  
            e.printStackTrace();  
        }  
  
        content = null;  
        // 将sha1加密后的字符串可与signature对比,标识该请求来源于微信  
        return tmpStr != null ? tmpStr.equals(signature.toUpperCase()) : false;  
    }  
  
    /** 
     * 将字节数组转换为十六进制字符串 
     *  
     * @param byteArray 
     * @return 
     */  
    private static String byteToStr(byte[] byteArray) {  
        String strDigest = "";  
        for (int i = 0; i < byteArray.length; i++) {  
            strDigest += byteToHexStr(byteArray[i]);  
        }  
        return strDigest;  
    }  
  
    /** 
     * 将字节转换为十六进制字符串 
     *  
     * @param mByte 
     * @return 
     */  
    private static String byteToHexStr(byte mByte) {  
        char[] Digit = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A',
         'B', 'C', 'D', 'E', 'F' };  
        char[] tempArr = new char[2];  
        tempArr[0] = Digit[(mByte >>> 4) & 0X0F];  
        tempArr[1] = Digit[mByte & 0X0F];  
  
        String s = new String(tempArr);  
        return s;  
    }  
}  

其中需要注意的一点就是SignUtil类中的Token需要和服务器配置的Token保持一致,这样编码就结束了。

果在服务器配置的时候填的是外网地址,那么点击提交后会显示提交成功了。

没有外网地址的童靴可以往下看咯

5 ngrok外网映射


  1. 首先我们需要先下载ngrok,自行百度下载。
  2. 下载完后,进行解压。
  3. 创建一个批处理文件,并进行编辑
ngrok
  1. 运行该批处理
运行成功

这样整个配置就结束了

测试

当我们看到这个页面就说明我们配置成功了,只需要将该地址放入服务器配置中的url点击提交即可

提交成功

《待续》
喜欢的话戳一下喜欢呗。
有什么建议的话希望大家能在下方回复😋

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,853评论 18 139
  • 国家电网公司企业标准(Q/GDW)- 面向对象的用电信息数据交换协议 - 报批稿:20170802 前言: 排版 ...
    庭说阅读 11,096评论 6 13
  • 22年12月更新:个人网站关停,如果仍旧对旧教程有兴趣参考 Github 的markdown内容[https://...
    tangyefei阅读 35,215评论 22 257
  • 时间飞逝,一转眼,大班的孩子们即将毕业,心中有喜悦,也有不舍。制作毕业短片时,不由自主流泪,我思念你们的童年。 这...
    静心听风阅读 270评论 0 0
  • 难得早起躺在床上看书,听到老妈在楼下张罗早餐。这很简单的日常,对于常年在外的我来说却显得弥足珍贵。 忽然我听到了葫...
    向行阅读 290评论 6 3