微信公眾號開發教程(一) 驗證接入

wolfcode_cn發表於2018-06-22

作者:陳惠,叩丁狼教育高階講師。原創文章,轉載請註明出處。

微信公眾號開發教程(一)驗證接入

本篇文章主要介紹了微信公眾號開發接入詳細流程,希望對剛接觸公眾號開發的同學有所幫助,有興趣的同學可多多關注叩丁狼公眾號,後續會更新不同的公眾號小案例。

公眾號的分類

我們平常在微信應用上會看到有很多的公眾號,但是各自並不一樣,公眾號也分很多種型別,不過最常見的就是服務號和訂閱號了。下面我們來看一下他們的區別:

1、訂閱號
為媒體和個人提供一種資訊傳播方式,主要偏於為使用者傳達資訊(類似報紙雜誌),主要的定位是閱讀,每天可以群發1條訊息;

2、服務號
為企業,政府或組織提供對使用者進行服務,主要偏於服務互動(類似銀行提供服務查詢),每個月只可群發4條訊息;

3、企業微信(企業號)
為企業,政府,事業單位,實現生產管理和協作運營的移動化,主要用於公司內部通訊使用,旨在為使用者提供移動辦公,需要先有成員的通訊資訊驗證才可以關注成功企業微信;

通過以下圖片我們可以更清晰的看出不同公眾號的區別:

分類.jpg

區別.jpg

還有一個比較明顯的區別就是,訂閱號都是存放在一個名叫訂閱號的資料夾中,點開才能看到所有關注過的訂閱號,但是服務號卻和好友一樣直接就顯示在聊天列表中。這個大家開啟微信客戶端便能看到。

如果大家有需要申請公眾號的,要根據實際需求考慮清楚應該申請哪一種公眾號
以下是官方給出的建議,大家可以多參考參考

1)如果想簡單的傳送訊息,達到宣傳效果,建議可選擇訂閱號;
2)如果想用公眾號獲得更多的功能,例如開通微信支付,建議可以選擇服務號;
3)如果想用來管理內部企業員工、團隊,對內使用,可申請企業號;
4)訂閱號可通過微信認證資質稽核通過後有一次升級為服務號的入口,升級成功後型別不可再變;
5)服務號不可變更成訂閱號。

4.測試號(用於開發測試及功能體驗)
這種是平常普通使用者是涉及不到的,是專門為開發人員準備的一種僅用於測試的公眾號。

由於使用者體驗和安全性方面的考慮,微信公眾號的註冊有一定門檻,某些高階介面的許可權需要微信認證後才可以獲取。所以,為了幫助開發者快速瞭解和上手微信公眾號開發,熟悉各個介面的呼叫,微信推出了公眾帳號測試號,無需公眾帳號、快速申請介面測試號,通過手機微信掃描二維碼即可獲得,利用測試號我們可以體驗和測試更多高階功能。

申請地址:
http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login

但測試號也不是萬能的,部分高階功能,如微信支付,卡券功能等也是不開放的。
如果要實現支付功能還是得去註冊個正式的公眾號。

微信公眾平臺:

我們註冊的公眾號都可以在這個平臺上進行管理,比如想弄一些自定義選單,或者自動回覆,或者平常推送的文章,都可以在這上面操作。

平臺地址:
http://mp.weixin.qq.com

平臺中分為兩種管理模式:

平臺提供了兩種管理模式給我們,應該根據我們的需求來選擇使用不同的模式。

下面我們來了解一下,兩種模式的區別:

編輯模式

主要針對非程式設計人員及資訊釋出類公眾帳號使用。
開啟該模式後,可以方便地通過介面配置“自定義選單”和“自動回覆的訊息”。
好處是視覺化介面配置,操作簡單,快捷,但是功能有限。

開發模式

主要針對具備開發能力的人使用。
開啟該模式後,能夠使用微信公眾平臺開放的介面,但是編輯模式的設定會失效,比如“自定義選單”和“自動回覆的訊息”功能。通過程式設計方式可以實現更多複雜的功能,提供個性化服務。

總的來說,編輯模式就是為所有人提供的,如果你的需求僅僅只是最常見的選單,自動回覆等,使用編輯模式已經滿足,但是如果你需求的功能比較複雜,有很多很多的想法,就需要使用到開發模式。

下面我們來學習一下,怎麼使用這個開發模式。

開發模式配置流程

1.登入測試號頁面,可以看到該測試號相關的資訊

就是使用電腦開啟http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login
使用微信掃一掃二維碼,即可在開啟的頁面中看見微信給你分配的測試號的相關資訊。

下面兩個屬性是唯一的標識,每個測試號都會有自己的appid與appsecret ,是比較重要的資訊,不要隨意發給別人。

