上一章给大家分享的是开发微信公众号(三) , 今天继续更新第四篇 搭建本地测试环境。

  • 推荐一款软件: Ngrok(内网穿透工具)

Ngrok可以实现内网穿透,也就是说我们可以将内网的服务器映射到外网给别人访问,这对于我们在本地开发环境中调试微信代码是以及给用户演示一些东西非常快速和有帮助的,因为可以直接使用我们自己的内网的电脑作为服务器。不过需要翻墙访问。
国内提供Ngrok服务的网站:https://natapp.cn/

因为微信公众号开发要进行调试,每次实现功能后都需要部署到公网服务器进行测试,所以我们需要把内网的部署服务器映射到外网,让微信服务器可以正常访问到。

一.注册natapp账号

  1. 实名认证
  2. 购买隧道

二. 下载natapp客户端

2. 安装natapp

win/Mac/Linux安装步骤详细参考博客:http://blog.csdn.net/xunxianren007/article/details/54954520
1.双击natapp

2.输入natapp命令

3. 复制之前natapp账号购买的authtoken, 执行 natapp -authtoken + your authtoken

微信公众平台接入

接入概述

在微信公众平台开发者文档上,接入指南上写的比较详细的,文档中说接入公众号需要3个步骤,分别是:

1、填写服务器配置

2、验证服务器地址的有效性

3、依据接口文档实现业务逻辑

第一步:填写服务器配置

第1步中服务器配置包含服务器地址(URL)、令牌(Token) 和 消息加解密密钥(EncodingAESKey)
​在登录微信公众平台官网开发–>基本设置页面–>服务器配置中配置

​1. 服务器地址(URL)即公众号后台提供业务逻辑的入口地址,目前只支持80端口,之后包括接入验证以及任何其它的操作的请求(例如消息的发送、菜单管理、素材管理等)都要从这个地址进入。接入验证和其它请求的区别就是,接入验证时是get请求,其它时候是post请求;
2. Token可由开发者可以任意填写,用作生成签名(该Token会和接口URL中包含的Token进行比对,从而验证安全性);
3. EncodingAESKey由开发者手动填写或随机生成,将用作消息体加解密密钥。本例中全部以未加密的明文消息方式,不涉及此配置项。

第二步:验证消息的确来自微信服务器

第2步,验证服务器地址的有效性,当点击“提交”按钮后,微信服务器将发送一个http的get请求到刚刚填写的服务器地址,并且携带四个参数:


接到请求后,我们需要做如下三步,若确认此次GET请求来自微信服务器,原样返回echostr参数内容,则接入生效,否则接入失败。

1. 将token、timestamp、nonce三个参数进行字典序排序
  2. 将三个参数字符串拼接成一个字符串进行sha1加密 (可逆加密解密函数)
  3. 开发者获得加密后的字符串可与signature对比,标识该请求来源于微信
  
下面我们用Java代码来演示一下这个验证过程

使用IntelliJ IDEA创建一个JavaWeb项目,代码如下:

  1. 新建Servlet项目
package com.qj.servlet;import com.qj.util.CheckUtil;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;/*_ooOoo_o8888888o88" . "88(| -_- |)O\  =  /O____/`---'\____.'  \\|     |//  `./  \\|||  :  |||//  \/  _||||| -:- |||||-  \|   | \\\  -  /// |   || \_|  ''\---/''  |   |\  .-\__  `-`  ___/-. /___`. .'  /--.--\  `. . __."" '<  `.___\_<|>_/___.'  >'"".| | :  `- \`.;`\ _ /`;.`/ - ` : | |\  \ `-.   \_ __\ /__ _/   .-` /  /
======`-.____`-.___\_____/___.-`____.-'======`=---='
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^佛祖保佑       永无BUG
*/
@WebServlet(name = "WeixinServlet")
public class WeixinServlet extends HttpServlet {/** 自定义token, 用作生成签名,从而验证安全性* */private final String TOKEN = "qingjian";@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doGet(request,response);}@Overridepublic void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {System.out.println("-----开始校验签名-----");/*** 接收微信服务器发送请求时传递过来的参数*/String signature = request.getParameter("signature");//String timestamp = request.getParameter("timestamp");String nonce = request.getParameter("nonce"); //随机数String echostr = request.getParameter("echostr");//随机字符串/*** 将token、timestamp、nonce三个参数进行字典序排序* 并拼接为一个字符串*/String sortStr = sort(TOKEN,timestamp,nonce);/*** 字符串进行shal加密*/String mySignature = shal(sortStr);/*** 校验微信服务器传递过来的签名 和  加密后的字符串是否一致, 若一致则签名通过*/if(!"".equals(signature) && !"".equals(mySignature) && signature.equals(mySignature)){System.out.println("-----签名校验通过-----");response.getWriter().write(echostr);}else {System.out.println("-----校验签名失败-----");}}/*** 参数排序* @param token* @param timestamp* @param nonce* @return*/public String sort(String token, String timestamp, String nonce) {String[] strArray = {token, timestamp, nonce};Arrays.sort(strArray);StringBuilder sb = new StringBuilder();for (String str : strArray) {sb.append(str);}return sb.toString();}/*** 字符串进行shal加密* @param str* @return*/public String shal(String str){try {MessageDigest digest = MessageDigest.getInstance("SHA-1");digest.update(str.getBytes());byte messageDigest[] = digest.digest();StringBuffer hexString = new StringBuffer();// 字节数组转换为十六进制数for (int i = 0; i < messageDigest.length; i++) {String shaHex = Integer.toHexString(messageDigest[i] & 0xFF);if (shaHex.length() < 2) {hexString.append(0);}hexString.append(shaHex);}return hexString.toString();} catch (NoSuchAlgorithmException e) {e.printStackTrace();}return "";}
}
  1. 在web.xml中配置 servlet
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"version="4.0"><servlet><servlet-name>WeixinServlet</servlet-name><servlet-class>com.qj.servlet.WeixinServlet</servlet-class></servlet><servlet-mapping><servlet-name>WeixinServlet</servlet-name><url-pattern>/WeixinServlet</url-pattern></servlet-mapping></web-app>
  1. 在index.jsp中编写hello world 测试
