第二篇 :微信公衆平臺開發實戰Java版之開啓開發者模式,接入微信公衆平臺開發

 

第一部分:微信公衆號對接的基本介紹

 

1、填寫服務器配置信息的介紹

 

登陸微信公衆平臺官網後,進入到公衆平臺後臺管理頁面。php

選擇 公衆號基本設置-》基本配置 ,點擊「修改配置」按鈕,填寫服務器地址(URL)、Token和EncodingAESKey。html

 

微信公衆號配置界面:java

 

 以上配置須要認證後纔會獲得相應的權限。若是開發階段,咱們能夠申請開發者測試帳號。git

 

爲何要申請測試帳號?web

主要是由於測試帳號比咱們沒有認證的微信帳號權限大一點。足夠測試咱們的接口了。數組

 

 如下是微信測試號的一些配置選項:緩存

 

服務器配置:tomcat

  URL:是開發者用來接收微信消息和事件 的接口URL。(必須以http://開頭,目前支持80端口)安全

  Token:可由開發者能夠任意填寫,用做生成簽名(該Token會和接口URL中包含的Token進行比對,從而驗證安全性)。注意必須爲英文或數字,長度爲3-32字符。服務器

  EncodingAESKey:由開發者手動填寫或隨機生成,將用做消息體加解密密鑰。(消息加密密鑰由43位字符組成,可隨機修改,字符範圍爲A-Z,a-z,0-9。)

同時,開發者可選擇消息加解密方式:明文模式、兼容模式和安全模式。

  明文模式:不使用消息體加解密功能,安全係數較低

      兼容模式:明文、密文將共存,方便開發者調試和維護

      安全模式下:消息包爲純密文,須要開發者加密和解密,安全係數高

 

 

作個宣傳:這個是個人微信公衆號,歡迎你們關注!!!

 

 

 

看完上面的,仍是不知道該填些什麼吧,不用急,先空着,後面再填。

 

2、驗證服務器地址的有效性

開發者提交信息後,微信服務器將發送GET請求到填寫的服務器地址URL上,GET請求攜帶四個參數:

參數 描述
signature 微信加密簽名,signature結合了開發者填寫的token參數和請求中的timestamp參數、nonce參數。
timestamp 時間戳
nonce 隨機數
echostr 隨機字符串

 

開發者經過檢驗signature對請求進行校驗(下面有校驗方式)。若確認這次GET請求來自微信服務器,請原樣返回echostr參數內容,則接入生效,成爲開發者成功,不然接入失敗。

加密/校驗流程以下:
1. 將token、timestamp、nonce三個參數進行字典序排序
2. 將三個參數字符串拼接成一個字符串進行sha1加密
3. 開發者得到加密後的字符串可與signature對比,標識該請求來源於微信

 

說明一下,我使用的是eclipse ,java語言, tomcat 7.0 環境。

這些配置能夠參照個人其餘博客文章進行配置,這裏就很少說了。

以上介紹也能夠參考  微信開發文檔

 

 

第二部分:微信服務器對接的實現代碼部分

 

 那麼咱們如今開始擼碼吧!!!

 

方式一:經過本地進行調試。

 

詳細能夠參考個人文章:第3章 如何接入微信公衆平臺開發

 

 

方式二: 代碼須要放到第三方服務器上面進行調試。

 

1、 建立java項目,並實現校驗。

 

下面咱們寫程序進行校驗:

(1)新建一個名字叫 souvc 的 web項目。

 

(2) 選擇web.xml文件的生成。

 

(3)新建一個servlet類,來接收微信服務器傳來信息。

 

package com.souvc.weixin.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 com.souvc.weixin.util.SignUtil;

/**
 * 類名: CoreServlet </br> 
 * 描述: 來接收微信服務器傳來信息 </br> 
 * 開發人員: souvc</br> 
 * 建立時間:2015-9-29 </br> 
 * 發佈版本:V1.0 </br>
 */
public class CoreServlet extends HttpServlet {

    private static final long serialVersionUID = 4323197796926899691L;

    /**
     * 確認請求來自微信服務器
     */
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        
        // 微信加密簽名
        String signature = request.getParameter("signature");
        // 時間戳
        String timestamp = request.getParameter("timestamp");
        // 隨機數
        String nonce = request.getParameter("nonce");
        // 隨機字符串
        String echostr = request.getParameter("echostr");

        PrintWriter out = response.getWriter();
        
        // 經過檢驗signature對請求進行校驗,若校驗成功則原樣返回echostr,表示接入成功,不然接入失敗
        if (SignUtil.checkSignature(signature, timestamp, nonce)) {
            out.print(echostr);
        }
        
        out.close();
        out = null;
    }

    /**
     * 處理微信服務器發來的消息
     */
    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        // TODO 消息的接收、處理、響應
    }

}
View Code

 

 

(4) 加密校驗程序的工具類。這個校驗的方法,能夠經過分析官方文檔的demo,而後經過java語言來寫出。

官方php校驗代碼一覽 。

 

package com.souvc.weixin.util;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;

/**
* 類名: SignUtil </br>
* 描述: 檢驗signature 工具類 </br>
* 開發人員: souvc </br>
* 建立時間:  2015-9-29 </br>
* 發佈版本:V1.0  </br>
 */
public class SignUtil {
    
    // 與接口配置信息中的Token要一致
    private static String token = "souvcweixin";

