| 版權聲明:本文為博主原創文章,未經博主允許不得轉載。
從2014.12月份左右接觸微信公眾號開發,短短續續也有了一年多在這期間做了不知道多少個公眾號,各種奇葩的功能都有涉獵。從一無所知的小白,到對整個微信公眾號生態的理解,不知道經歷了多少個日日夜夜,鬼知道我經歷了什么。此次教程不談什么微信公眾號O2O(基本死光了)也不談什么分答,大字(基本被微信封的差不多了),這次我們只是對微信公眾號的二次開發者們,希望對你們有所幫助,也希望有更多的朋友一起探討,討論。
下面說一下這個教程的前言:首先此次教程非常詳細基本上包含了微信公眾號平台大部分的功能。編程語言上面我選擇了golang,至於為什么?因為之前基本上用java和python都寫過了再寫一次感覺煩的要死。正好最近一年大部分時間都在用go語言編程。所以選擇了go。針對go我選擇了一個開源的框架gin。(https://github.com/gin-gonic/gin) 也許有人看到這就放棄了。但是相信我語言並不是編程最重要的,只要你理解了原理,語言永遠只是工具。這個教程很可能初期會很基礎,有做過一兩次微信公眾號開發的同學可以在其后的教程中留下你們希望我來做什么功能,我會盡快更新。下面進入正題。
接入微信公眾號平台(開發者模式)
如果想接入微信的公眾號,首先要成為開發者,具體的流程大家直接百度就可以了。成為開發者后在微信公眾號的后台(https://mp.weixin.qq.com)
開發->基本配置->服務器配置

注意:啟用並設置服務器配置后,用戶發給公眾號的消息以及開發者需要的事件推送,將被微信轉發到該URL中
URL:這個是你服務的訪問地址必須是域名一級二級無所謂但是注意端口
Token:這個是用來驗證消息來源是微信的參數 要和你服務中的token一致
EncodingAESKey: 點擊隨機生成即可
消息加解密方式:為了方便我們先選擇明文
這是點擊提交按鈕后,微信服務器將發送GET請求到填寫的服務器地址URL上並攜帶signature、timestamp、nonce、echostr四個參數。這是我們就需要在自己的服務中驗證URL的有效性。下面我展示部分DEMO 雖然都是go語言的但是我盡量加上備注。
首先是路由,我才用的是gin當中的分組路由模式:
//微信服務器連接
weChatCoreGroupR := e.Group("/weChatCore")
{
weChatCoreGroupR.GET("", handler.GetWeChatCore)
weChatCoreGroupR.POST("", handler.PostWeChatCore)
}
其中的GetWeChatCore就是接受服務器發送請求的函數。
func GetWeChatCore(c *gin.Context) {
//接受微信傳過來的參數
signature := c.Query("signature")
timestamp := c.Query("timestamp")
nonce := c.Query("nonce")
echostr := c.Query("echostr")
//獲取所有微信公眾號信息
results, err := store.GetAdapterWechatAccounts(c)
if err != nil {
//錯誤返回
AbortWithError(c, 400, errors.ErrorCode["NOT_EXIST"],
errors.ErrorMessage["NOT_EXIST"])
}
//驗證微信連接
for _, v := range *results {
if wechatUtil.SignAccount(v.Token, timestamp, nonce, signature, echostr) {
c.String(200, echostr)
break
}
}
}
這段代碼中的獲取所有微信公眾號信息下的函數results, err := store.GetAdapterWechatAccounts(c) 其實就是從數據庫中查詢你的微信公眾賬號信息。這里我是因為有多個賬號信息所以需要沒別比對。SignAccount這個函數就是驗證的過程:
//驗證微信來源
func SignAccount(token, timestamp, nonce, signature, echostr string) bool {
s := []string{token, timestamp, nonce}
sort.Sort(sort.StringSlice(s))//將token、timestamp、nonce三個參數進行字典序排序
s0 := strings.Join(s, "")//將三個參數字符串拼接成一個字符串
t := sha1.New()//sha1加密
io.WriteString(t, s0)
s1 := fmt.Sprintf("%x", t.Sum(nil))
if signature == s1 {//與signature對比
return true
}
return false
}
這樣就大功告成了,但有一點要注意的就是:
若確認此次GET請求來自微信服務器,請原樣返回echostr參數內容
這里說的返回事返回一個string類型的echostr 不是json 注意!
恭喜你到這里基本就完成了和微信服務器的對接工作。下面我說一些需要注意的點:
1.當你的服務跑起來了,然后你高高興興的跑去微信后台去編輯你的服務器配置,出現各種失敗的情況。別着急!
2.檢查token是否一樣 URL是否正確 token一定要和你本地的token是一樣的。
3.多提交幾遍,也許就好了。微信公眾號的坑多着呢。。。
| 下期預告
微信公眾號中消息的處理。
