微信開発のオープン開発モード


..。
作者:万境絶塵
転載は出典を明記してください。 http://blog.csdn.net/shulianghan/article/details/20494177
..。
GitHubソースの位置 :
-- HTTP : https://github.com/han1202012/WeChatVerify.git
-- SSH : [email protected]:han 12012/WeChat Verify.git
CSDNは認証プログラムのwarカバンとソースをダウンロードします。 : http://download.csdn.net/detail/han1202012/6999207
WeChatはwarパッケージのダウンロードを検証します。 : 
-- アクセスアドレス : ipアドレス:80/WeChat Verify/verifyServlet;
-- Token : Tokenは「hashuliang」です。
一.オープン開発モード解析
1.開発者ドキュメント
まず編集モードに入り、編集モードをオフにして、開発モードに入ります。 
微信开发 之 开启开发模式_第1张图片
ドキュメントを表示するには、WeChatの開発者ドキュメントを開くことができます。ルート機能->上級機能->開発モード->ドキュメントを表示します。
微信开发 之 开启开发模式_第2张图片
開発者ドキュメントディレクトリの構造説明: 
――初心者アクセス:アクセスガイドの典型的な事例を含めて開発者の仕様を紹介し、開発者のモデルにどうやってアクセスするかを説明します。
--基礎サポート:access_の取得を含むtokenグローバルリターンコードは、インターフェース周波数制限を説明し、マルチメディアファイルをアップロードしてダウンロードする。
--受信メッセージ:認証メッセージの真正性受信通常メッセージ受信イベントの送達を含み、音声認識結果を受信する。
--受動応答メッセージを送信することと、サービスメッセージを送信することと、
--ユーザ管理:グループ管理インターフェースを含むユーザ基本情報取得対象者リスト取得ユーザ地理位置ウェブページ認証ユーザ基本情報ウェブページ取得ユーザネットワーク状態。
--カスタムメニュー:カスタムメニュー作成インターフェースカスタムメニュークエリインターフェースカスタムメニュー削除インターフェースカスタムメニューイベントプッシュを含む。
--プロモーションサポート:パラメータを生成する二次元コードを含みます。
--WeChat JSインターフェース:WeChatのウェブページの右上隅を隠すボタンを含む、WeChatのウェブページの下部にあるナビゲーションバーのウェブページからユーザーネットワークの状態を取得する。
--開発者交流互助:開発者クイズシステムインターフェースデバッグツールインターフェース体験テスト番号申請を含みます。
2.開発者検証プロセスの解析
(1)申請メッセージインターフェース
開発モードの「開発者になる」ボタンをクリックすると、プロトコルが表示されます。 
微信开发 之 开启开发模式_第3张图片
後はURLとTokenを記入します。 
--URL:WeChatサーバデータを受信するためのインターフェースURL。
--Token:任意に記入し、署名を生成するために使用します。
微信开发 之 开启开发模式_第4张图片
(2)URLの有効性を確認する
微信开发 之 开启开发模式_第5张图片
検証プロセス:プログラムはHTTP GET要求を処理し、要求者のアイデンティティを検証し、WeChatサーバからの要求を確保しなければならない。
--パラメータの取得:HTTP GETは4つのパラメータsignature timestamp nonce echostrを携帯します。
--綴りパラメータ:並べ替えられた3つのパラメータを辞書順に文字列に並べます。
--暗号化パラメータ:並べ替えられた文字列をshar 1で暗号化します。
--結果を返します。暗号化された文字列をsignatureパラメータと比較し、等しい場合はマイクロクレジットサーバから要求し、そのままパラメータechostrに戻ります。
二.開発検証プログラム
1.要点解析
(1)servletで4つのパラメータを取得する
取得方法: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)パラメータを辞書順に並べ替える
並べ替え方法:配列ツール類Arays.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)shar 1暗号化
Message Digest暗号化クラスを取得する:Message Digest.get Instance(「SHA-1」)を呼び出すことで、shar 1暗号化クラスを取得することができます。
--コードの例: 
			//  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)WeChatサーバに情報を送信する
送信情報:まず出力ストリームを取得してから検証し、検証すればWeChatサーバに情報を送信する。
--例示コード: 
		//       ,             
		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]:han 12012/WeChat Verify.git
CSDNは認証プログラムのwarバッグとソースコードをダウンロードします。 http://download.csdn.net/detail/han1202012/6999207
WeChat検証warパッケージダウンロード: 
--アクセスアドレス: ipアドレス:80/WeChat Verify/verifyServlet;
--Token:Tokenに注意することは「hashuliang」です。
プログラム構造: 
微信开发 之 开启开发模式_第6张图片
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バッグを引き出す
微信开发 之 开启开发模式_第7张图片
微信开发 之 开启开发模式_第8张图片
(2)warパッケージをサーバにアップロードする
微信开发 之 开启开发模式_第9张图片
(3)Tomcatのserver.xmlファイルを配置する
WeChatサーバは80ポートのデータしか受け付けられません。 
    <Connector port="80" protocol="HTTP/1.1" 
               connectionTimeout="20000" 
               redirectPort="8443" />
2.阿里雲サーバーを使う
上のプログラムをエクスポートしたwarパッケージをアリ雲Tomcatサーバーの下に置いてください。http://hanshuliang.com:8080/WeChatVerify/verifyServlet ログイン
--結果:これは通常の状況です。POSTにパラメータが追加されていないためです。
HTTP Sttus 500-
タイプ Exceptionレポート
メッセージ
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)
ノート 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サーバーを走っています。独立ドメイン名のブログは上にあります。
微信开发 之 开启开发模式_第10张图片
2.検証を開始する
元のNgixサーバーの80ポートは独立したドメイン名のブログです。現在は独立したドメイン名のブログは8086ポートの中を指しています。 http://hanshuliang.com:8086/ アクセス
Tomcatを80ポートに設定して、息が切れました。
微信开发 之 开启开发模式_第11张图片
やっと成功しました。泣きました。長い間デバッグしました。やっとパスしました。
微信开发 之 开启开发模式_第12张图片
インターフェースの機能が不完全で、基礎インターフェースの権限しかありません。
GitHubソースの位置 :
-- HTTP : https://github.com/han1202012/WeChatVerify.git
-- SSH : [email protected]:han 12012/WeChat Verify.git
CSDNは認証プログラムのwarカバンとソースをダウンロードします。 : http://download.csdn.net/detail/han1202012/6999207
WeChatはwarパッケージのダウンロードを検証します。 : 
-- アクセスアドレス : ipアドレス:80/WeChat Verify/verifyServlet;
-- Token : Tokenは「hashuliang」です。
..。
作者 : 万の境に塵を絶つ
転載は出典を明記してください。 : http://blog.csdn.net/shulianghan/article/details/20494177
..。