使用Go语言实现微信公众平台

2018-09-26 20:14

阅读:600

  这个不是全部的代码哦,只是一个演示可以验证跟接受post传过来的消息并且能返回消息,中间的回复逻辑就待需要各位同志们自己写了哈

  复制代码 代码如下:
/*
*@go语言实现公众平台
*/
package main
import (
crypto/sha1
encoding/xml
fmt
io
io/ioutil
log
net/http
sort
strings
time
)
type Request struct {
ToUserName string
FromUserName string
CreateTime time.Duration
MsgType string
Content string
MsgId int
}
type Response struct {
ToUserName string `xml:xml>ToUserName`
FromUserName string `xml:xml>FromUserName`
CreateTime string `xml:xml>CreateTime`
MsgType string `xml:xml>MsgType`
Content string `xml:xml>Content`
MsgId int `xml:xml>MsgId`
}
func str2sha1(data string) string {
t := sha1.New()
io.WriteString(t, data)
return fmt.Sprintf(%x, t.Sum(nil))
}
func action(w http.ResponseWriter, r *http.Request) {
postedMsg, err := ioutil.ReadAll(r.Body)
if err != nil {
log.Fatal(err)
}
r.Body.Close()
v := Request{}
xml.Unmarshal(postedMsg, &v)
if v.MsgType == text {
output, err := xml.MarshalIndent(v, , )
if err != nil {
fmt.Printf(error:%v\n, err)
}
fmt.Fprintf(w, string(output))
} else if v.MsgType == event {
Content := `欢迎关注
我的微信`
v := Request{v.ToUserName, v.FromUserName, v.CreateTime, v.MsgType, Content, v.MsgId}
output, err := xml.MarshalIndent(v, , )
if err != nil {
fmt.Printf(error:%v\n, err)
}
fmt.Fprintf(w, string(output))
}
}
func checkSignature(w http.ResponseWriter, r *http.Request) {
r.ParseForm()
var token string = 你的token
var signature string = strings.Join(r.Form[signature], )
var timestamp string = strings.Join(r.Form[timestamp], )
var nonce string = strings.Join(r.Form[nonce], )
var echostr string = strings.Join(r.Form[echostr], )
tmps := []string{token, timestamp, nonce}
sort.Strings(tmps)
tmpStr := tmps[0] + tmps[1] + tmps[2]
tmp := str2sha1(tmpStr)
if tmp == signature {
fmt.Fprintf(w, echostr)
}
}
func main() {
http.HandleFunc(/check, checkSignature)
http.HandleFunc(/, action)
http.ListenAndServe(:8080, nil)
}


评论


亲,登录后才可以留言!