golang(Go语言)实现微信公众平台

widuu · · 3235 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

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

/*
 *@author widuu
 *@time 2013-7-19
 *@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" {
        v := Request{v.ToUserName, v.FromUserName, v.CreateTime, v.MsgType, v.Content, v.MsgId}
        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)
}

未经允许,不得转载本站任何文章:微度网络 » golang(Go语言)实现微信公众平台


有疑问加站长微信联系(非本文作者)

本文来自:微度网络

感谢作者:widuu

查看原文:golang(Go语言)实现微信公众平台

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

3235 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传