[TOC]
微信后臺服務器開發(fā)
就要下班了,兵長打開手機呐籽,看到彈出的某微信聊天機器人廣告便點了進去,于是有了如下故事...
最近兵長在看微信的時候突發(fā)奇想的去玩了一下某微信機器人,能夠像智能語音助手一下和自己聊天
兵長就在想权她,這機器人是咋做的镀梭,咱們是做服務器開發(fā)的刀森,咱用go語言快速實現(xiàn)一下給自己玩玩,實現(xiàn)一個定制化的聊天機器人可好
胖sir聽到兵長自言自語的不明所以报账,便走上前說研底,咋開始玩起聊天了,不來峽谷游了嗎透罢?
上次帶你本來是想帶你成為winer的榜晦,沒想到,每一把都是loser羽圃,我打算最近收收手乾胶,控制一下情緒,找機器人撫慰一下我手上的心靈
你是說微信聊天機器人嗎朽寞?哪些不都是千篇一律的嘛
那么你能弄個定制化的嘛胚吁?把我情緒弄好了,我?guī)銇泶髞y斗吧
~~(偷笑)愁憔,小伙子腕扶,還好我留了一手,我先給你說說微信后臺服務器如何初步開發(fā)一個簡單的你問我答功能吧吨掌,授人以漁半抱,不如授人以魚
是不
開發(fā)一個微信后臺服務器作為被動回復機器人
,大致分為如下幾步:
- 開通公眾號膜宋,注冊微信公眾號開發(fā)平臺窿侈,這里可以是注冊
訂閱號
,詳細的后面給你說 - 配置權(quán)限秋茫,配置微信后臺開發(fā)者權(quán)限
- 流程介紹
- 接入微信后臺
- 功能實現(xiàn)
- 兵長亂斗帶胖sir飛
開通公眾號
注冊微信公眾號開發(fā)平臺史简,這里可以是注冊訂閱號
,按照提示進行注冊輸入信息即可肛著,相信你一看就會
注冊地址:https://mp.weixin.qq.com/cgi-bin/registermidpage?action=index&lang=zh_CN&token=
我整理了一個表格來介紹一下訂閱號和服務器號的區(qū)別圆兵,你也可以先初步了解一下區(qū)別跺讯,后面可以慢慢琢磨
訂閱號 | 服務號 | |
---|---|---|
用途 | 主要目的 為大家傳播咨詢;類似報紙殉农,雜志刀脏,個人輸出 | 偏向企業(yè)或組織的交互,如銀行超凳,商場愈污,餐廳等;自助服務的服務號轮傍,用于企業(yè) |
群發(fā)次數(shù) | 一天可以發(fā)送一次暂雹;所有的訂閱號推送消息,會被統(tǒng)一收納到訂閱號欄目中 | 一個月發(fā)送4條群發(fā)消息 |
展示位置 | 全部收錄在 訂閱號的 信息欄中 | 展示在好友消息列表之中创夜;關(guān)注一個服務號擎析,即相當與加了一個朋友 |
微信支付 | 不可開通支付功能 | 認證后 可以開通微信支付功能 |
自定義菜單 | 相對簡單 | 相對高級,微信有接口挥下,可以自行開發(fā) |
配置權(quán)限
配置微信后臺開發(fā)者權(quán)限
- 進入公眾號管理頁面揍魂,下拉左邊側(cè),進入基本配置
-
URL
:填寫自己的外網(wǎng)服務器URL
棚瘟,如果沒有可以買一個云服務器现斋,現(xiàn)在買云服務器還是很便宜的 -
Token
:自定義Token
,用于制作簽名偎蘸,這個非常重要庄蹋,需要保密 -
EncodingAESKey
:隨機生成即可 -
消息加解密方式
:為了演示方便,我們這里使用明文模式
- 微信公眾號后臺接口權(quán)限
普通用戶只要是接收消息和自動回復消息的權(quán)限
流程介紹
開發(fā)被動回復消息流程介紹迷雪,簡單來說限书,可以是這樣的
功能實現(xiàn)必備知識點
-
http服務
進行通信 - Token機制
- 微信后臺開發(fā)
xml
的數(shù)據(jù)序列化
http服務
做上述被動回復消息的功能,此處僅需要后臺服務器實現(xiàn)get
方法和post
方法即可
-
get方法
主要是用于章咧,我們在微信后臺設置token的時候倦西,微信后臺會向我們的服務器發(fā)送get請求,判斷我們服務是否有正確的數(shù)據(jù)
-
post方法
主要是用于赁严,粉絲在我們的微信后臺發(fā)送消息的時候扰柠,是以post的方式發(fā)送給我們的后臺服務器的
Token機制
參數(shù) | 描述 |
---|---|
signature | 微信加密簽名,signature結(jié)合了開發(fā)者填寫的token參數(shù)和請求中的timestamp參數(shù)疼约、nonce參數(shù)卤档。 |
timestamp | 時間戳 |
nonce | 隨機數(shù) |
echostr | 隨機字符串 |
開發(fā)者通過檢驗signature對請求進行校驗(下面有校驗方式)。若確認此次GET請求來自微信服務器程剥,請原樣返回echostr
參數(shù)內(nèi)容劝枣,則接入生效,成為開發(fā)者成功,否則接入失敗舔腾。加密/校驗流程如下:
1)將token溪胶、timestamp、nonce三個參數(shù)進行字典序
排序
2)將三個參數(shù)字符串拼接成一個字符串進行sha1加密
3)開發(fā)者獲得加密后的字符串可與signature
對比琢唾,標識該請求來源于微信
token算法流程圖
驗證方法(get)
- 1.服務器端獲取token、nonce盾饮、timestamp組成列表
- 2.列表排成字典序
- 3.排序后的元素進行摘要
- 4.摘要比對signature
- 5.響應
echostr
參考微信后臺開發(fā)文檔連接:https://developers.weixin.qq.com/doc/offiaccount/Getting_Started/Getting_Started_Guide.html
xml數(shù)據(jù)解析
兵長采桃,不知道你有沒有用過xml來做數(shù)據(jù)的序列化,此處你肯定會問丘损,為什么用xml普办,而不用json,不用protobuf
來我給你簡單介紹一下xml:
XML是可擴展標記語言徘钥,其中標記指的是計算機中所能理解的信息符號衔蹲,通過標記計算機之間可以處理包含各種信息的資源,我們可以通過通用的標記語言來進行標記
用人話來說就是呈础,xml是數(shù)據(jù)序列化的其中一種方式舆驶,微信定下來使用該方式來對數(shù)據(jù)進行序列化,我們需要對此進行開發(fā)而钞,因此也需要遵循微信的規(guī)則
例如 微信后臺的 text消息類型 請求 xml格式如下
文本消息沙廉,微信公眾平臺請求微信后臺服務器會帶的字段有:FromUserName
,ToUserName
臼节,CreateTime
,MsgType
撬陵,Content
,MsgId
我們開發(fā)的微信后臺服務器网缝,需要按照如下數(shù)據(jù)格式做回復:xml 帶上如下字段ToUserName
巨税,FromUserName
,CreateTime
,MsgType
粉臊,Content
兵長草添,再給你回顧一下,實現(xiàn)微信后臺服務器被動回復消息的服務扼仲,需要用到上述說到的3點果元,http服務、token機制犀盟、xml解析而晒,記住咯,我要開始擼代碼了
具體實現(xiàn)
main.go
- 啟動http服務器阅畴,開始監(jiān)聽80端口
package main
import (
"fmt"
"github.com/wonderivan/logger"
"net/http"
"time"
)
const (
port = 80 //后臺服務器端口號80倡怎,自己的公網(wǎng)服務器 需要設置防火墻,打開80端口
token = "XXXXXXX"
)
// 需要自己修改token,以適應自己公眾號的token
func main() {
logger.SetLogger("./log.json")
logger.Info(" ------------ start main ------------")
server := http.Server{
Addr: fmt.Sprintf(":%d", port), // 設置監(jiān)聽地址监署, ip:port
Handler: &httpHandler{}, // 具體使用哪個handler來處理
ReadTimeout: 5 * time.Second, // 讀寫超時 微信給出來 5秒
WriteTimeout: 5 * time.Second,
MaxHeaderBytes: 0,
}
logger.Info(fmt.Sprintf("Listen: %d", port))
logger.Fatal(server.ListenAndServe())
}
route.go
- 路由功能 颤专, 具體實現(xiàn)get 和post方法
- 定義Handler 以及 ServeHTTP 接口的實現(xiàn)
package main
import (
"fmt"
"github.com/wonderivan/logger"
"io"
"net/http"
"regexp"
"time"
"wechat/wx"
)
type WebController struct {
Function func(http.ResponseWriter, *http.Request)
Method string
Pattern string
}
var mux []WebController // 自己定義的路由
// ^ 匹配輸入字符串的開始位置
func init() {
mux = append(mux, WebController{post, "POST", "^/"})
mux = append(mux, WebController{get, "GET", "^/"})
}
type httpHandler struct{}
//httpHandler 自己實現(xiàn)了 ServeHTTP 接口,可以通過源碼看到钠乏,創(chuàng)建httpHandler 對象的時候栖秕,實際源碼邏輯是會調(diào)用ServeHTTP進行處理
func (*httpHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
t := time.Now()
for _, webController := range mux { // 遍歷路由
// 匹配請求的 r.URL.Path -> webController.Pattern
if m, _ := regexp.MatchString(webController.Pattern, r.URL.Path); m { // 匹配URL
logger.Info("webController.Pattern == ", webController.Pattern)
logger.Info("r.URL.Path == ", r.URL.Path)
if r.Method == webController.Method { // 匹配方法
logger.Info("webController.Method == ", webController.Method)
webController.Function(w, r) // 調(diào)用對應的處理函數(shù)
d := time.Now().Sub(t)
l := fmt.Sprintf("[ACCESS] | % -10s | % -40s | % -16s", r.Method, r.URL.Path, d.String())
logger.Info(l)
return
}
}
}
d := time.Now().Sub(t)
l := fmt.Sprintf("[ACCESS] | % -10s | % -40s | % -16s", r.Method, r.URL.Path, d.String())
logger.Info(l)
io.WriteString(w, "")
return
}
// 處理token的認證
func get(w http.ResponseWriter, r *http.Request) {
client, err := wx.NewClient(r, w, token)
if err != nil {
logger.Info(err)
w.WriteHeader(403) // 校驗失敗
return
}
if len(client.Query.Echostr) > 0 {
logger.Info("Echostr == ", client.Query.Echostr)
w.Write([]byte(client.Query.Echostr)) // 校驗成功返回的是Echostr
return
}
w.WriteHeader(403)
return
}
// 微信平臺過來消息, 處理 晓避,然后返回微信平臺
func post(w http.ResponseWriter, r *http.Request) {
client, err := wx.NewClient(r, w, token)
if err != nil {
logger.Info(err)
w.WriteHeader(403)
return
}
// 到這一步簽名已經(jīng)驗證通過了
client.Run()
return
}
具體代碼實現(xiàn)還有1個定義結(jié)構(gòu)文件和核心實現(xiàn)文件:
-
structs.go
xml序列化消息對應的結(jié)構(gòu)體的定義簇捍,包含基本消息字段,
FromUserName
俏拱,ToUserName
暑塑,MsgType
,CreateTime
,以及文本消息锅必,圖片消息事格,錄音消息,音樂消息搞隐,地理位置消息驹愚,視頻消息等需要哪一些字段,都可以參考微信后臺給出的規(guī)則 -
wx.go
token + 隨機數(shù) + 時間戳 排成字典序劣纲,并使用sha1加密后生成 signature
NewClient的具體實現(xiàn)
文本消息么鹤,圖片消息等的消息處理以及被動回復功能
上述2個核心文件若是感興趣,自己有想法并且期望自己實現(xiàn)的小伙伴味廊,可以添加我的微信蒸甜,可以給大家共享一下
當然,微信后臺開發(fā)涉及的功能還很多余佛,今天給大家分享到的還只是冰山一角柠新,沿途的風景還是需要大家一步一個腳印去感受,可以在微信的開發(fā)文檔中盡情實戰(zhàn)辉巡,如下圖恨憎,感興趣的可以多多交流。
技術(shù)是開放的郊楣,我們共享技術(shù)憔恳,心態(tài)也應是開放的,我們擁抱變化净蚤,你愿意不斷摸索前進钥组,你必將收獲你期望的東西。
以上是本期全部內(nèi)容今瀑,堅持原創(chuàng)程梦,實踐自己的想法点把,我們下期見
作者:小魔童哪吒