第二篇 :微信公眾平台開發實戰Java版之開啟開發者模式,接入微信公眾平台開發


 

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

 

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

 

登錄微信公眾平台官網后,進入到公眾平台后台管理頁面。

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

 

微信公眾號配置界面:

 

 以上配置需要認證后才會得到相應的權限。如果開發階段,我們可以申請開發者測試賬號。

 

為什么要申請測試賬號?

主要是因為測試賬號比我們沒有認證的微信賬號權限大一點。足夠測試我們的接口了。

 

 以下是微信測試號的一些配置選項:

 

服務器配置:

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

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

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

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

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

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

      安全模式下:消息包為純密文,需要開發者加密和解密,安全系數高

 

 

做個宣傳:這個是我的微信公眾號,歡迎大家關注!!!

 

 

 

看完上面的,還是不知道該填些什么吧,不用急,先空着,后面再填。

 

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

開發者提交信息后,微信服務器將發送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章 如何接入微信公眾平台開發

 

 

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

 

一、 創建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)生成自己專屬的域名。

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

 

 一、 進入到公眾號測試賬號設置頁面

 

 

二、填寫配置

  

配置之后,會提示配置成功。

 

 

 

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

 

 一、驗證之后需要做的一些邏輯處理。

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

 

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

 

 二、配置溫馨提醒:

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

是會報500空指針的錯誤,因為我們這樣訪問並沒有我們程序中要傳的參數傳過去。

 

 

其他文章關聯:

第一篇:微信公眾平台開發實戰Java版之了解微信公眾平台基礎知識以及資料准備

第二篇 :微信公眾平台開發實戰Java版之開啟開發者模式,接入微信公眾平台開發

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

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

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

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

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

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

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

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM