一、准备工作

(1)准备一个微信公众号(对私的订阅号或者对公的服务号)。

(2)准备一台部署了web应用,并且已经发布出去的Linux服务器(需要说明的是:微信公众号强烈建议使用80端口,使用其他自定义端口貌似根本不通,后面会有说明)。

先科普说明一下:

  1.微信公众号的注册分为2种类型:对个人的订阅号,对企业的服务号,这个很简单,按照官方注册流程按部就班地填写基本不会出现问题。

  服务号:主要偏向于服务交互(功能类似12315,114,银行,提供绑定信息,服务交互),每月可群发4条消息;服务号适用人群:**媒体、企业、政府或其他组织。

  订阅号:主要偏向于为用户传达资讯,(功能类似报纸杂志,为用户提供新闻信息或娱乐趣事),每天可群发1条消息;订阅号适用人群**:个人、媒体、企业、政府或其他组织。

  2.刚注册的订阅号和公众号是“非认证”状态的(本人注册的是对私的订阅号,目前处于非认证状态)非认证的订阅号对接口的访问权限是很小的,连起码的自定义订阅号的菜单都不给,真气人!

3.微信官方将认证审核流程托管到了第三方机构或公司,这个是要收取服务费的,对公的服务号收费标准:300¥/次/年。具体详细,网上是这样回答的:

我等会就去试一下如何认证,如果认证成功了,会出一篇具体介绍如何认证对私的订阅号的。本文注重介绍如何验证TOKEN的。

4.用户操作访问微信公众号,请求是如何处理转发的呢?看完下面的示意图就会明白为什么要准备一台自己的服务器了。

 二、TOKEN验证的流程:

先假设,我们部署在服务器上的web应用已经可以正常被外网访问了。

(1)在微信公众号后台:开发-》基本设置菜单中

你以为就这么简单填写就把微信服务平台和自己的服务器web应用关联起来了???那是不可能滴!!!这样直接提交会报错

先简单介绍下图中的几个输入项和选择项到底是干嘛的!

1、URL:这个是TOKEN的验证调取的请求url,端口要求是80或者443,我们一般用80端口。

2、Token:这个是微信服务和自己的服务之间通信的关键通信凭证(也可以这么理解:开发者自定的验证口令)。

3、EncodingAESKey:你也可以理解为通信信息加密因子,这个让他它自动生成即可。

4、消息加解密方式:明文模式:不加解密(新手开发者建议选这个,方便开发和调试)。

(2)在自己服务器web项目中需要做调整,调整流程如下:

1、新建一个servlet.java用于处理微信服务器发送过来的Token验证请求:

package com.xfwl.weixinToken;

import java.io.IOException;
import java.io.PrintWriter; import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; public class WXServletToken extends HttpServlet { /**
* 构造器
*/
public WXServletToken() {
super();
} /**
* 销毁操作
*/
public void destroy() {
super.destroy();
} /**
* doGet请求处理
*/
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
/**
* 获取weixin请求参数
*/
String signature=request.getParameter("signature");
String timestamp=request.getParameter("timestamp");
String nonce=request.getParameter("nonce");
String echostr=request.getParameter("echostr");
/**
* 校验参数是否正确
*/
PrintWriter out = response.getWriter();
if(CheckUtil.checkSignature(signature, timestamp, nonce)){
//如果校验成功,将得到的随机字符串原路返回
out.print(echostr);
}
out.flush();
out.close();
} /**
* doPost请求操作
*/
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException { response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">"); out.flush();
out.close();
} /**
*初始化操作
*/
public void init() throws ServletException {} }

