使用Go語言實(shí)現(xiàn)微信公眾平臺
更新時間:2015年01月04日 15:38:09 投稿:hebedich
這篇文章主要介紹了使用Go語言實(shí)現(xiàn)微信公眾平臺,雖然不是全部代碼,但是也是給我們提供了一個非常好的思路,需要的朋友可以參考下
這個不是全部的代碼哦,只是一個演示可以驗(yàn)證跟接受post傳過來的消息并且能返回消息,中間的回復(fù)邏輯就待需要各位同志們自己寫了哈
復(fù)制代碼 代碼如下:
/*
*@go語言實(shí)現(xiàn)公眾平臺
*/
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 := `"歡迎關(guān)注
我的微信"`
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)
}
相關(guān)文章
使用Go語言創(chuàng)建靜態(tài)文件服務(wù)器問題
這篇文章主要介紹了使用Go語言創(chuàng)建靜態(tài)文件服務(wù)器,本文通過試了代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-03-03
GoLang并發(fā)編程中條件變量sync.Cond的使用
Go標(biāo)準(zhǔn)庫提供Cond原語的目的是,為等待/通知場景下的并發(fā)問題提供支持,本文主要介紹了Go并發(fā)編程sync.Cond的具體使用,具有一定的參考價值,感興趣的可以了解一下2023-01-01
Golang實(shí)現(xiàn)驗(yàn)證一個字符串是否為URL
在實(shí)際開發(fā)過程中,有時候會遇到?URL?的校驗(yàn)問題,Go?語言中有哪些方法去驗(yàn)證一個字符串是否滿足?URL?格式呢?本文就來和大家詳細(xì)講講2023-04-04
用Go語言標(biāo)準(zhǔn)庫實(shí)現(xiàn)Web服務(wù)之項(xiàng)目介紹
從本節(jié)開始將從后端到前端一步一步實(shí)現(xiàn)一個Go語言Web服務(wù),后端除了MySQL驅(qū)動,全部使用Go語言標(biāo)準(zhǔn)庫來實(shí)現(xiàn)一個小型項(xiàng)目,本篇將簡單的介紹一下項(xiàng)目開發(fā)要準(zhǔn)備的流程,感興趣的同學(xué)可以閱讀一下2023-05-05
Golang根據(jù)job數(shù)量動態(tài)控制每秒?yún)f(xié)程的最大創(chuàng)建數(shù)量方法詳解
這篇文章主要介紹了Golang根據(jù)job數(shù)量動態(tài)控制每秒?yún)f(xié)程的最大創(chuàng)建數(shù)量方法2024-01-01

