服务电话:0531-81180830 | 24小时服务:13176691830
公司新闻

微信开发开启开发模式

GitHub源码位置 :

-- HTTP : https://github.com/han1202012/WeChatVerify.git

-- SSH : git@github.com:han1202012/WeChatVerify.git


CSDN下载认证程序的war包和源码 : http://download.csdn.net/detail/han1202012/6999207


微信验证war包下载 : 

-- 访问地址 : ip地址:80/WeChatVerify/verifyServlet ;

-- Token : 注意Token是 "hanshuliang" ;



一. 开启开发模式解析



1. 开发者文档


首先进入编辑模式, 将编辑模式关闭, 进入开发模式 : 



点击查看文档, 就可以打开微信的开发者文档 : 路线 功能 -> 高级功能 -> 开发模式 -> 查看文档 ;



开发者文档目录结构说明 : 

-- 新手接入 : 包括 接入指南 典型案例介绍 开发者规范, 讲解如何接入开发者模;

-- 基础支持 : 包括 获取access_token 全局返回码说明 接口频率限制说明 上传下载多媒体文件;

-- 接收消息 : 包括 验证消息真实性 接收普通消息 接收事件推送 接收语音识别结果;

-- 发送消息 : 包括 发送被动响应消息 发送客服消息;

-- 用户管理 : 包括 分组管理接口 获取用户基本信息 获取关注者列表 获取用户地理位置 网页授权用户基本信息 网页获取用户网络状态;

-- 自定义菜单 : 包括 自定义菜单创建接口 自定义菜单查询接口 自定义菜单删除接口 自定义菜单事件推送;

-- 推广支持 : 包括 生成带参数的二维码 ;

-- 微信 JS接口 : 包括 隐藏微信中网页右上角的按钮 隐藏微信中网页底部的导航栏 网页获取用户网络状态;

-- 开发者交流互助 : 包括 开发者问答系统 接口调试工具 接口体验测试号申请;



2. 开发者校验流程解析


(1)申请消息接口


点击开发模式 "成为开发者" 按钮之后, 会弹出协议 : 



之后会弹出填写 URL 和 Token : 

-- URL : 用来接收微信服务器数据的接口URL;

-- Token : 任意填写, 用于生成签名;



(2) 验证URL有效性




校验流程 : 程序必须能够处理HTTP GET请求, 并对请求者身份进行校验, 确保请求来自微信服务器;

-- 获取参数 : HTTP GET 会携带四个参数 signature timestamp nonce echostr;

-- 拼装参数 : 将排序后的三个参数按照字典顺序排成字符串;

-- 加密参数 : 将排序后的字符串进行sha1加密;

-- 返回结果 : 将加密后的字符串 与 signature 参数对比, 如果相等则说明请求来自微信服务器, 原样返回参数 echostr;



二. 开发校验程序



1. 要点解析


(1) 在servlet中获取四个参数


获取方法 : 在doGet()方法中, 直接调用request的getParameter("signature")方法, 即可获取signature参数;

-- 示例 : 

  1. //获取微信服务器发送给我们的四个参数  
  2. String signature = req.getParameter("signature");  
  3. String timestamp = req.getParameter("timestamp");  
  4. String nonce = req.getParameter("nonce");  
  5. String echostr = req.getParameter("echostr");  


(2) 将参数按照字典顺序排序


排序方法 : 数组工具类 Arrays.sort()会自动将数组中的字符串按照字典循序排序;

-- 代码示例 : 

  1. //将token timestamp nonce 按照字典顺序排序  
  2. String[] params = new String[]{token, timestamp, nonce};  
  3. Arrays.sort(params);  
  4.   
  5. //将上面三个参数排序之后拼接成字符串  
  6. StringBuffer buffer = new StringBuffer();  
  7. for(int i = 0; i < params.length; i ++){  
  8.     buffer.append(params[i]);  
  9. }  


(3) sha1 加密


获取MessageDigest加密类 : 通过调用 MessageDigest.getInstance("SHA-1"), 即可获取sha1加密类;

-- 代码示例 : 

  1. //获取sha1加密对象  
  2. MessageDigest digest = MessageDigest.getInstance("SHA-1");  
  3. //将组合后的字符串使用sha1加密, 加密后获得一个byte数组  
  4. byte[] byteDigest = digest.digest(buffer.toString().getBytes());  


(4) byte数组转为字符串



byte转为char类型 : 

-- 示例代码 : 

  1. /* 
  2.  * 将byte转为字符串 
  3.  */  
  4. public static String byte2HexStr(byte b) {  
  5.     char[] digit = {'0''1''2''3''4''5''6''7''8''9''A''B''C''D''E''F'};  
  6.       
  7.     char[] temp = new char[2];  
  8.     temp[0] = digit[(b >>> 4) & 0x0F];  
  9.     temp[1] = digit[b & 0x0F];  
  10.       
  11.     String s = new String(temp);  
  12.       
  13.     return s;  
  14. }  


