【微信开发】微信开发 之 开启开发模式
.
作者 : 萬境絕塵
轉(zhuǎn)載請注明出處 :?http://blog.csdn.net/shulianghan/article/details/20494177
.
GitHub源碼位置?:
--?HTTP?:?https://github.com/han1202012/WeChatVerify.git
--?SSH?:?git@github.com:han1202012/WeChatVerify.git
CSDN下載認(rèn)證程序的war包和源碼?:?http://download.csdn.net/detail/han1202012/6999207
微信驗(yàn)證war包下載?:?
--?訪問地址?:?ip地址:80/WeChatVerify/verifyServlet ;
--?Token?: 注意Token是 "hanshuliang" ;
一. 開啟開發(fā)模式解析
1. 開發(fā)者文檔
首先進(jìn)入編輯模式, 將編輯模式關(guān)閉, 進(jìn)入開發(fā)模式 :?
點(diǎn)擊查看文檔, 就可以打開微信的開發(fā)者文檔 : 路線 功能 -> 高級功能 -> 開發(fā)模式 -> 查看文檔 ;
開發(fā)者文檔目錄結(jié)構(gòu)說明 :?
-- 新手接入 : 包括 接入指南 典型案例介紹 開發(fā)者規(guī)范, 講解如何接入開發(fā)者模;
-- 基礎(chǔ)支持 : 包括 獲取access_token 全局返回碼說明 接口頻率限制說明 上傳下載多媒體文件;
-- 接收消息 : 包括 驗(yàn)證消息真實(shí)性 接收普通消息 接收事件推送 接收語音識別結(jié)果;
-- 發(fā)送消息 : 包括 發(fā)送被動(dòng)響應(yīng)消息 發(fā)送客服消息;
-- 用戶管理 : 包括 分組管理接口 獲取用戶基本信息 獲取關(guān)注者列表 獲取用戶地理位置 網(wǎng)頁授權(quán)用戶基本信息 網(wǎng)頁獲取用戶網(wǎng)絡(luò)狀態(tài);
-- 自定義菜單 : 包括 自定義菜單創(chuàng)建接口 自定義菜單查詢接口 自定義菜單刪除接口 自定義菜單事件推送;
-- 推廣支持 : 包括 生成帶參數(shù)的二維碼 ;
-- 微信 JS接口 : 包括 隱藏微信中網(wǎng)頁右上角的按鈕 隱藏微信中網(wǎng)頁底部的導(dǎo)航欄 網(wǎng)頁獲取用戶網(wǎng)絡(luò)狀態(tài);
-- 開發(fā)者交流互助 : 包括 開發(fā)者問答系統(tǒng) 接口調(diào)試工具 接口體驗(yàn)測試號申請;
2. 開發(fā)者校驗(yàn)流程解析
(1)申請消息接口
點(diǎn)擊開發(fā)模式 "成為開發(fā)者" 按鈕之后, 會彈出協(xié)議 :?
之后會彈出填寫 URL 和 Token :?
-- URL : 用來接收微信服務(wù)器數(shù)據(jù)的接口URL;
-- Token : 任意填寫, 用于生成簽名;
(2) 驗(yàn)證URL有效性
校驗(yàn)流程 : 程序必須能夠處理HTTP GET請求, 并對請求者身份進(jìn)行校驗(yàn), 確保請求來自微信服務(wù)器;
-- 獲取參數(shù) : HTTP GET 會攜帶四個(gè)參數(shù) signature timestamp nonce echostr;
-- 拼裝參數(shù) : 將排序后的三個(gè)參數(shù)按照字典順序排成字符串;
-- 加密參數(shù) : 將排序后的字符串進(jìn)行sha1加密;
-- 返回結(jié)果 : 將加密后的字符串 與 signature 參數(shù)對比, 如果相等則說明請求來自微信服務(wù)器, 原樣返回參數(shù) echostr;
二. 開發(fā)校驗(yàn)程序
1. 要點(diǎn)解析
(1) 在servlet中獲取四個(gè)參數(shù)
獲取方法 : 在doGet()方法中, 直接調(diào)用request的getParameter("signature")方法, 即可獲取signature參數(shù);
-- 示例 :?
//獲取微信服務(wù)器發(fā)送給我們的四個(gè)參數(shù)String signature = req.getParameter("signature");String timestamp = req.getParameter("timestamp");String nonce = req.getParameter("nonce");String echostr = req.getParameter("echostr");
(2) 將參數(shù)按照字典順序排序
排序方法 : 數(shù)組工具類 Arrays.sort()會自動(dòng)將數(shù)組中的字符串按照字典循序排序;
-- 代碼示例 :?
//將token timestamp nonce 按照字典順序排序String[] params = new String[]{token, timestamp, nonce};Arrays.sort(params);//將上面三個(gè)參數(shù)排序之后拼接成字符串StringBuffer buffer = new StringBuffer();for(int i = 0; i < params.length; i ++){buffer.append(params[i]);}
(3) sha1 加密
獲取MessageDigest加密類 : 通過調(diào)用 MessageDigest.getInstance("SHA-1"), 即可獲取sha1加密類;
-- 代碼示例 :?
//獲取sha1加密對象MessageDigest digest = MessageDigest.getInstance("SHA-1");//將組合后的字符串使用sha1加密, 加密后獲得一個(gè)byte數(shù)組byte[] byteDigest = digest.digest(buffer.toString().getBytes());
(4) byte數(shù)組轉(zhuǎn)為字符串
byte轉(zhuǎn)為char類型 :?
-- 示例代碼 :?
/** 將byte轉(zhuǎn)為字符串*/public static String byte2HexStr(byte b) {char[] digit = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};char[] temp = new char[2];temp[0] = digit[(b >>> 4) & 0x0F];temp[1] = digit[b & 0x0F];String s = new String(temp);return s;}
byte數(shù)組轉(zhuǎn)為字符串 : 需要調(diào)用上面的類;
-- 示例代碼 :?
/** 將byte數(shù)組轉(zhuǎn)為字符串*/public static String byte2str(byte[] byteArray) {String str = "";for(int i = 0; i < byteArray.length; i ++){str += byte2HexStr(byteArray[i]);}return str;}
(5) 向微信服務(wù)器發(fā)送信息
發(fā)送信息 : 先獲取輸出流, 然后校驗(yàn), 如果通過校驗(yàn)就向微信服務(wù)器發(fā)送信息;
-- 示例代碼 :?
//創(chuàng)建一個(gè)出處流, 用于向微信服務(wù)器發(fā)送數(shù)據(jù)PrintWriter out = resp.getWriter();//如果校驗(yàn)通過, 向微信服務(wù)器發(fā)送echostr參數(shù)if(VerifyUtils.checkSignature(signature, timestamp, nonce)){out.print(echostr);}//釋放資源out.close();out = null;
.
2. 程序源碼
GitHub源碼位置 :
-- HTTP :?https://github.com/han1202012/WeChatVerify.git
-- SSH :?git@github.com:han1202012/WeChatVerify.git
CSDN下載認(rèn)證程序的war包和源碼 :?http://download.csdn.net/detail/han1202012/6999207
微信驗(yàn)證war包下載 :?
-- 訪問地址 :?ip地址:80/WeChatVerify/verifyServlet ;
-- Token : 注意Token是 "hanshuliang" ;
程序結(jié)構(gòu) :?
Servlet源碼 :?
package shuliang.han.vertify.servlet;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;import shuliang.han.vertify.VerifyUtils;public class VerifyServlet extends HttpServlet {private static final long serialVersionUID = 4440739483644L;@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {//獲取微信服務(wù)器發(fā)送給我們的四個(gè)參數(shù)String signature = req.getParameter("signature");String timestamp = req.getParameter("timestamp");String nonce = req.getParameter("nonce");String echostr = req.getParameter("echostr");//創(chuàng)建一個(gè)出處流, 用于向微信服務(wù)器發(fā)送數(shù)據(jù)PrintWriter out = resp.getWriter();//如果校驗(yàn)通過, 向微信服務(wù)器發(fā)送echostr參數(shù)if(VerifyUtils.checkSignature(signature, timestamp, nonce)){out.print(echostr);}//釋放資源out.close();out = null;}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {//注意這里不能有任何操作, 否則不能完成驗(yàn)證}}
驗(yàn)證工具類源碼 :?
package shuliang.han.vertify;import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.Arrays;public class VerifyUtils {private final static String token = "hanshuliang";public static boolean checkSignature(String signature, String timestamp, String nonce) {//將token timestamp nonce 按照字典順序排序String[] params = new String[]{token, timestamp, nonce};Arrays.sort(params);//將上面三個(gè)參數(shù)排序之后拼接成字符串StringBuffer buffer = new StringBuffer();for(int i = 0; i < params.length; i ++){buffer.append(params[i]);}//str用于存儲加密后的字符串String str = null;try {//獲取sha1加密對象MessageDigest digest = MessageDigest.getInstance("SHA-1");//將組合后的字符串使用sha1加密, 加密后獲得一個(gè)byte數(shù)組byte[] byteDigest = digest.digest(buffer.toString().getBytes());//獲取加密后的字符串, 將byte數(shù)組轉(zhuǎn)化為字符串str = byte2str(byteDigest);} catch (NoSuchAlgorithmException e) {e.printStackTrace();}/** 將加密后的字符串 與 signature 參數(shù)進(jìn)行比較, * 如果加密后的字符串為null直接返回false* 如果加密后的字符串不為null, 直接返回*/boolean isVerified = (str != null) ? str.equals(signature.toUpperCase()) : false;return isVerified;}/** 將byte數(shù)組轉(zhuǎn)為字符串*/public static String byte2str(byte[] byteArray) {String str = "";for(int i = 0; i < byteArray.length; i ++){str += byte2HexStr(byteArray[i]);}return str;}/** 將byte轉(zhuǎn)為字符串*/public static String byte2HexStr(byte b) {char[] digit = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};char[] temp = new char[2];temp[0] = digit[(b >>> 4) & 0x0F];temp[1] = digit[b & 0x0F];String s = new String(temp);return s;}}
web.xml配置文件 :?
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" 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_2_5.xsd"><servlet><servlet-name>verifyServlet</servlet-name><servlet-class>shuliang.han.vertify.servlet.VerifyServlet</servlet-class></servlet><servlet-mapping><servlet-name>verifyServlet</servlet-name><url-pattern>/verifyServlet</url-pattern></servlet-mapping><welcome-file-list><welcome-file>index.jsp</welcome-file></welcome-file-list> </web-app>
?
三. 進(jìn)行校驗(yàn)
1.部署程序
(1) 導(dǎo)出war包
(2) 將war包上傳到服務(wù)器
(3) 配置Tomcat的server.xml文件
微信服務(wù)器只能接受80端口數(shù)據(jù) :?
<Connector port="80" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />2. 使用阿里云服務(wù)器
將上面的程序?qū)С龅膚ar包, 放到阿里云Tomcat服務(wù)器下 : 使用 http://hanshuliang.com:8080/WeChatVerify/verifyServlet?登陸;
-- 結(jié)果 : 這是正常情況, 因?yàn)樵赑OST中沒有添加參數(shù);
HTTP Status 500 -
type?Exception report
message
description?The server encountered an internal error () that prevented it from fulfilling this request.
exception
java.lang.NullPointerExceptionjava.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端口, 我的服務(wù)器上跑著ngix服務(wù)器, 獨(dú)立域名博客在上面那 : 郁悶 ...
2. 開始校驗(yàn)
原來的Ngix服務(wù)器中80端口是獨(dú)立域名博客, 現(xiàn)在講獨(dú)立域名博客指到 8086端口中 : 現(xiàn)在獨(dú)立域名博客可以從?http://hanshuliang.com:8086/?訪問;
將Tomcat設(shè)置成80端口, 氣死我了 ;
終于成功了 : 哭死了, 調(diào)試了好長時(shí)間啊, 終于通過了;
接口功能不全, 只有基礎(chǔ)接口的權(quán)限 ...
GitHub源碼位置?:
--?HTTP?:?https://github.com/han1202012/WeChatVerify.git
--?SSH?:?git@github.com:han1202012/WeChatVerify.git
CSDN下載認(rèn)證程序的war包和源碼?:?http://download.csdn.net/detail/han1202012/6999207
微信驗(yàn)證war包下載?:?
--?訪問地址?:?ip地址:80/WeChatVerify/verifyServlet ;
--?Token?: 注意Token是 "hanshuliang" ;
.
作者?:?萬境絕塵
轉(zhuǎn)載請注明出處?:?http://blog.csdn.net/shulianghan/article/details/20494177
.
總結(jié)
以上是生活随笔為你收集整理的【微信开发】微信开发 之 开启开发模式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【微信开发】微信公众号开发 之 编辑模式
- 下一篇: 【UML 建模】UML入门 之 交互图