Java開發微信公衆號(二)---開啓開發者模式,接入微信公衆平臺開發

接入微信公衆平臺開發,開發者須要按照以下步驟完成:

     一、填寫服務器配置html

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

     三、依據接口文檔實現業務邏輯   web

資料準備:

    一、一個能夠訪問的外網,即80的訪問端口,由於微信公衆號接口只支持80接口。(環境配置算法

    二、申請一個微信公衆號測試帳號spring

    三、編寫Java基本代碼。瀏覽器

驗證服務器地址的有效性

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

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

 

 

 

 

 

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

signature驗證結合了token,和請求中的timestamp參數,nonce參數微信開發

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

 建立公衆賬號後臺接口程序

       (1)建立一個Java Maven Web工程或者java Web工程,並新建一個可以處理請求的Controller,命名任意,我用的架構是(SSM),微信開發者接入驗證接口代碼:架構

     

package com.webchat.controller.webchat;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import com.webchat.util.weixin.WebChatUtil;

/**
 * 微信開發者接入
 * 
 * @author Administrator
 *
 */
@Controller
@RequestMapping(value="/weixin/mywebchat")
public class WebChatController {
    // 開發者接入驗證 確認請求來自微信服務器
    @RequestMapping(method = RequestMethod.GET)
    public void get(HttpServletRequest request, HttpServletResponse response) throws IOException {
        //消息來源可靠性驗證
        String signature = request.getParameter("signature");// 微信加密簽名
        String timestamp = request.getParameter("timestamp");// 時間戳
        String nonce = request.getParameter("nonce");       // 隨機數
        String echostr = request.getParameter("echostr");//成爲開發者驗證
         //確認這次GET請求來自微信服務器,原樣返回echostr參數內容,則接入生效,成爲開發者成功,不然接入失敗
        PrintWriter out = response.getWriter();
        if(WebChatUtil.checkSignature(signature, timestamp, nonce)){
            System.out.println("=======請求校驗成功======" + echostr);
            out.print(echostr);
        }
        out.close();
        out = null;
    }
    public void post(HttpServletRequest request, HttpServletResponse response) throws Exception {
        // TODO 消息的接收、處理、響應
    }
}

 能夠看到,代碼中只完成了get方法,它的做用正是確認請求是否來自於微信服務器;而post方法不是咱們此次要講的內容,而且完成接口配置也不須要管post方法,就先空在那裏。

      (2)WebChatUtil.checkSignature代碼實現

package com.webchat.util.weixin;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
/**
 * 微信公衆平臺請求算法工具類
 * @author Administrator
 *
 */
public class WebChatUtil {
    //private static String token = ConfigUtil.getProperty("wx_token");
    private static String token = "mywebchat";
    /**
     * 驗證簽名的方法
     * @param token
     * @param signature
     * @param timestamp
     * @param nonce
     * @return
     */
    public static boolean checkSignature(String signature, String timestamp, String nonce) {
        List<String> params = new ArrayList<String>();
        params.add(token);
        params.add(timestamp);
        params.add(nonce);
        // 1. 將token、timestamp、nonce三個參數進行字典序排序
        Collections.sort(params, new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                return o1.compareTo(o2);
            }
        });
        // 2.將三個參數字符串拼接成一個字符串進行sha1加密
        String temp = SHA1.encode(params.get(0) + params.get(1) + params.get(2));
        // 3. 將sha1加密後的字符串可與signature對比,標識該請求來源於微信
        return temp.equals(signature);
    }
}
View Code

      (3)SHA1 算法的實現

package com.webchat.util.weixin;

import java.security.MessageDigest;
/**
 * SHA1算法
 * @author Administrator
 *
 */
public class SHA1 {
    
    private static final char[] HEX_DIGITS = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
    
    // 把密文轉換成十六進制的字符串形式
    private static String getFormattedText(byte[] bytes) {
        int len = bytes.length;
        StringBuilder buf = new StringBuilder(len * 2);
        // 把密文轉換成十六進制的字符串形式
        for (int j = 0; j < len; j++) {
            buf.append(HEX_DIGITS[(bytes[j] >> 4) & 0x0f]);
            buf.append(HEX_DIGITS[bytes[j] & 0x0f]);
        }
        return buf.toString();
    }

    public static String encode(String str) {
        if (str == null) {
            return null;
        }
        try {
            MessageDigest messageDigest = MessageDigest.getInstance("SHA1");
            messageDigest.update(str.getBytes());
            return getFormattedText(messageDigest.digest());
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}
View Code

 開發者接入驗證 確認請求來自微信服務器的基本代碼已經完成,下面讓咱們來測試一下吧

用咱們上節講到的內容,把映射的本地地址公網域名 加上咱們的項目名和接口輸入瀏覽器

此時說明是對的,由於咱們沒有傳入任何參數,報空指針正常啦,下面講一下再微信公衆號裏面的配置

填寫服務器配置

 登陸微信公衆平臺官網後,在公衆平臺官網的開發-基本設置頁面,勾選協議成爲開發者,點擊「修改配置」按鈕,填寫服務器地址(URL)、Token和EncodingAESKey。

 

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

 

爲何要申請測試帳號?

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

接下來,把瀏覽器的訪問路徑拷貝下來,再回到微信公衆平臺的接入配置信息界面,將拷貝的訪問路徑粘貼到URL中,並將WebChatUtil類中指定的token值mywebchat填入到Token中,填寫後的結果以下圖所示:

點擊提交出現;則說明配置成功了

   

          到此,咱們就完成了與微信服務器的校驗。

         接下來將會依據接口文檔實現業務邏輯

           若是在操做過程當中有問題,歡迎隨時討論^.^

 

 

 

 

其餘文章關聯

(一)Java開發微信公衆號(一)---初識微信公衆號以及環境搭建

(二)Java開發微信公衆號(二)---開啓開發者模式,接入微信公衆平臺開發

(三)Java開發微信公衆號(三)---微信服務器請求消息,響應消息,事件消息以及工具處理類的封裝

(四)Java開發微信公衆號(四)---微信服務器post消息體的接收及消息的處理

相關文章
相關標籤/搜索