byte数组转为字符串 : 需要调用上面的类;

-- 示例代码 : 

  1. /* 
  2.  * 将byte数组转为字符串 
  3.  */  
  4. public static String byte2str(byte[] byteArray) {  
  5.     String str = "";  
  6.     for(int i = 0; i < byteArray.length; i ++){  
  7.         str += byte2HexStr(byteArray[i]);  
  8.     }  
  9.     return str;  
  10. }  


(5) 向微信服务器发送信息


发送信息 : 先获取输出流, 然后校验, 如果通过校验就向微信服务器发送信息;

-- 示例代码 : 

  1. //创建一个出处流, 用于向微信服务器发送数据  
  2. PrintWriter out = resp.getWriter();  
  3.   
  4. //如果校验通过, 向微信服务器发送echostr参数  
  5. if(VerifyUtils.checkSignature(signature, timestamp, nonce)){  
  6.     out.print(echostr);  
  7. }  
  8.   
  9. //释放资源  
  10. out.close();  
  11. out = null;  

.


2. 程序源码


GitHub源码位置 :

-- HTTP : https://github.com/han1202012/WeChatVerify.git

-- SSH : git@github.com:han1202012/WeChatVerify.git


CSDN下载认证程序的war包和源码 : http://download.csdn.net/detail/han1202012/6999207


微信验证war包下载 : 

-- 访问地址 : ip地址:80/WeChatVerify/verifyServlet ;

-- Token : 注意Token是 "hanshuliang" ;


程序结构 : 



Servlet源码 : 

  1. package shuliang.han.vertify.servlet;  
  2.   
  3. import java.io.IOException;  
  4. import java.io.PrintWriter;  
  5.   
  6. import javax.servlet.ServletException;  
  7. import javax.servlet.http.HttpServlet;  
  8. import javax.servlet.http.HttpServletRequest;  
  9. import javax.servlet.http.HttpServletResponse;  
  10.   
  11. import shuliang.han.vertify.VerifyUtils;  
  12.   
  13. public class VerifyServlet extends HttpServlet {  
  14.   
  15.     private static final long serialVersionUID = 4440739483644L;  
  16.       
  17.     @Override  
  18.     protected void doGet(HttpServletRequest req, HttpServletResponse resp)  
  19.             throws ServletException, IOException {  
  20.           
  21.         //获取微信服务器发送给我们的四个参数  
  22.         String signature = req.getParameter("signature");  
  23.         String timestamp = req.getParameter("timestamp");  
  24.         String nonce = req.getParameter("nonce");  
  25.         String echostr = req.getParameter("echostr");  
  26.           
  27.         //创建一个出处流, 用于向微信服务器发送数据  
  28.         PrintWriter out = resp.getWriter();  
  29.           
  30.         //如果校验通过, 向微信服务器发送echostr参数  
  31.         if(VerifyUtils.checkSignature(signature, timestamp, nonce)){  
  32.             out.print(echostr);  
  33.         }  
  34.           
  35.         //释放资源  
  36.         out.close();  
  37.         out = null;  
  38.           
  39.     }  
  40.       
  41.     @Override  
  42.     protected void doPost(HttpServletRequest req, HttpServletResponse resp)  
  43.             throws ServletException, IOException {  
  44.         //注意这里不能有任何操作, 否则不能完成验证  
  45.     }  
  46.       
  47. }  

