java微信開(kāi)發(fā)API第一步 服務(wù)器接入
微信開(kāi)發(fā)API如何接入服務(wù)器,下面就為大家進(jìn)行介紹
一、說(shuō)明
* 本示例根據(jù)微信開(kāi)發(fā)文檔:http://mp.weixin.qq.com/wiki/home/index.html最新版(4/3/2016 5:34:36 PM )進(jìn)行開(kāi)發(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解析。
* 為了便于測(cè)試說(shuō)明,每個(gè)測(cè)試用例為獨(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)開(kāi)發(fā),開(kāi)發(fā)者需要按照如下步驟完成:
1、填寫(xiě)服務(wù)器配置
2、驗(yàn)證服務(wù)器地址的有效性
3、依據(jù)接口文檔實(shí)現(xiàn)業(yè)務(wù)邏輯
三、文檔理解
驗(yàn)證服務(wù)器地址的有效性
1、api這樣介紹:
開(kāi)發(fā)者提交信息后,微信服務(wù)器將發(fā)送GET請(qǐng)求到填寫(xiě)的服務(wù)器地址URL上,GET請(qǐng)求攜帶四個(gè)參數(shù):signature、timestamp、nonce、echostr
開(kāi)發(fā)者通過(guò)檢驗(yàn)signature對(duì)請(qǐng)求進(jìn)行校驗(yàn)(下面有校驗(yàn)方式)。
若確認(rèn)此次GET請(qǐng)求來(lái)自微信服務(wù)器,請(qǐng)?jiān)瓨臃祷豦chostr參數(shù)內(nèi)容,則接入生效,成為開(kāi)發(fā)者成功,否則接入失敗。
加密/校驗(yàn)流程如下:
1)、將token、timestamp、nonce三個(gè)參數(shù)進(jìn)行字典序排序
2)、將三個(gè)參數(shù)字符串拼接成一個(gè)字符串進(jìn)行sha1加密
3)、開(kāi)發(fā)者獲得加密后的字符串可與signature對(duì)比,標(biāo)識(shí)該請(qǐng)求來(lái)源于微信
2、理解
說(shuō)明該請(qǐng)求是“GET”方式,并且訪問(wèn)該請(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,開(kāi)發(fā)者自己設(shè)置。api這樣解釋:Token可由開(kāi)發(fā)者可以任意填寫(xiě), // 用作生成簽名(該Token會(huì)和接口URL中包含的Token進(jìn)行比對(duì),從而驗(yàn)證安全性) String token = "wgyscsf"; // 根據(jù)api說(shuō)明,獲取上述四個(gè)參數(shù) String signature = req.getParameter("signature"); String timestamp = req.getParameter("timestamp"); String nonce = req.getParameter("nonce"); String echostr = req.getParameter("echostr");
根據(jù)api所說(shuō)的三步驟進(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)求來(lái)自微信服務(wù)器,請(qǐng)?jiān)瓨臃祷豦chostr參數(shù)內(nèi)容, 則接入生效, 成為開(kāi)發(fā)者成功,否則接入失敗。 */ // 第三步: 開(kāi)發(fā)者獲得加密后的字符串可與signature對(duì)比,標(biāo)識(shí)該請(qǐng)求來(lái)源于微信接入成功。 System.out.println(TAG + ":" + mParms + "---->" + signature); if (mParms.equals(signature)) { // System.out.println(TAG + ":" + mParms + "---->" + signature); printWriter.write(echostr); } else { // 接入失敗,不用回寫(xiě) // System.out.println(TAG + "接入失敗"); }
4、填寫(xiě)服務(wù)器配置
1)、包括內(nèi)容
服務(wù)器配置主要是當(dāng)我們寫(xiě)好自己的接入微信開(kāi)發(fā)平臺(tái)的代碼之后要配置的服務(wù)器和微信接入接口。
2)、服務(wù)器操作
打開(kāi)服務(wù)器的tomcat,將寫(xiě)好的代碼放到webapps文件下。
3)、微信公眾平臺(tái)操作
*申請(qǐng)微信測(cè)試賬號(hào)(直接用微信掃一掃即可以登錄):http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login
*打開(kāi)微信公眾平臺(tái)測(cè)試號(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> * 編寫(xiě)時(shí)期 2016-4-3 下午4:34:05 */ @WebServlet("/CoreServlet") public class CoreServlet extends HttpServlet { String TAG = "CoreServlet"; /* * 第二步:驗(yàn)證服務(wù)器地址的有效性 開(kāi)發(fā)者提交信息后,微信服務(wù)器將發(fā)送GET請(qǐng)求到填寫(xiě)的服務(wù)器地址URL上, * GET請(qǐng)求攜帶四個(gè)參數(shù):signature、timestamp、nonce、echostr * 開(kāi)發(fā)者通過(guò)檢驗(yàn)signature對(duì)請(qǐng)求進(jìn)行校驗(yàn)(下面有校驗(yàn)方式)。 若確認(rèn)此次GET請(qǐng)求來(lái)自微信服務(wù)器,請(qǐng)?jiān)瓨臃祷豦chostr參數(shù)內(nèi)容, * 則接入生效, 成為開(kāi)發(fā)者成功,否則接入失敗。 * * 加密/校驗(yàn)流程如下: 1. 將token、timestamp、nonce三個(gè)參數(shù)進(jìn)行字典序排序 2. * 將三個(gè)參數(shù)字符串拼接成一個(gè)字符串進(jìn)行sha1加密 3. 開(kāi)發(fā)者獲得加密后的字符串可與signature對(duì)比,標(biāo)識(shí)該請(qǐng)求來(lái)源于微信 */ /* * 字典排序(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,開(kāi)發(fā)者自己設(shè)置。api這樣解釋:Token可由開(kāi)發(fā)者可以任意填寫(xiě), // 用作生成簽名(該Token會(huì)和接口URL中包含的Token進(jìn)行比對(duì),從而驗(yàn)證安全性) String token = "wgyscsf"; // 根據(jù)api說(shuō)明,獲取上述四個(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所說(shuō)的“加密/校驗(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)求來(lái)自微信服務(wù)器,請(qǐng)?jiān)瓨臃祷豦chostr參數(shù)內(nèi)容, 則接入生效, 成為開(kāi)發(fā)者成功,否則接入失敗。 */ // 第三步: 開(kāi)發(fā)者獲得加密后的字符串可與signature對(duì)比,標(biāo)識(shí)該請(qǐng)求來(lái)源于微信接入成功。 System.out.println(TAG + ":" + mParms + "---->" + signature); if (mParms.equals(signature)) { // System.out.println(TAG + ":" + mParms + "---->" + signature); printWriter.write(echostr); } else { // 接入失敗,不用回寫(xiě) // System.out.println(TAG + "接入失敗"); } } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } }
java微信開(kāi)發(fā)API的第一篇內(nèi)容就為大家介紹到這里,希望大家繼續(xù)關(guān)注之后的更新內(nèi)容,謝謝!
相關(guān)文章
springmvc利用jquery.form插件異步上傳文件示例
本篇文章主要介紹了springmvc利用jquery.form插件異步上傳文件示例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2017-01-01Java多線程之JUC(java.util.concurrent)的常見(jiàn)類(多線程編程常用類)
這篇文章主要給大家介紹了關(guān)于Java多線程之JUC(java.util.concurrent)的常見(jiàn)類(多線程編程常用類)的相關(guān)資料,Java中的JUC(java.util.concurrent)包提供了一些并發(fā)編程中常用的類,這些類可以幫助我們更方便地實(shí)現(xiàn)多線程編程,需要的朋友可以參考下2024-02-02SpringSecurity實(shí)現(xiàn)訪問(wèn)控制url匹配
本文主要介紹了SpringSecurity實(shí)現(xiàn)訪問(wèn)控制url匹配,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08如何修改覆蓋spring boot默認(rèn)日志策略logback詳解
這篇文章主要給大家介紹了關(guān)于如何修改覆蓋spring boot默認(rèn)日志策略logback的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-10-10springboot集成Swagger的方法(讓你擁有屬于自己的api管理器)
在大型的項(xiàng)目中,如果你有非常多的接口需要統(tǒng)一管理,或者需要進(jìn)行接口測(cè)試,那么我們通常會(huì)在繁雜地api中找到需要進(jìn)行測(cè)試或者管理的接口,接下來(lái)通過(guò)本文給大家介紹springboot集成Swagger的方法讓你擁有屬于自己的api管理器,感興趣的朋友一起看看吧2021-11-11java內(nèi)部類之成員內(nèi)部類、局部?jī)?nèi)部類和匿名內(nèi)部類用法及說(shuō)明
這篇文章主要介紹了java內(nèi)部類之成員內(nèi)部類、局部?jī)?nèi)部類和匿名內(nèi)部類的用法及說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-12-12java實(shí)現(xiàn)簡(jiǎn)易撲克牌游戲
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)簡(jiǎn)易撲克牌游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-04-04SpringBoot的HTTPS配置實(shí)現(xiàn)
本文主要介紹了SpringBoot的HTTPS配置實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-04-04