一看便會微信后臺服務器開發(fā)

[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=

image

我整理了一個表格來介紹一下訂閱號和服務器號的區(qū)別圆兵,你也可以先初步了解一下區(qū)別跺讯,后面可以慢慢琢磨

訂閱號 服務號
用途 主要目的 為大家傳播咨詢;類似報紙殉农,雜志刀脏,個人輸出 偏向企業(yè)或組織的交互,如銀行超凳,商場愈污,餐廳等;自助服務的服務號轮傍,用于企業(yè)
群發(fā)次數(shù) 一天可以發(fā)送一次暂雹;所有的訂閱號推送消息,會被統(tǒng)一收納到訂閱號欄目中 一個月發(fā)送4條群發(fā)消息
展示位置 全部收錄在 訂閱號的 信息欄中 展示在好友消息列表之中创夜;關(guān)注一個服務號擎析,即相當與加了一個朋友
微信支付 不可開通支付功能 認證后 可以開通微信支付功能
自定義菜單 相對簡單 相對高級,微信有接口挥下,可以自行開發(fā)

配置權(quán)限

配置微信后臺開發(fā)者權(quán)限

  • 進入公眾號管理頁面揍魂,下拉左邊側(cè),進入基本配置
image
image
  1. URL:填寫自己的外網(wǎng)服務器URL棚瘟,如果沒有可以買一個云服務器现斋,現(xiàn)在買云服務器還是很便宜的
  2. Token:自定義Token,用于制作簽名偎蘸,這個非常重要庄蹋,需要保密
  3. EncodingAESKey:隨機生成即可
  4. 消息加解密方式:為了演示方便,我們這里使用明文模式
  • 微信公眾號后臺接口權(quán)限

普通用戶只要是接收消息和自動回復消息的權(quán)限

image

流程介紹

開發(fā)被動回復消息流程介紹迷雪,簡單來說限书,可以是這樣的

image

功能實現(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算法流程圖

image

驗證方法(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格式如下

image

文本消息沙廉,微信公眾平臺請求微信后臺服務器會帶的字段有:FromUserNameToUserName臼节,CreateTime,MsgType撬陵,ContentMsgId

我們開發(fā)的微信后臺服務器网缝,需要按照如下數(shù)據(jù)格式做回復:xml 帶上如下字段ToUserName巨税,FromUserNameCreateTime,MsgType粉臊,Content

image

兵長草添,再給你回顧一下,實現(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暑塑,MsgTypeCreateTime,以及文本消息锅必,圖片消息事格,錄音消息,音樂消息搞隐,地理位置消息驹愚,視頻消息等需要哪一些字段,都可以參考微信后臺給出的規(guī)則

  • wx.go

    token + 隨機數(shù) + 時間戳 排成字典序劣纲,并使用sha1加密后生成 signature

    NewClient的具體實現(xiàn)

    文本消息么鹤,圖片消息等的消息處理以及被動回復功能

上述2個核心文件若是感興趣,自己有想法并且期望自己實現(xiàn)的小伙伴味廊,可以添加我的微信蒸甜,可以給大家共享一下

當然,微信后臺開發(fā)涉及的功能還很多余佛,今天給大家分享到的還只是冰山一角柠新,沿途的風景還是需要大家一步一個腳印去感受,可以在微信的開發(fā)文檔中盡情實戰(zhàn)辉巡,如下圖恨憎,感興趣的可以多多交流。

image

技術(shù)是開放的郊楣,我們共享技術(shù)憔恳,心態(tài)也應是開放的,我們擁抱變化净蚤,你愿意不斷摸索前進钥组,你必將收獲你期望的東西。

以上是本期全部內(nèi)容今瀑,堅持原創(chuàng)程梦,實踐自己的想法点把,我們下期見

作者:小魔童哪吒

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市屿附,隨后出現(xiàn)的幾起案子郎逃,更是在濱河造成了極大的恐慌,老刑警劉巖挺份,帶你破解...
    沈念sama閱讀 222,252評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件褒翰,死亡現(xiàn)場離奇詭異,居然都是意外死亡匀泊,警方通過查閱死者的電腦和手機优训,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來探赫,“玉大人型宙,你說我怎么就攤上這事撬呢÷追停” “怎么了?”我有些...
    開封第一講書人閱讀 168,814評論 0 361
  • 文/不壞的土叔 我叫張陵魂拦,是天一觀的道長毛仪。 經(jīng)常有香客問我,道長芯勘,這世上最難降的妖魔是什么箱靴? 我笑而不...
    開封第一講書人閱讀 59,869評論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮荷愕,結(jié)果婚禮上衡怀,老公的妹妹穿的比我還像新娘。我一直安慰自己安疗,他們只是感情好抛杨,可當我...
    茶點故事閱讀 68,888評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著荐类,像睡著了一般怖现。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上玉罐,一...
    開封第一講書人閱讀 52,475評論 1 312
  • 那天屈嗤,我揣著相機與錄音环础,去河邊找鬼咧最。 笑死甫贯,一個胖子當著我的面吹牛拜秧,可吹牛的內(nèi)容都是我干的祸穷。 我是一名探鬼主播楔绞,決...
    沈念sama閱讀 41,010評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼能扒,長吁一口氣:“原來是場噩夢啊……” “哼迟郎!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起透硝,我...
    開封第一講書人閱讀 39,924評論 0 277
  • 序言:老撾萬榮一對情侶失蹤狰闪,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后濒生,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體埋泵,經(jīng)...
    沈念sama閱讀 46,469評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,552評論 3 342
  • 正文 我和宋清朗相戀三年罪治,在試婚紗的時候發(fā)現(xiàn)自己被綠了丽声。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,680評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡觉义,死狀恐怖雁社,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情晒骇,我是刑警寧澤霉撵,帶...
    沈念sama閱讀 36,362評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站洪囤,受9級特大地震影響徒坡,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜瘤缩,卻給世界環(huán)境...
    茶點故事閱讀 42,037評論 3 335
  • 文/蒙蒙 一喇完、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧剥啤,春花似錦锦溪、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,519評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至富腊,卻和暖如春坏逢,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背赘被。 一陣腳步聲響...
    開封第一講書人閱讀 33,621評論 1 274
  • 我被黑心中介騙來泰國打工是整, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人民假。 一個月前我還...
    沈念sama閱讀 49,099評論 3 378
  • 正文 我出身青樓浮入,卻偏偏與公主長得像,于是被迫代替她去往敵國和親羊异。 傳聞我的和親對象是個殘疾皇子事秀,可洞房花燭夜當晚...
    茶點故事閱讀 45,691評論 2 361

推薦閱讀更多精彩內(nèi)容