【微信開發】微信開發 之 開啟開發模式
.
作者 : 萬境絕塵
.
GitHub原始碼位置 :
-- HTTP : https://github.com/han1202012/WeChatVerify.git
-- SSH : [email protected]:han1202012/WeChatVerify.git
微信驗證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引數;
-- 示例 :
//獲取微信伺服器傳送給我們的四個引數
String signature = req.getParameter("signature");
String timestamp = req.getParameter("timestamp");
String nonce = req.getParameter("nonce");
String echostr = req.getParameter("echostr");
(2) 將引數按照字典順序排序
排序方法 : 陣列工具類 Arrays.sort()會自動將陣列中的字串按照字典循序排序;
-- 程式碼示例 :
//將token timestamp nonce 按照字典順序排序
String[] params = new String[]{token, timestamp, nonce};
Arrays.sort(params);
//將上面三個引數排序之後拼接成字串
StringBuffer buffer = new StringBuffer();
for(int i = 0; i < params.length; i ++){
buffer.append(params[i]);
}
(3) sha1 加密
獲取MessageDigest加密類 : 通過呼叫 MessageDigest.getInstance("SHA-1"), 即可獲取sha1加密類;
-- 程式碼示例 :
//獲取sha1加密物件
MessageDigest digest = MessageDigest.getInstance("SHA-1");
//將組合後的字串使用sha1加密, 加密後獲得一個byte陣列
byte[] byteDigest = digest.digest(buffer.toString().getBytes());
(4) byte陣列轉為字串
byte轉為char型別 :
-- 示例程式碼 :
/*
* 將byte轉為字串
*/
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陣列轉為字串 : 需要呼叫上面的類;
-- 示例程式碼 :
/*
* 將byte陣列轉為字串
*/
public static String byte2str(byte[] byteArray) {
String str = "";
for(int i = 0; i < byteArray.length; i ++){
str += byte2HexStr(byteArray[i]);
}
return str;
}
(5) 向微信伺服器傳送資訊
傳送資訊 : 先獲取輸出流, 然後校驗, 如果通過校驗就向微信伺服器傳送資訊;
-- 示例程式碼 :
//建立一個出處流, 用於向微信伺服器傳送資料
PrintWriter out = resp.getWriter();
//如果校驗通過, 向微信伺服器傳送echostr引數
if(VerifyUtils.checkSignature(signature, timestamp, nonce)){
out.print(echostr);
}
//釋放資源
out.close();
out = null;
.
2. 程式原始碼
GitHub原始碼位置 :
-- HTTP : https://github.com/han1202012/WeChatVerify.git
-- SSH : [email protected]:han1202012/WeChatVerify.git
微信驗證war包下載 :
-- 訪問地址 : ip地址:80/WeChatVerify/verifyServlet ;
-- Token : 注意Token是 "hanshuliang" ;
程式結構 :
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;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
//獲取微信伺服器傳送給我們的四個引數
String signature = req.getParameter("signature");
String timestamp = req.getParameter("timestamp");
String nonce = req.getParameter("nonce");
String echostr = req.getParameter("echostr");
//建立一個出處流, 用於向微信伺服器傳送資料
PrintWriter out = resp.getWriter();
//如果校驗通過, 向微信伺服器傳送echostr引數
if(VerifyUtils.checkSignature(signature, timestamp, nonce)){
out.print(echostr);
}
//釋放資源
out.close();
out = null;
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
//注意這裡不能有任何操作, 否則不能完成驗證
}
}
驗證工具類原始碼 :
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);
//將上面三個引數排序之後拼接成字串
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加密, 加密後獲得一個byte陣列
byte[] byteDigest = digest.digest(buffer.toString().getBytes());
//獲取加密後的字串, 將byte陣列轉化為字串
str = byte2str(byteDigest);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
/*
* 將加密後的字串 與 signature 引數進行比較,
* 如果加密後的字串為null直接返回false
* 如果加密後的字串不為null, 直接返回
*/
boolean isVerified = (str != null) ? str.equals(signature.toUpperCase()) : false;
return isVerified;
}
/*
* 將byte陣列轉為字串
*/
public static String byte2str(byte[] byteArray) {
String str = "";
for(int i = 0; i < byteArray.length; i ++){
str += byte2HexStr(byteArray[i]);
}
return str;
}
/*
* 將byte轉為字串
*/
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>
三. 進行校驗
1.部署程式
(1) 匯出war包
(2) 將war包上傳到伺服器
(3) 配置Tomcat的server.xml檔案
微信伺服器只能接受80埠資料 :
<Connector port="80" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
2. 使用阿里雲伺服器
-- 結果 : 這是正常情況, 因為在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 : [email protected]:han1202012/WeChatVerify.git
微信驗證war包下載 :
-- 訪問地址 : ip地址:80/WeChatVerify/verifyServlet ;
-- Token : 注意Token是 "hanshuliang" ;
.
作者 : 萬境絕塵
.
相關推薦
【微信開發】微信公眾號後臺底部選單欄json資料加入(獲取)方式操作
首先獲取微信公號的 開發者ID(AppID) 開發者密碼(AppSecret) 登入公眾號 找到以下選項 找到獲得access_token的引數 根據引數取得access_token URL: https://a
【WEB開發】微信網頁授權第三方登入介面(WEB登入)
本文連結至:http://blog.csdn.net/hxker/article/details/50260669 第一步:獲取AppID AppSecret(不做解釋,自己去微信公眾平臺申請) 第二步:生成掃描二維碼,獲取code https://open
Java微信公眾平臺開發(十四)【番外篇】--微信web開發者工具使用
str weixin ron log 返回 nbsp 地址欄 alt 直接 轉自:http://www.cuiyongzhi.com/post/58.html 為幫助開發者更方便、更安全地開發和調試基於微信的網頁,微信推出了 web 開發者工具。它是一個桌面應用,通過模擬微
【微信開發】微信開發 之 開啟開發模式
.作者 : 萬境絕塵.GitHub原始碼位置 :-- HTTP : https://github.com/han1202012/WeChatVerify.git-- SSH : [email protected]:han1202012/WeChatVerify.gi
【Lua基礎學習】微信三公源碼搭建---Lua基礎數據類型
浮點 賦值 源碼 boolean 語言 pos 線路 mce blog 微信三公源碼搭建Q1446595067 官網:h5.haozibbs.com 數據類型 介紹 Lua是動態類型語言,變量不要類型定義,只需要為變量賦值。 值可以存儲在變量中,作為參數傳遞或結果返回。 L
【TP3.2.3】微信網頁授權--基類
重新 exec 進入 index.php sset AR 關註 fun func 非常好用的微信授權 基類:其他的微信權限類都可以繼承至該類: <?php namespace Wechat\Controller; use Think\Controller;
【插件分享】 OurPhp建站系統如何開發驗證碼短信
博文 容易 https 短信接口 版權 短信平臺 自己 針對 ike 在互億無線短信平臺找到一個插件,在這邊分享一下,有需要可以了解,比自己開發要容易很多哦。http://www.ihuyi.com/ 插件說明本插件系互億無線針對OURSHOP1.7.6短信插件開發,插件內
第二篇 :微信公眾平臺開發實戰Java版之開啟開發者模式,接入微信公眾平臺開發
第一部分:微信公眾號對接的基本介紹 一、填寫伺服器配置資訊的介紹 登入微信公眾平臺官網後,進入到公眾平臺後臺管理頁面。 選擇 公眾號基本設定-》基本配置 ,點選“修改配置”按鈕,填寫伺服器地址(URL)、Token和EncodingAESKey。 微信公眾號配置介面: 以上
【微信混淆】微信新的jar混淆無法分享問題
場景:最近公司需要做微信支付,引用新的jar包,發現混淆後無法分享。 思路:1、開始以為是支付的jar包和分享的不一致,最後換了一個統一的,使用微信Sample分享沒有問題 2、將Sample改
【小程式問題】微信小程式 在canvas畫布上划動 頁面跟著滑動
微信小程式官方文件有說明,disable-scroll="true" 可以阻止頁面下拉和滾動。這裡有個坑,disable-scroll在真機上如果要生效,那麼要給canvas繫結一個觸控事件才能生效。<canvas disable-scroll="true" bindtouchmove="touchMo
【微信支付】微信官方支付驗籤原始碼分析
1.背景 隨著微信的迅速崛起,在網際網路支付的方式中,微信支付成了舉足輕重的一部分。作為程式設計師,在朝著網際網路靠攏的途中,瞭解微信支付必不可少。此處,筆者分享一下微信官方對於微信回撥通知返回的xml資料進行支付驗證簽名的處理。 2.原始碼分析
【5000 Stars 福利】微信介面動態 WebApi 使用說明
前言 作為中國 C# 開源專案中 Watch/Star/Fork 最高的專案之一,Senparc.Weixin SDK 凝聚了盛派微信團隊持續7年的付出,和大量開發者的無私貢獻,以及數萬開發者的使用與反饋。為了紀念 Senparc.Weixin SD
Python開發【第五篇】:Python基礎之2
對齊方式 dex 字符串 後退 ring lag nic 有效 func 字符串格式化 Python的字符串格式化有兩種方式: 百分號方式、format方式 百分號的方式相對來說比較老,而format方式則是比較先進的方式,企圖替換古老的方式,目前兩者並存。[PEP-310
Python開發【第四篇】:Python基礎之函數
nco pos *args 更強 三元 sequence hunk ins att 三元運算 三元運算(三目運算),是對簡單的條件語句的縮寫。 # 書寫格式 result = 值1 if 條件 else 值2 # 如果條件成立,那麽將 “值1” 賦值給result
【源碼分享】短信平臺插件74cms_v4.1_騎士人才系統
公司 插件 短信驗證碼 平臺 系統管 源碼分享 無線 com 文件 對接短信的時候發現一家短信公司,有些不錯的短信驗證碼的插件,對接起來挺方便的,有需求的可以看一下。http://www.ihuyi.com/ 插件說明 本插件系互億無線針對74cms_v4.1開發,請按以下
【插件分享】短信應用,短信對接友價源碼系統
ebs utf nco service function submit use word 很多 在互億無線短信平臺找到一個插件,在這邊分享一下,有需要可以了解,比自己開發要容易很多哦。http://www.ihuyi.com/插件說明本插件系互億無線針對友價源碼系統開發,請
【源碼分享】短信驗證碼功能對接CmsEasy
源碼分享 無線 設置 功能 之前 文件覆蓋 完成 系統管 版本 對接短信的時候發現一家短信公司,有些不錯的短信驗證碼的插件,對接起來挺方便的,有需求的可以看一下。http://www.ihuyi.com/插件說明本插件系互億無線針對CmsEasy_5.6_UTF-8_201
【源碼分享】短信驗證碼如何對接 WordPressv4.0,短信插件
word www. ont wordpress 1.0 key 驗證 註冊 插件 對接短信的時候發現一家短信公司,有些不錯的短信驗證碼的插件,對接起來挺方便的,有需求的可以看一下。http://www.ihuyi.com/插件說明本插件系互億無線針對Wordpress開發,
【源碼分享】短信驗證碼如何實現微米CMS
用戶 帳戶 登錄 article 不錯 原創 tail 發現 reg 對接短信的時候發現一家短信公司,有些不錯的短信驗證碼的插件,對接起來挺方便的,有需求的可以看一下。http://www.ihuyi.com/插件說明本插件系互億無線針對微米CMS_V29.2版本開發,請按
【源碼分享】短信如何實現ECmall_V2.3驗證碼功能
說明 管理 處理 用戶註冊 手機號 方便 功能介紹 發現 源碼 對接短信的時候發現一家短信公司,有些不錯的短信驗證碼的插件,對接起來挺方便的,有需求的可以看一下。http://www.ihuyi.com/ 插件說明本插件系互億無線針對ECmall_V2.3短信插件開發,插件