2、新建一个TOKEN验证类

 package com.xfwl.weixinToken;

 import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays; /**
* 微信Token校验
* @author Jason
*
*/
public class CheckUtil {
/**
* 加密规则
*/
public static final String wx_mdType="SHA1";
/**
* 微信公众号Token信息
*/
public static final String wx_token="*****";
/**
* 校验微信Token的有效性
* @param signature
* @param timestamp 时间戳
* @param nonce
* @return
*/
public static boolean checkSignature(String signature,String timestamp,String nonce){
//1、定义数组存放wx_token、timestamp、nonce
String[] arr={wx_token,timestamp,nonce};
//2、对数组进行排序
Arrays.sort(arr);
//3、生成字符串
StringBuffer sb=new StringBuffer();
for(String s:arr){
sb.append(s);
}
String temp=getSha1(sb.toString());
if(temp==null){
return false;
}
return temp.equals(signature);
}
public static String getSha1(String data){
if(data==null || data.length()==0){
return null;
}
char[] hexDigist={'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'};
try {
MessageDigest mdTemp=MessageDigest.getInstance(wx_mdType);
mdTemp.update(data.getBytes());
byte[] md=mdTemp.digest();
int j=md.length;
char[] buf=new char[j*2];
int k=0;
for(int i=0;i<j;i++){
byte byte0=md[i];
buf[k++]=hexDigist[byte0 >>> 4 & 0xf];
buf[k++]=hexDigist[byte0 & 0xf];
}
return new String(buf); } catch (NoSuchAlgorithmException e) {
System.out.println("微信公众号TOKEN加密失败");
return null;
}
}
}

3、web.xml中配置请求(当然了,用注解形式也可,方式很多种,任选随意)

 <?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