<%--Created by IntelliJ IDEA.User: qingjianDate: 2019/9/12Time: 12:17To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html><head><title>微信公众号测试</title></head><body>Hello World !</body>
</html>

  1. 启动natapp,进行内网穿透
    cmd输入命令:natapp -authtoken your token

进入微信测试公众号管理界面,在接口配置信息中填入映射的外网地址和代码中声明的token(注意: URL是 外网的ip地址加上 web.xml中配置的servlet名称)如下图所示:

点击提交,会显示配置成功, 控制台就会打印信息, 显示签名校验通过

到此,我们的微信公众号应用已经能够和微信服务器正常通信

微信公众号开发笔记(四)搭建本地测试环境相关推荐

  1. 【微信公众号开发】四、公众号按钮设置及自己的微信按钮编辑器

    文章详情:[微信公众号开发]四.公众号按钮设置及自己的微信按钮编辑器 链接:https://www.microanswer.cn/blog/14

  2. 微信公众号开发系列教程一(调试环境部署续:vs远程调试)

    微信公众号开发系列教程一(调试环境部署) 微信公众号开发系列教程一(调试环境部署续:vs远程调试) C#微信公众号开发系列教程二(新手接入指南) C#微信公众号开发系列教程三(消息体签名及加解密) C ...

  3. 微信公众号开发系列教程一(调试环境部署)

    http://www.cnblogs.com/zskbll/p/4074855.html 目录 C#微信公众号开发系列教程一(调试环境部署) C#微信公众号开发系列教程一(调试环境部署续:vs远程调试 ...

  4. 微信公众号开发《四》调用微信JS-SDK实现上传手机图片到服务器

    在这粘贴上三篇博文链接,方便大家查阅互相学习: 微信公众号开发<一>OAuth2.0网页授权认证获取用户的详细信息,实现自动登陆 微信公众号开发<二>发送模板消息实现消息业务实 ...

  5. 微信公众号开发《四》使用微信JS-SDK实现手机图片上传,支持压缩、预览。并下载图片到自身服务器

    在这粘贴上三篇博文链接,方便大家查阅互相学习: 微信公众号开发<一>OAuth2.0网页授权认证获取用户的详细信息,实现自动登陆 微信公众号开发<二>发送模板消息实现消息业务实 ...

  6. 微信公众号开发笔记(三):微信JSAPI支付功能开发

    很久之前做了微信支付,其中也趟过很多坑,现在有时间就做个自我梳理吧算是. 公众号开发的基本配置(不明白的可以参考https://blog.csdn.net/TOP__ONE/article/detai ...

  7. 微信公众号开发笔记(二):微信分享接口实现和问题

    上篇文章写到了公众号开发的基本配置(不明白的可以参考https://blog.csdn.net/TOP__ONE/article/details/78183209),这里继续写微信分享接口功能代码实现 ...

  8. 微信公众号开发笔记(九)发送语音消息

    上一篇我们用代码实现发送图片消息,接下来我们来实现发送语音消息功能 发送语音消息 代码实现 1.在Message.util工具类中新增 buildVoiceMessag方法 /** * 构造语音消息 ...

  9. 微信公众号开发(四)——点击菜单回复图片和语音

    先讲回复图片,语音类似. 这个发送图片,并不是点击输入框右侧的"➕",去选择本地照片,而是要把图片上传的公众号的服务器. 按照开发文档https://developers.weix ...

最新文章

  1. Extended WPF Toolkit 新控件介绍
  2. windows服务器指定IP地址才能进行远程访问桌面设置方法
  3. Lua table(表)
  4. 静态优先权和动态优先权
  5. Python socket.send()与socket.sendall()的区别
  6. fla 优化思路 flash cs6
  7. linux修改文件属性
  8. Python第八课:函数(def)
  9. 奇安信天擎卸载密码_【web安全】记奇安信“渗透测试”培训
  10. HDU 5956 The Elder (树形DP + 斜率优化)
  11. INVALID_PARAMETER 订单信息无法识别,建议联系卖家。 支付宝
  12. OpenGL绘制旋转六面体并纹理贴图
  13. Win10系统,如何使用系统自带截图工具 “PrintScreen键“
  14. cpu满载寿命_CPU的使用寿命大概有多少年,多久迭代一次为佳?
  15. 字节跳动 校招薪资曝光,老员工被倒挂疯了~
  16. 为什么创业?创业能给你带来什么?
  17. RANSAC算法(仅供学习使用)
  18. 需求定律的4个准则——《可以量化的…
  19. 青少年python编程比赛试题答案_Python编程及应用-中国大学mooc-试题题目及答案
  20. 华为DHCP Snooping原理及其实验配置

热门文章

  1. 2012年图灵奖得主和他们的贡献
  2. Android studio 报错 :Unable to delete file
  3. android apk安装工具,APK安装器下载-APK安装器手机版下载v2.9-1 安卓版-西西软件下载...
  4. AppTransition
  5. cart算法实例matlab,matlab 决策树cart算法源代码
  6. 草图大师SketchUp 2021 mac版 兼容macos11系统正式上线!
  7. Android Fragment 真正的完全解析(上)
  8. 解决QProcess启动进程后kill无效
  9. 解决 vue-router 升级导致的 Uncaught (in promise) NavigationDuplicated
  10. rv1126/1109平台下的lt8912显示驱动的调试