    /**
    * 方法名:checkSignature</br>
    * 詳述:驗證簽名</br>
    * 開發人員:souvc</br>
    * 建立時間:2015-9-29  </br>
    * @param signature
    * @param timestamp
    * @param nonce
    * @return
    * @throws
     */
    public static boolean checkSignature(String signature, String timestamp,String nonce) {
        // 1.將token、timestamp、nonce三個參數進行字典序排序
        String[] arr = new String[] { token, timestamp, nonce };
        Arrays.sort(arr);
        
        // 2. 將三個參數字符串拼接成一個字符串進行sha1加密
        StringBuilder content = new StringBuilder();
        for (int i = 0; i < arr.length; i++) {
            content.append(arr[i]);
        }
        MessageDigest md = null;
        String tmpStr = null;
        try {
            md = MessageDigest.getInstance("SHA-1");
            // 將三個參數字符串拼接成一個字符串進行sha1加密
            byte[] digest = md.digest(content.toString().getBytes());
            tmpStr = byteToStr(digest);
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
        
        content = null;
        // 3.將sha1加密後的字符串可與signature對比,標識該請求來源於微信
        return tmpStr != null ? tmpStr.equals(signature.toUpperCase()) : false;
    }

    /**
    * 方法名:byteToStr</br>
    * 詳述:將字節數組轉換爲十六進制字符串</br>
    * 開發人員:souvc </br>
    * 建立時間:2015-9-29  </br>
    * @param byteArray
    * @return
    * @throws
     */
    private static String byteToStr(byte[] byteArray) {
        String strDigest = "";
        for (int i = 0; i < byteArray.length; i++) {
            strDigest += byteToHexStr(byteArray[i]);
        }
        return strDigest;
    }

    /**
    * 方法名:byteToHexStr</br>
    * 詳述:將字節轉換爲十六進制字符串</br>
    * 開發人員:souvc</br>
    * 建立時間:2015-9-29  </br>
    * @param mByte
    * @return
    * @throws
     */
    private static String byteToHexStr(byte mByte) {
        char[] Digit = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A','B', 'C', 'D', 'E', 'F' };
        char[] tempArr = new char[2];
        tempArr[0] = Digit[(mByte >>> 4) & 0X0F];
        tempArr[1] = Digit[mByte & 0X0F];
        String s = new String(tempArr);
        return s;
    }
}
View Code

 

 

(5)配置一下訪問路徑的 web.xml。

 

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
  <display-name>souvc</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  
  <servlet>
        <servlet-name>coreServlet</servlet-name>
        <servlet-class>
            com.souvc.weixin.servlet.CoreServlet
        </servlet-class>
    </servlet>
  
    <!-- url-pattern中配置的/coreServlet用於指定該Servlet的訪問路徑 -->
    <servlet-mapping>
        <servlet-name>coreServlet</servlet-name>
        <url-pattern>/coreServlet</url-pattern>
    </servlet-mapping>
    
    
</web-app>
View Code

 

 

在webroot下面, 添加一個主頁index.jsp,代碼以下

 

<%@ page language="java" contentType="text/html; charset=utf-8"  pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>歡迎訪問個人網站 www.souvc.com </title>
</head>
<body>
        歡迎訪問個人網站 www.souvc.com 
</body>
</html>
View Code

 

校驗實現代碼,基本完成。

 

 

二 、把實現部署到服務器上。

 

方式一:部署到BAE上面。

 

(1)把程序從BAE上面導出來。

 

複製svn地址

 

 

在本地新建一個weixin的文件夾,而後從服務器上checkout代碼:

 

 

 以下圖,說明成功導出代碼。

 

 

(2)把咱們寫的程序從eclipse裏面導出來,並打包成war包。

 

 

 

 

 

(3)把程序提交到BAE服務器上面。

 

 

 

 

 

 

 

預覽併發布

 

 

 

訪問如下咱們的連接: http://chiyan.duapp.com/

 

 

 

方式二:把校驗實現代碼部署到SAE上。

 

(1) 進入到sae控制檯。

 

 

(2 )而後選擇上傳代碼包。

 

經過eclipse打包成war包,而後傳到sae上。

 

(3)生成本身專屬的域名。

 第三部分: 配置微信服務器。

 

 1、 進入到公衆號測試帳號設置頁面

 

 

2、填寫配置

  

配置以後,會提示配置成功。

 

 

 

第四部分:依據接口文檔實現業務邏輯

 

 1、驗證以後須要作的一些邏輯處理。

/**
     * 處理微信服務器發來的消息
     */
    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        // TODO 消息的接收、處理、響應
    }

 

這個後面再寫業務,到此,咱們就完成了與微信服務器的校驗。

 

 2、配置舒適提醒:

有朋友直接輸入該請求:http://chiyan.duapp.com/coreServlet

是會報500空指針的錯誤,由於咱們這樣訪問並無咱們程序中要傳的參數傳過去。

 

 

其餘文章關聯:

第一篇:微信公衆平臺開發實戰Java版之瞭解微信公衆平臺基礎知識以及資料準備

第二篇 :微信公衆平臺開發實戰Java版之開啓開發者模式,接入微信公衆平臺開發

第三篇 :微信公衆平臺開發實戰Java版之請求消息,響應消息以及事件消息類的封裝

第四篇 :微信公衆平臺開發實戰Java版之完成消息接受與相應以及消息的處理

第五篇 :微信公衆平臺開發實戰Java版之如何獲取公衆號的access_token以及緩存access_token

第六篇 :微信公衆平臺開發實戰Java版之如何自定義微信公衆號菜單

第七篇 :微信公衆平臺開發實戰Java版之如何獲取微信用戶基本信息

第八篇 :微信公衆平臺開發實戰Java版之如何網頁受權獲取用戶基本信息

第九篇 :微信公衆平臺開發實戰Java版之如何實現自定義分享內容

其餘:Web開發須知:URL編碼與解碼

相關文章
相關標籤/搜索