golang验证代码
package main
import (
"crypto/sha1"
"fmt"
"io"
"log"
"net/http"
"sort"
"strings"
)
const (
token = "sixah" //设置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函数将字符串数组str中的内容写入到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给微信服务器
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!")
}