appid:是公眾號開發識別碼,配合開發者密碼可呼叫公眾號的介面能力。
appsecret:是校驗公眾號開發者身份的密碼,具有極高的安全性。

測試號資訊.png

如果是正式的公眾號,登入公眾平臺官網之後,找到“基本配置”選單欄也可以獲取上公眾號相關的資訊。

2.配置引數介紹

再往下看,我們會看到URL和Token這兩個屬性,和上面appid/appsecret不同的是,上面的是微信分配給我們的,但是下面這兩個是需要我們填進去的。

我們先來了解一下,這兩個屬性有什麼作用。

URL:就是指我們自己的伺服器地址
該URL是開發者用來接收和響應微信訊息和事件的介面URL
(必須以http://或https://開頭,分別支援80埠和443埠)

Token:可任意填寫,用作生成簽名(必須為英文或數字,長度為3-32字元)
該簽名在後邊會用到,這裡暫時隨便填個內容也可以

介面資訊配置.png

接下來我們需要了解的是微信與我們的伺服器互動的過程:

當我們在微信app上,給公眾號傳送一條內容的時候,實際會傳送到微信的伺服器上,此時微信的伺服器就會對內容進行封裝成某種格式的資料比如xml格式,再轉發到我們配置好的URL上,所以該URL實際就是我們處理資料的一個請求路徑。所以該URL必須是能暴露給外界訪問的一個公網地址,不能使用內網地址,生產環境可以申請騰訊雲,阿里雲伺服器等,但是在開發環境中可以暫時利用一些軟體來完成內網穿透,便於修改和測試,如NATAPP,花生殼等軟體,使用起來也很方便,在本地安裝對應的軟體,配置執行後,直接使用軟體分配的臨時域名來訪問本地應用即可,只是偶爾會存在網路不穩定的情況。這裡不詳細介紹如何使用了,具體教程可參考軟體官網。

互動流程.png

在開發的過程中,我們會經常使用到微信公眾號提供給開發者的開發文件
具體地址:https://mp.weixin.qq.com/wiki
大家開啟後可以選擇”接入指南”,參考微信提供的一些幫助資訊。

3.搭建本地應用(java/python/php等語言均可)

基本概念都瞭解過後,我們馬上就要開始開發了,因此需要先提供好一個應用,接下來就可以在該應用上新增公眾號相關的功能了。

本文專案使用java語言,SpringMVC+Spring+MyBatis框架

4.URL接入驗證

我們需要先來了解一下接入的過程是怎麼樣的。下圖是微信官方對接入過程的介紹。

圖片.png

由以上介紹可知,當我們填入url與token的值,並提交後,微信會傳送一個get請求到我們填寫的url上,並且攜帶4個引數,而signature引數結合了開發者填寫的token引數和請求中的timestamp引數、nonce引數來做的加密簽名,我們在後臺需要對該簽名進行校驗,看是否合法。實際上,我們發現微信帶過來的4個引數中並沒有帶token引數,僅有signature是和token有關的,所以我們應該在本地應用中也準備一個和填入的token相同的引數,再通過微信傳入的timestamp與nonce做相同演算法的加密操作,若結果與微信傳入的signature相同,即為合法,則原樣返回echostr引數,代表接入成功,否則不做處理,則接入失敗。

詳細流程可參考微信官方提供的邏輯流程圖,我們的應用需要以該流程圖的步驟來實現。

圖片.png

程式碼示例:

@Controller
public class WeChatController {
        /**
         * 微信URL接入驗證
         * @param signature
         * @param timestamp
         * @param nonce
         * @param echostr
         * @return
         */
        @RequestMapping(value="/weChat",method= RequestMethod.GET)
        @ResponseBody
        public String validate(String signature,String timestamp,String nonce,String echostr){
            //1. 將token、timestamp、nonce三個引數進行字典序排序
            String[] arr = {timestamp,nonce,WeChatUtil.TOKEN};
            Arrays.sort(arr);
            //2. 將三個引數字串拼接成一個字串進行sha1加密
            StringBuilder sb = new StringBuilder();
            for (String temp : arr) {
               sb.append(temp);
            }
            //3. 開發者獲得加密後的字串可與signature對比,標識該請求來源於微信
            if(SecurityUtil.SHA1(sb.toString()).equals(signature)){
                //接入成功
                return echostr;
            }
            //接入失敗
            return null;
        }
}

備註:

  1. 程式碼中WeChatUtil.TOKEN是一個常量,常量值必須要和我們在頁面上填入的token值相同,通常可以抽取到配置檔案中來注入值比較靈活。
    2.SecurityUtil是一個工具類,提供了sha1加密的方法。

接入成功後即可根據開發文件實現一些小案例了。文章暫時使用的是測試號來做開發,後續有些高階功能許可權不夠可能會改成正式公眾號來進行開發。


相關文章