上文中限煞,我們解決了內(nèi)網(wǎng)穿透的問題,接下來就可以對微信公眾號后臺進(jìn)行配置了关噪。
一般來說削彬,如果我們是個人開發(fā),推薦選擇在微信公眾平臺申請測試號來進(jìn)行開發(fā)調(diào)試忧风,很多功能的權(quán)限都有默色,不像是我們個人申請的公眾號,需要微信認(rèn)證(訂閱號主體屬于個人的話狮腿,是無法認(rèn)證的)后才能有一些其他功能的權(quán)限腿宰。開始開發(fā)微信功能時呕诉,我們需要對照微信公眾平臺的開發(fā)文檔來輔助開發(fā),下面是微信公眾平臺開發(fā)文檔和申請/登錄微信測試號的鏈接吃度。
- 微信公眾平臺開發(fā)文檔:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1445241432
- 微信公眾號測試號申請/登錄:https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login
測試號登錄成功后甩挫,我們會看到下面的界面,這里有兩個重要的信息规肴,appID和appSecret捶闸,后面的很多開發(fā)都需要用到這兩個參數(shù)。接口配置信息中的URL就是我們在上文中啟動內(nèi)網(wǎng)穿透工具后拖刃,映射我們端口的網(wǎng)址删壮,Token是我們自己設(shè)置的,和接下來在代碼里設(shè)置的Token一致兑牡,域名的話就是映射端口的網(wǎng)址去掉http協(xié)議頭就行了央碟。
微信平臺接入驗證的過程就是當(dāng)我們配置好接口信息(URL和Token)提交時,微信服務(wù)器會發(fā)送一個http Get請求到我們填寫的URL上均函,這個Get請求中附帶有四個參數(shù)signature,timestamp,nonce,echostr,我們需要將我們自己設(shè)定的token和timestamp,nonce三個參數(shù)進(jìn)行字典序排序(也就是按照首字母ABCD進(jìn)行排序)亿虽,然后將排序好的這三個參數(shù)組合成一個字符串進(jìn)行sha1加密,加密后的字符串和signature進(jìn)行比較(正確情況下苞也,他們倆是一樣的)洛勉,如果兩者相同,原樣返回echostr參數(shù)給微信服務(wù)器如迟,接入驗證就成功了收毫,我們就成為微信開發(fā)者了,就可以寫各種微信功能了殷勘。
測試號也登錄好了此再,接下來我們就開始寫代碼了,我沒有使用web框架,這樣大家也方便理解
package main
import (
"crypto/sha1"
"fmt"
"io"
"log"
"net/http"
"sort"
"strings"
)
const (
token = "sixah" //設(shè)置token
)
func makeSignature(timestamp, nonce string) string { //本地計算signature
si := []string{token, timestamp, nonce}
sort.Strings(si) //字典序排序
str := strings.Join(si, "") //組合字符串
s := sha1.New() //返回一個新的使用SHA1校驗的hash.Hash接口
io.WriteString(s, str) //WriteString函數(shù)將字符串?dāng)?shù)組str中的內(nèi)容寫入到s中
return fmt.Sprintf("%x", s.Sum(nil))
}
func validateUrl(w http.ResponseWriter, r *http.Request) bool {
timestamp := strings.Join(r.Form["timestamp"], "")
nonce := strings.Join(r.Form["nonce"], "")
signature := strings.Join(r.Form["signature"], "")
echostr := strings.Join(r.Form["echostr"], "")
signatureGen := makeSignature(timestamp, nonce)
if signatureGen != signature {
return false
}
fmt.Fprintf(w, echostr) //原樣返回eechostr給微信服務(wù)器
return true
}
func procSignature(w http.ResponseWriter, r *http.Request) {
r.ParseForm() //Request需要解析
if !validateUrl(w, r) {
log.Println("Wechat Service: This http request is not from wechat platform")
return
}
log.Println("validateUrl Ok")
}
func main() {
log.Println("Wechat Service: Start!")
http.HandleFunc("/", procSignature)
err := http.ListenAndServe(":80", nil)
if err != nil {
log.Println("Wechat Service: ListenAndServe Error: ", err)
}
log.Println("Wechat Service: Stop!")
}
代碼敲完之后玲销,我們編譯啟動這個服務(wù)输拇,成功啟動之后,我們就可以去測試號管理頁面將配置好的接口配置信息提交了贤斜,(記得啟動內(nèi)網(wǎng)穿透工具哦策吠,測試號URL和域名配置要和內(nèi)網(wǎng)穿透的映射端口的網(wǎng)址一樣)然后就配置成功了。
-
結(jié)束語
接入驗證到這里就成功啦瘩绒,后續(xù)的很多微信開發(fā)都需要驗證微信服務(wù)器的請求猴抹,ok,今天就到這里啦。