微信公衆號開發(二)

咳咳,間隔了這麼久,如今終於有時間繼續了。廢話很少說,接上篇微信公衆號開發引言。java

說明:博主使用的開發工具爲IntelliJ IDEA,開發語言爲JAVA。

環境搭建部分就不在這裏多說什麼了。使用IDEA建立一個SpringBoot項目,以後咱們就進入開發階段吧~

1.修改公衆號的服務器配置
填寫公衆號服務器配置
URL處填寫能從公網訪問到你本機的一個地址,博主在這裏選用的是花生殼內網穿透版,可是因爲最近實名認證,博主尚未來得及認證[由於博主的花生殼是14年就購置的,很久不用了。在最近才知道要認證]。具體使用方式,博主過些日子認證一下在介紹吧。反正很容易的~web

Token處填寫的是自定義字符串,不過要注意!!!此處填寫的Token必定要和程序中所設置的同樣!此處博主寫的是「DeveloperHome」。

而後不要點提交~由於此時提交是確定會說Token驗證失敗的~~接下來請看:

2.驗證消息來自微信服務器spring

首先,從官網的文檔中能夠看到,驗證大約分爲三個步驟。服務器

  • 將token,timestamp,nonce三個參數進行字典排序。
  • 將三個參數字符串拼接成一個字符串進行SHA-1加密。
  • 使用加密後提到的字符串與參數中的signature進行對比。
  • 若能確認此GET請求來自微信服務器,則原樣返回echor參數內容。
    驗證消息來自微信服務器
    步驟知道了,如今就開始擼代碼吧。微信

    在項目中添加一個類ValidateWeChatapp

ValidateWeChat.java代碼工具

package org.yyx.study.wechat.util;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import org.yyx.study.config.WeChatConfig;

import javax.annotation.Resource;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;

/**
 * 驗證工具類
 * Created by 葉雲軒 on 2017/6/20-11:50
 * Concat ycountjavaxuan@outlook.com
 */
@Component
public class ValidateWeChat {

    private Logger logger = LoggerFactory.getLogger(ValidateWeChat.class);
    /**
     * 1)將token、timestamp、nonce三個參數進行字典序排序
     * 2)將三個參數字符串拼接成一個字符串進行sha1加密
     * 3)開發者得到加密後的字符串可與signature對比,標識該請求來源於微信
     */
    @Resource
    private WeChatConfig weChatConfig;

    /**
     * 對參數進行排序與加密
     *
     * @param timestamp 時間戳
     * @param nonce     隨機字符串
     */
    private String sortParams(String timestamp, String nonce) {
        logger.info("排序....");
        String[] array = new String[]{weChatConfig.getDeafultAccessToken(), timestamp, nonce};
        StringBuffer sb = new StringBuffer();
        // 字符串排序
        Arrays.sort(array);
        for (int i = 0, length = array.length; i < length; i++) {
            sb.append(array[i]);
        }
        String sortString = sb.toString();
        try {
            MessageDigest md = MessageDigest.getInstance("SHA-1");
            md.update(sortString.getBytes());
            byte[] digest = md.digest();
            StringBuffer hexstr = new StringBuffer();
            String shaHex;
            for (int i = 0; i < digest.length; i++) {
                shaHex = Integer.toHexString(digest[i] & 0xFF);
                if (shaHex.length() < 2) {
                    hexstr.append(0);
                }
                hexstr.append(shaHex);
            }
            logger.info("排序完成...");
            return hexstr.toString();
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
        return null;
    }

    public boolean validate(String signature, String timestamp, String nonce) {
        String s = sortParams(timestamp, nonce);
        return signature.equals(s);
    }

}

以後呢,在controller包中建立一個類,用於驗證消息.
AccessEntrance.java代碼開發工具

package org.yyx.study.wechat.controller;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.yyx.study.wechat.util.ValidateWeChat;

import javax.annotation.Resource;

/**
 * 接入微信服務器入口
 * Created by 葉雲軒 on 2017/6/20-10:59
 * Concat ycountjavaxuan@outlook.com
 */
@RestController
public class AccessEntrance {

    private Logger logger = LoggerFactory.getLogger(AccessEntrance.class);

    /**
     * 驗證工具類
     */
    @Resource
    private ValidateWeChat validateWeChat;

    /**
     * 驗證消息來自微信服務器方法
     *
     * @param signature 微信加密簽名
     * @param timestamp 時間戳
     * @param nonce     隨機數
     * @param echostr   隨機字符串
     * @return 驗證結果
     */
    @GetMapping("/")
    public String accessGet(@RequestParam String signature, @RequestParam String timestamp,
                            @RequestParam String nonce, @RequestParam String echostr) {
        logger.info("method invoke...");
        logger.info("參數[signature]={},[timestamp]={},[nonce]={},[echostr]={}", signature, timestamp, nonce, echostr);
        boolean validate = validateWeChat.validate(signature, timestamp, nonce);
        if (validate) {
            logger.info("驗證成功...");
            return echostr;
        }
        logger.info("驗證失敗...");
        return "wrong";
    }
}

在AccessEntrance類中,有一個accessGet方法用於接收從微信服務器轉發的GET請求,其中有四個必填參數,符合微信公衆號開發文檔的要求。如今啓動咱們的項目。

此時,咱們回到微信公衆號的服務器配置界面,點擊提交按鈕,則會在頁面上方彈出提交成功的字樣,以下圖:

提交服務器配置
而咱們的開發服務器則會輸出以下圖所示的日誌信息:
IDE輸出日誌信息
至此,微信公衆號接入三方服務器成功。加密

項目包結構見下圖:

項目目錄結構

相關文章
相關標籤/搜索