<display-name></display-name>
<!-- 默认界面 -->
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<!-- 配置过滤器 -->
<!-- <filter>
<filter-name>filter</filter-name>
<filter-class>com.xfwl.filter.RequestFilter</filter-class>
<init-param>
<param-name>charset</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>contentType</param-name>
<param-value>text/html;charset=UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>filter</filter-name>
* 代表截获所有的请求 或指定请求/test.do /xxx.do
<url-pattern>/*</url-pattern>
</filter-mapping> -->
<!-- 接入微信Token验证 -->
<servlet>
<servlet-name>WXServletToken</servlet-name>
<servlet-class>com.xfwl.weixinToken.WXServletToken</servlet-class>
</servlet> <servlet-mapping>
<servlet-name>WXServletToken</servlet-name>
<url-pattern>/servlet/WXServletToken</url-pattern>
</servlet-mapping>
</web-app>

4、打war包,重新部署启动

5、回到微信公众号后台:开发-》基本设置菜单中,输入对应的信息,点击提交按钮。即可提交设置成功。

需要说明一点:图中“IP白名单设置”,这个需要把自己服务器外网IP加上,如果你还需要使用微信公众号的接口调试功能去测试接口的话,那么微信公众号平台的IP(39.130.165.18)也需要加入白名单中。

6、到这一步:就已经完成了TOKEN的验证了。

总想自己动动手系列·3·微信公众号和外网服务交互之通过TOKEN验证(准备篇·1)的更多相关文章

  1. Java微信公众号开发-外网映射工具配置

    一.开发环境准备 1.一个微信公众号 2.外网映射工具(开发调试)如花生壳.ngrok工具 注:与微信对接的URL要具备以下条件a:在公网上能够访问 b:端口只支持80端口 这里使用ngrok.cc: ...

  2. 总想自己动动手系列·2·本地和外网(Liunx服务器上部署的web项目)按照自定义的报文格式进行交互(完结篇)

    一.准备工作 (1)创建一个web-project工程,部署本地可正常访问,部署在云服务上可访问. (2)理解如何在web.xml文件中配置过滤器,和创建一个自定义的过滤器. (3)懂得如何打war包 ...

  3. 总想自己动动手系列·1·本地和外网(Liunx服务器上部署的web项目)按照自定义的报文格式进行交互(准备篇)

    一.准备工作 (1)有一台属于自己的云服务器,并成功部署和发布一个web项目(当然,本质上来说Java-Project也没问题),通过外网IP可以正常访问该web项目. 需要说明的是:任何web项目, ...

  4. 微信公众号开发之内网映射外网natapp安装(一)

    一,为什么使用natapp 1,在进行微信公众号开发时,我们需要搭建网站,并且随时都有可能修改网站内容进行调试.如果能够将内网ip映射到外网上,将大大方便我们的调试.每次发布只需eclipse运行应用 ...

  5. thinkphp整合系列之微信公众号支付

    <?phperror_reporting(E_ALL);ini_set('display_errors', '1');// 定义时区ini_set('date.timezone','Asia/S ...

  6. PHP实现发送模板消息到微信公众号

    简述:在这里会具体讲述到如何实现:如何通过后台的代码来实现发送模板消息到已经关注了"心想"公众号的用户. (本人新手,目前实习中,我的所有文档都是在自己开发过程中的记录,有些言语跟 ...

  7. spring-boot-route(二十三)开发微信公众号

    在讲微信公众号开发之前,先来大概了解一下微信公众号.微信公众号大体上可以分为服务号和订阅号,订阅号和服务号的区别如下: 服务号可以申请微信支付功能. 服务号只能由企业申请,订阅号可以有企业或个人申请. ...

  8. 服务器通过微信公众号Token验证测试的代码(Python版)

    我在阿里云租了一个云服务器,然后想把这个作为我的微信公众号的后台,启用微信公众号开发者需要正确的响应微信服务器的Token验证,为此把这个验证的Python代码贴出来,只要在服务器上运行这段代码,注意 ...

  9. 微信公众号开发总结(Node.js + express + winston)

    关于订阅号.服务号.企业号 官方定位 订阅号:主要偏于为用户传达资讯(类似报纸杂志),认证后每天可以群发一条消息,可达到宣传效果,构建与读者之间更好的沟通和管理模式. 服务号:主要偏于服务交互(类似银 ...

随机推荐

  1. 【20181026T2】**图【最小瓶颈路+非旋Treap+启发式合并】

    题面 [错解] 最大最小?最小生成树嘛 蛤?还要求和? 点分治? 不可做啊 写了个MST+暴力LCA,30pts,140多行 事后发现30分是给dijkstra的 woc [正解] 树上计数问题:①并 ...

  2. Android UI设计规范之常用单位

    px :全称--pixel .像素.例如,480*800的屏幕在横向有320个象素,在纵向有480个象素. 屏幕的分辨率 : 屏幕的长宽方向上像素点的数量. dp(dip) : 全称--Density ...

  3. redis细节

    Redis对于Linux是官方支持的,安装和使用没有什么好说的,普通使用按照官方指导,5分钟以内就能搞定.详情请参考: http://redis.io/download 但有时候又想在windows下 ...

  4. mvc-单例多线程模式

    以spring mvc 为例子 spring mvc 的Controller类默认Scope是单例(singleton) 测试结果发现spring3中的controller默认是单例的,若是某个con ...

  5. 不错的VS2010扩展——JSEnhancements,让js和css也折叠

    在Visaul Studio 2010中写js或css代码,缺少像写C#代码时的那种折叠功能,当代码比较多时,就很不方便. 今天发现,已经有VS2010扩展支持这个功能,它就是——JSEnhancem ...

  6. Linux/UNIX线程(2)

    线程(2) 线程同步 当多个控制线程共享同样内存时,须要确保每一个线程看到一致的数据视图.假设每一个线程使用的变量都是其它线程不会读取或改动的,那么就不在一致性问题. 当两个或多个线程试图在同一时间改 ...

  7. u-boot中环境变量的实现

    转载:http://blog.chinaunix.net/uid-28236237-id-3867041.html U-boot中通过环境参数保存一些配置,这些配置可以通过修改环境参数.保存环境参数. ...

  8. printf回到上一行开头以及回到本行开头的方法

    回到上一行开头 #include <stdio.h> #include <unistd.h> int main(void) { ; ){ printf("%d\n&q ...

  9. linux上SVN解决冲突的办法

    转载:http://www.aixchina.net/club/thread-25902-1-1.html 这里,先说说冲突解决. 怎么会发生冲突呢? 两个人修改了不同文件?不会有冲突,他们不相关. ...

  10. Androidclient与服务端交互之登陆演示样例

    今天了解了一下androidclient与服务端是如何交互的,发现事实上跟web有点类似吧,然后网上找了大神的登陆演示样例.是基于IntentService的 1.后台使用简单的servlet,支持G ...