I如何接入服務器,下面就為大家進行介紹
一、說明
* 本示例根據微信開發文檔:http://mp.weixin.qq.com/wiki/home/index.html最新版(4/3/2016 5:34:36 PM )進行開發演示。
* 編輯平台:myeclipse10.7+win32+jdk1.7+tomcat7.0
* 服務器:阿里雲 windows server 2008 64bits
* 平台要求:servlet使用注解方式,平台要求:j2ee6.0+、jdk6.0+、tomcat7.0+
* 演示更加注重於api解析。
* 為了便於測試說明,每個測試用例為獨立,不依賴於其它方法。對於封裝,不多加考慮。
* 演示盡可能按照API要求進行,目的:了解文檔使用方式,達到舉一反三的效果。
* 知識要求:牢固的java基礎、了解http網絡通信知識、對於javaweb有足夠了解、json解析
* 當前時間:4/3/2016 5:32:57 PM ,以該時間為准。
二、文檔原文(摘要)
文檔地址:http://mp.weixin.qq.com/wiki/8/f9a0b8382e0b77d87b3bcc1ce6fbc104.html
接入微信公眾平台開發,開發者需要按照如下步驟完成:
1、填寫服務器配置
2、驗證服務器地址的有效性
3、依據接口文檔實現業務邏輯
三、文檔理解
驗證服務器地址的有效性
1、api這樣介紹:
開發者提交信息后,微信服務器將發送GET請求到填寫的服務器地址URL上,GET請求攜帶四個參數:signature、timestamp、nonce、echostr
開發者通過檢驗signature對請求進行校驗(下面有校驗方式)。
若確認此次GET請求來自微信服務器,請原樣返回echostr參數內容,則接入生效,成為開發者成功,否則接入失敗。
加密/校驗流程如下:
1)、將token、timestamp、nonce三個參數進行字典序排序
2)、將三個參數字符串拼接成一個字符串進行sha1加密
3)、開發者獲得加密后的字符串可與signature對比,標識該請求來源於微信
2、理解
說明該請求是“GET”方式,並且訪問該請求會返回四個參數:signature、timestamp、nonce、echostr。
我們需要接受這幾個參數,然后進行處理。如果驗證成功,返回接收到的“echostr”,否則驗證失敗。
驗證方式是對接受到的token、timestamp、nonce三個參數進行字典序排序,然后進行sha1加密,最后和signature對比。
*加密后的字符串可與signature對比,如果相等【該處api可能解釋不是太明白】,返回“echostr”,驗證成功。
3、實現
創建一個servlet CoreServlet實現HttpServlet,重載doGet方法。
package reyo.sdk.utils.weixin;
import java.io.IOException;
import java.io.PrintWriter;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/CoreServlet")
public class CoreServlet extends HttpServlet {
private static final long serialVersionUID = -7002640712248365625L;
String TAG = "CoreServlet";
/*
* 1)、包括內容 服務器配置主要是當我們寫好自己的接入微信開發平台的代碼之后要配置的服務器和微信接入接口。 2)、服務器操作
* 打開服務器的tomcat,將寫好的代碼放到webapps文件下。 3)、微信公眾平台操作
* 申請微信測試賬號(直接用微信掃一掃即可以登錄):http:/
* /mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login
* 打開微信公眾平台測試號,配置接口配置信息。配置如下 URL:http://ip/WeixinApiDemo/CoreServlet
* Token:wgyscsf提交,配置成功和失敗均會有提醒。 第二步:驗證服務器地址的有效性
* 開發者提交信息后,微信服務器將發送GET請求到填寫的服務器地址URL上,
* GET請求攜帶四個參數:signature、timestamp、nonce、echostr
* 開發者通過檢驗signature對請求進行校驗(下面有校驗方式)。 若確認此次GET請求來自微信服務器,請原樣返回echostr參數內容,
* 則接入生效, 成為開發者成功,否則接入失敗。
*
* 加密/校驗流程如下: 1. 將token、timestamp、nonce三個參數進行字典序排序 2.
* 將三個參數字符串拼接成一個字符串進行sha1加密 3. 開發者獲得加密后的字符串可與signature對比,標識該請求來源於微信
*/
/*
* 字典排序(lexicographical
* order)是一種對於隨機變量形成序列的排序方法。其方法是,按照字母順序,或者數字小大順序,由小到大的形成序列。
*/
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 設置編碼
req.setCharacterEncoding("utf-8");
resp.setContentType("html/text;charset=utf-8");
resp.setCharacterEncoding("utf-8");
// 獲取輸出流
PrintWriter printWriter = resp.getWriter();
// 設置一個全局的token,開發者自己設置。api這樣解釋:Token可由開發者可以任意填寫,
// 用作生成簽名(該Token會和接口URL中包含的Token進行比對,從而驗證安全性)
String token = "reyo";
// 根據api說明,獲取上述四個參數
String signature = req.getParameter("signature");
String timestamp = req.getParameter("timestamp");
String nonce = req.getParameter("nonce");
String echostr = req.getParameter("echostr");
// // temp:臨時打印,觀看返回參數情況
System.out.println(TAG + ":signature:" + signature + ",timestamp:" + timestamp + ",nonce:" + nonce + ",echostr:" + echostr);
// 根據api所說的“加密/校驗流程”進行接入。共計三步
// 第一步:將token、timestamp、nonce三個參數進行字典序排序
String[] parms = new String[] { token, timestamp, nonce };// 將需要字典序排列的字符串放到數組中
Arrays.sort(parms);// 按照api要求進行字典序排序
// 第二步:將三個參數字符串拼接成一個字符串進行sha1加密
// 拼接字符串
String parmsString = "";// 注意,此處不能=null。
for (int i = 0; i < parms.length; i++) {
parmsString += parms[i];
}
// sha1加密
String mParms = null;// 加密后的結果
MessageDigest digest = null;
try {
digest = java.security.MessageDigest.getInstance("SHA");
} catch (NoSuchAlgorithmException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
digest.update(parmsString.getBytes());
byte messageDigest[] = digest.digest();
// Create Hex String
StringBuffer hexString = new StringBuffer();
// 字節數組轉換為 十六進制 數
for (int i = 0; i < messageDigest.length; i++) {
String shaHex = Integer.toHexString(messageDigest[i] & 0xFF);
if (shaHex.length() < 2) {
hexString.append(0);
}
hexString.append(shaHex);
}
mParms = hexString.toString();// 加密結果
/*
* api要求: 若確認此次GET請求來自微信服務器,請原樣返回echostr參數內容, 則接入生效, 成為開發者成功,否則接入失敗。
*/
// 第三步: 開發者獲得加密后的字符串可與signature對比,標識該請求來源於微信接入成功。
System.out.println(TAG + ":" + mParms + "---->" + signature);
if (mParms.equals(signature)) {
System.out.println(TAG + ":" + mParms + "---->" + signature);
printWriter.write("echostr:" + echostr);
} else {
// 接入失敗,不用回寫
System.out.println(TAG + "接入失敗");
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
4、填寫服務器配置
1)、包括內容
服務器配置主要是當我們寫好自己的接入微信開發平台的代碼之后要配置的服務器和微信接入接口。
2)、服務器操作
打開服務器的tomcat,將寫好的代碼放到webapps文件下。
3)、微信公眾平台操作
*申請微信測試賬號(直接用微信掃一掃即可以登錄):http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login
*打開微信公眾平台測試號,配置接口配置信息。配置如下
URL:https://sms.reyo.cn/Weixin/CoreServlet
Token:reyo
*提交,配置成功和失敗均會有提醒。