验证工具类源码 : 

  1. package shuliang.han.vertify;  
  2.   
  3. import java.security.MessageDigest;  
  4. import java.security.NoSuchAlgorithmException;  
  5. import java.util.Arrays;  
  6.   
  7. public class VerifyUtils {  
  8.       
  9.     private final static String token = "hanshuliang";  
  10.       
  11.     public static boolean checkSignature(String signature, String timestamp, String nonce) {  
  12.           
  13.         //将token timestamp nonce 按照字典顺序排序  
  14.         String[] params = new String[]{token, timestamp, nonce};  
  15.         Arrays.sort(params);  
  16.           
  17.         //将上面三个参数排序之后拼接成字符串  
  18.         StringBuffer buffer = new StringBuffer();  
  19.         for(int i = 0; i < params.length; i ++){  
  20.             buffer.append(params[i]);  
  21.         }  
  22.           
  23.         //str用于存储加密后的字符串  
  24.         String str = null;  
  25.           
  26.         try {  
  27.             //获取sha1加密对象  
  28.             MessageDigest digest = MessageDigest.getInstance("SHA-1");  
  29.             //将组合后的字符串使用sha1加密, 加密后获得一个byte数组  
  30.             byte[] byteDigest = digest.digest(buffer.toString().getBytes());  
  31.             //获取加密后的字符串, 将byte数组转化为字符串  
  32.             str = byte2str(byteDigest);  
  33.         } catch (NoSuchAlgorithmException e) {  
  34.             e.printStackTrace();  
  35.         }  
  36.           
  37.         /* 
  38.          * 将加密后的字符串 与 signature 参数进行比较,  
  39.          * 如果加密后的字符串为null直接返回false 
  40.          * 如果加密后的字符串不为null, 直接返回 
  41.          */  
  42.         boolean isVerified = (str != null) ? str.equals(signature.toUpperCase()) : false;  
  43.           
  44.         return isVerified;  
  45.     }  
  46.       
  47.     /* 
  48.      * 将byte数组转为字符串 
  49.      */  
  50.     public static String byte2str(byte[] byteArray) {  
  51.         String str = "";  
  52.         for(int i = 0; i < byteArray.length; i ++){  
  53.             str += byte2HexStr(byteArray[i]);  
  54.         }  
  55.         return str;  
  56.     }  
  57.       
  58.     /* 
  59.      * 将byte转为字符串 
  60.      */  
  61.     public static String byte2HexStr(byte b) {  
  62.         char[] digit = {'0''1''2''3''4''5''6''7''8''9''A''B''C''D''E''F'};  
  63.           
  64.         char[] temp = new char[2];  
  65.         temp[0] = digit[(b >>> 4) & 0x0F];  
  66.         temp[1] = digit[b & 0x0F];  
  67.           
  68.         String s = new String(temp);  
  69.           
  70.         return s;  
  71.     }  
  72.       
  73.       
  74.   
  75. }  


web.xml配置文件 

  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <web-app version="2.5"   
  3.     xmlns="http://java.sun.com/xml/ns/javaee"   
  4.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   
  5.     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee   
  6.     http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">  
  7.       
  8.     <servlet>  
  9.         <servlet-name>verifyServlet</servlet-name>  
  10.         <servlet-class>shuliang.han.vertify.servlet.VerifyServlet</servlet-class>  
  11.     </servlet>  
  12.       
  13.     <servlet-mapping>  
  14.         <servlet-name>verifyServlet</servlet-name>  
  15.         <url-pattern>/verifyServlet</url-pattern>  
  16.     </servlet-mapping>  
  17.       
  18.   <welcome-file-list>  
  19.     <welcome-file>index.jsp</welcome-file>  
  20.   </welcome-file-list>  
  21. </web-app>  

 



三. 进行校验



1.部署程序


(1) 导出war包







(2) 将war包上传到服务器




(3) 配置Tomcat的server.xml文件


微信服务器只能接受80端口数据 : 

  1. <Connector port="80" protocol="HTTP/1.1"   
  2.            connectionTimeout="20000"   
  3.            redirectPort="8443" />  


2. 使用阿里云服务器



将上面的程序导出的war包, 放到阿里云Tomcat服务器下 : 使用 http://hanshuliang.com:8080/WeChatVerify/verifyServlet 登陆;

-- 结果 : 这是正常情况, 因为在POST中没有添加参数;

HTTP Status 500 -


type Exception report

message

description The server encountered an internal error () that prevented it from fulfilling this request.

exception

java.lang.NullPointerException
	java.lang.String.compareTo(String.java:1168)
	java.lang.String.compareTo(String.java:92)
	java.util.Arrays.mergeSort(Arrays.java:1144)
	java.util.Arrays.sort(Arrays.java:1079)
	shuliang.han.vertify.VerifyUtils.checkSignature(VerifyUtils.java:13)
	shuliang.han.vertify.servlet.VerifyServlet.doGet(VerifyServlet.java:28)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:717)

note The full stack trace of the root cause is available in the Apache Tomcat/6.0.20 logs.


Apache Tomcat/6.0.20



不支持8080端口, 只支持80端口, 我的服务器上跑着ngix服务器, 独立域名博客在上面那 : 郁闷 ...




2. 开始校验



原来的Ngix服务器中80端口是独立域名博客, 现在讲独立域名博客指到 8086端口中 : 现在独立域名博客可以从 http://hanshuliang.com:8086/ 访问;

将Tomcat设置成80端口, 气死我了 ;



终于成功了 : 哭死了, 调试了好长时间啊, 终于通过了;



接口功能不全, 只有基础接口的权限 ...

GitHub源码位置 :

-- HTTP : https://github.com/han1202012/WeChatVerify.git

-- SSH : git@github.com:han1202012/WeChatVerify.git


CSDN下载认证程序的war包和源码 : http://download.csdn.net/detail/han1202012/6999207


微信验证war包下载 : 

-- 访问地址 : ip地址:80/WeChatVerify/verifyServlet ;

-- Token : 注意Token是 "hanshuliang" ;

http://www.51pmis.com/que_12.aspx

上一篇:公司要企业信息化构建 下一篇:建筑地基基础工程施工质量验收规范