1. 程式人生 > >【微信開發】微信開發 之 開啟開發模式

【微信開發】微信開發 之 開啟開發模式

.

作者 : 萬境絕塵

.

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短信插件開發,插件