java微信開發(fā)API第一步 服務(wù)器接入
微信開發(fā)API如何接入服務(wù)器,下面就為大家進(jìn)行介紹
一、說明
* 本示例根據(jù)微信開發(fā)文檔:http://mp.weixin.qq.com/wiki/home/index.html最新版(4/3/2016 5:34:36 PM )進(jìn)行開發(fā)演示。
* 編輯平臺(tái):myeclipse10.7+win32+jdk1.7+tomcat7.0
* 服務(wù)器:阿里云 windows server 2008 64bits
* 平臺(tái)要求:servlet使用注解方式,平臺(tái)要求:j2ee6.0+、jdk6.0+、tomcat7.0+
* 演示更加注重于api解析。
* 為了便于測試說明,每個(gè)測試用例為獨(dú)立,不依賴于其它方法。對(duì)于封裝,不多加考慮。
* 演示盡可能按照API要求進(jìn)行,目的:了解文檔使用方式,達(dá)到舉一反三的效果。
* 知識(shí)要求:牢固的java基礎(chǔ)、了解http網(wǎng)絡(luò)通信知識(shí)、對(duì)于javaweb有足夠了解、json解析
* 當(dāng)前時(shí)間:4/3/2016 5:32:57 PM ,以該時(shí)間為準(zhǔn)。
二、文檔原文(摘要)
文檔地址:http://mp.weixin.qq.com/wiki/8/f9a0b8382e0b77d87b3bcc1ce6fbc104.html
接入微信公眾平臺(tái)開發(fā),開發(fā)者需要按照如下步驟完成:
1、填寫服務(wù)器配置
2、驗(yàn)證服務(wù)器地址的有效性
3、依據(jù)接口文檔實(shí)現(xiàn)業(yè)務(wù)邏輯
三、文檔理解
驗(yàn)證服務(wù)器地址的有效性
1、api這樣介紹:
開發(fā)者提交信息后,微信服務(wù)器將發(fā)送GET請(qǐng)求到填寫的服務(wù)器地址URL上,GET請(qǐng)求攜帶四個(gè)參數(shù):signature、timestamp、nonce、echostr
開發(fā)者通過檢驗(yàn)signature對(duì)請(qǐng)求進(jìn)行校驗(yàn)(下面有校驗(yàn)方式)。
若確認(rèn)此次GET請(qǐng)求來自微信服務(wù)器,請(qǐng)?jiān)瓨臃祷豦chostr參數(shù)內(nèi)容,則接入生效,成為開發(fā)者成功,否則接入失敗。
加密/校驗(yàn)流程如下:
1)、將token、timestamp、nonce三個(gè)參數(shù)進(jìn)行字典序排序
2)、將三個(gè)參數(shù)字符串拼接成一個(gè)字符串進(jìn)行sha1加密
3)、開發(fā)者獲得加密后的字符串可與signature對(duì)比,標(biāo)識(shí)該請(qǐng)求來源于微信
2、理解
說明該請(qǐng)求是“GET”方式,并且訪問該請(qǐng)求會(huì)返回四個(gè)參數(shù):signature、timestamp、nonce、echostr。
我們需要接受這幾個(gè)參數(shù),然后進(jìn)行處理。如果驗(yàn)證成功,返回接收到的“echostr”,否則驗(yàn)證失敗。
驗(yàn)證方式是對(duì)接受到的token、timestamp、nonce三個(gè)參數(shù)進(jìn)行字典序排序,然后進(jìn)行sha1加密,最后和signature對(duì)比。
*加密后的字符串可與signature對(duì)比,如果相等【該處api可能解釋不是太明白】,返回“echostr”,驗(yàn)證成功。
3、實(shí)現(xiàn)
創(chuàng)建一個(gè)servlet CoreServlet實(shí)現(xiàn)HttpServlet,重載doGet方法。
參數(shù)準(zhǔn)備
// 設(shè)置一個(gè)全局的token,開發(fā)者自己設(shè)置。api這樣解釋:Token可由開發(fā)者可以任意填寫,
// 用作生成簽名(該Token會(huì)和接口URL中包含的Token進(jìn)行比對(duì),從而驗(yàn)證安全性)
String token = "wgyscsf";
// 根據(jù)api說明,獲取上述四個(gè)參數(shù)
String signature = req.getParameter("signature");
String timestamp = req.getParameter("timestamp");
String nonce = req.getParameter("nonce");
String echostr = req.getParameter("echostr");
根據(jù)api所說的三步驟進(jìn)行操作
// 第一步:將token、timestamp、nonce三個(gè)參數(shù)進(jìn)行字典序排序
String[] parms = new String[] { token, timestamp, nonce };// 將需要字典序排列的字符串放到數(shù)組中
Arrays.sort(parms);// 按照api要求進(jìn)行字典序排序【百度:什么是字典序排序】
// 第二步:將三個(gè)參數(shù)字符串拼接成一個(gè)字符串進(jìn)行sha1加密【百度:java sha1加密】
// 拼接字符串
String parmsString = "";// 注意,此處不能=null。
for (int i = 0; i < parms.length; i++) {
parmsString += parms[i];
}
// sha1加密
String mParms = null;// 加密后的結(jié)果
... //該地方是sha1加密的實(shí)現(xiàn),不再貼代碼
mParms = hexString.toString();// 加密結(jié)果
/*
* api要求: 若確認(rèn)此次GET請(qǐng)求來自微信服務(wù)器,請(qǐng)?jiān)瓨臃祷豦chostr參數(shù)內(nèi)容, 則接入生效, 成為開發(fā)者成功,否則接入失敗。
*/
// 第三步: 開發(fā)者獲得加密后的字符串可與signature對(duì)比,標(biāo)識(shí)該請(qǐng)求來源于微信接入成功。
System.out.println(TAG + ":" + mParms + "---->" + signature);
if (mParms.equals(signature)) {
// System.out.println(TAG + ":" + mParms + "---->" + signature);
printWriter.write(echostr);
} else {
// 接入失敗,不用回寫
// System.out.println(TAG + "接入失敗");
}
4、填寫服務(wù)器配置
1)、包括內(nèi)容
服務(wù)器配置主要是當(dāng)我們寫好自己的接入微信開發(fā)平臺(tái)的代碼之后要配置的服務(wù)器和微信接入接口。
2)、服務(wù)器操作
打開服務(wù)器的tomcat,將寫好的代碼放到webapps文件下。
3)、微信公眾平臺(tái)操作
*申請(qǐng)微信測試賬號(hào)(直接用微信掃一掃即可以登錄):http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login
*打開微信公眾平臺(tái)測試號(hào),配置接口配置信息。配置如下
URL:http://ip/WeixinApiDemo/CoreServlet
Token:wgyscsf
*提交,配置成功和失敗均會(huì)有提醒。
該部分所有操作源碼,可以直接使用
package com.gist.servlet;
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;
/**
* @author 高遠(yuǎn)</n> 郵箱:wgyscsf@163.com</n> 博客 http://blog.csdn.net/wgyscsf</n>
* 編寫時(shí)期 2016-4-3 下午4:34:05
*/
@WebServlet("/CoreServlet")
public class CoreServlet extends HttpServlet {
String TAG = "CoreServlet";
/*
* 第二步:驗(yàn)證服務(wù)器地址的有效性 開發(fā)者提交信息后,微信服務(wù)器將發(fā)送GET請(qǐng)求到填寫的服務(wù)器地址URL上,
* GET請(qǐng)求攜帶四個(gè)參數(shù):signature、timestamp、nonce、echostr
* 開發(fā)者通過檢驗(yàn)signature對(duì)請(qǐng)求進(jìn)行校驗(yàn)(下面有校驗(yàn)方式)。 若確認(rèn)此次GET請(qǐng)求來自微信服務(wù)器,請(qǐng)?jiān)瓨臃祷豦chostr參數(shù)內(nèi)容,
* 則接入生效, 成為開發(fā)者成功,否則接入失敗。
*
* 加密/校驗(yàn)流程如下: 1. 將token、timestamp、nonce三個(gè)參數(shù)進(jìn)行字典序排序 2.
* 將三個(gè)參數(shù)字符串拼接成一個(gè)字符串進(jìn)行sha1加密 3. 開發(fā)者獲得加密后的字符串可與signature對(duì)比,標(biāo)識(shí)該請(qǐng)求來源于微信
*/
/*
* 字典排序(lexicographical
* order)是一種對(duì)于隨機(jī)變量形成序列的排序方法。其方法是,按照字母順序,或者數(shù)字小大順序,由小到大的形成序列。
*/
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
// 設(shè)置編碼
req.setCharacterEncoding("utf-8");
resp.setContentType("html/text;charset=utf-8");
resp.setCharacterEncoding("utf-8");
// 獲取輸出流
PrintWriter printWriter = resp.getWriter();
// 設(shè)置一個(gè)全局的token,開發(fā)者自己設(shè)置。api這樣解釋:Token可由開發(fā)者可以任意填寫,
// 用作生成簽名(該Token會(huì)和接口URL中包含的Token進(jìn)行比對(duì),從而驗(yàn)證安全性)
String token = "wgyscsf";
// 根據(jù)api說明,獲取上述四個(gè)參數(shù)
String signature = req.getParameter("signature");
String timestamp = req.getParameter("timestamp");
String nonce = req.getParameter("nonce");
String echostr = req.getParameter("echostr");
// // temp:臨時(shí)打印,觀看返回參數(shù)情況
// System.out.println(TAG + ":signature:" + signature + ",timestamp:"
// + timestamp + ",nonce:" + nonce + ",echostr:" + echostr);
// 根據(jù)api所說的“加密/校驗(yàn)流程”進(jìn)行接入。共計(jì)三步
// 第一步:將token、timestamp、nonce三個(gè)參數(shù)進(jìn)行字典序排序
String[] parms = new String[] { token, timestamp, nonce };// 將需要字典序排列的字符串放到數(shù)組中
Arrays.sort(parms);// 按照api要求進(jìn)行字典序排序
// 第二步:將三個(gè)參數(shù)字符串拼接成一個(gè)字符串進(jìn)行sha1加密
// 拼接字符串
String parmsString = "";// 注意,此處不能=null。
for (int i = 0; i < parms.length; i++) {
parmsString += parms[i];
}
// sha1加密
String mParms = null;// 加密后的結(jié)果
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();
// 字節(jié)數(shù)組轉(zhuǎn)換為 十六進(jìn)制 數(shù)
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();// 加密結(jié)果
/*
* api要求: 若確認(rèn)此次GET請(qǐng)求來自微信服務(wù)器,請(qǐng)?jiān)瓨臃祷豦chostr參數(shù)內(nèi)容, 則接入生效, 成為開發(fā)者成功,否則接入失敗。
*/
// 第三步: 開發(fā)者獲得加密后的字符串可與signature對(duì)比,標(biāo)識(shí)該請(qǐng)求來源于微信接入成功。
System.out.println(TAG + ":" + mParms + "---->" + signature);
if (mParms.equals(signature)) {
// System.out.println(TAG + ":" + mParms + "---->" + signature);
printWriter.write(echostr);
} else {
// 接入失敗,不用回寫
// System.out.println(TAG + "接入失敗");
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
doGet(req, resp);
}
}
java微信開發(fā)API的第一篇內(nèi)容就為大家介紹到這里,希望大家繼續(xù)關(guān)注之后的更新內(nèi)容,謝謝!
相關(guān)文章
基于JavaMail的Java實(shí)現(xiàn)簡單郵件發(fā)送功能
這篇文章主要為大家詳細(xì)介紹了基于JavaMail的Java實(shí)現(xiàn)簡單郵件發(fā)送功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-09-09
java區(qū)分絕對(duì)路徑和相對(duì)路徑的方法
這篇文章主要介紹了java區(qū)分絕對(duì)路徑和相對(duì)路徑的方法,實(shí)例分析了java針對(duì)路徑操作的相關(guān)技巧,需要的朋友可以參考下2015-04-04
Springboot使用@Cacheable注解實(shí)現(xiàn)數(shù)據(jù)緩存
本文介紹如何在Springboot中通過@Cacheable注解實(shí)現(xiàn)數(shù)據(jù)緩存,在每次調(diào)用添加了@Cacheable注解的方法時(shí),Spring 會(huì)檢查指定參數(shù)的指定目標(biāo)方法是否已經(jīng)被調(diào)用過,文中有詳細(xì)的代碼示例,需要的朋友可以參考下2023-10-10
基于mybatis中<include>標(biāo)簽的作用說明
這篇文章主要介紹了基于mybatis中<include>標(biāo)簽的作用說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-02-02
如何解決SpringBoot啟動(dòng)時(shí)無法加載配置文件或環(huán)境變量問題
文章主要介紹了在Spring Boot項(xiàng)目中遇到配置文件加載失敗和資源目錄圖標(biāo)異常的問題,并提供了詳細(xì)的解決步驟,解決方法包括在pom.xml文件中添加特定配置,確保資源目錄順序正確,以及注意節(jié)點(diǎn)的正確使用,通過這些步驟,可以有效解決資源加載問題,提高開發(fā)效率2024-12-12
bug解決Failed_to_execute_goal_org.springframework
這篇文章主要為大家介紹了bug解決Failed_to_execute_goal_org.springframework,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-09

