golang WeChat公衆プラットフォームのメッセージアクセス

7484 ワード

APIドキュメントの内容
パブリックプラットフォームを登録するとは言わない。メッセージアクセス部分、ドキュメントアドレス:
http://mp.weixin.qq.com/wiki/index.php?title=%E6%B6%88%E6%81%AF%E6%8E%A5%E5%8F%A3%E6%8C%87%E5%8D%97#.E7.94.B3.E8.AF.B7.E6.B6.88.E6.81.AF.E6.8E.A5.E5.8F.A3
簡単に言えば、申請を提出して、WeChatサーバーはGETを送信してあなたの記入したURLの上で要求して、このGETは4つのパラメータを付け加えます。
パラメータ
説明
シンプルネイチャー
WeChat暗号化署名
timestamp
タイムスタンプ
nonce
乱数
echostr
ランダムな文字列
プロセスは簡単で、データを検証し、確認要求はWeChatサーバから来て、そのままechostrパラメータの内容に戻り、アクセスは有効となります。
検証の流れ:
1.  token、timestamp、nonce           

2.                   sha1  

3.               signature  ,          
GOウェブサーバを構築する
https://github.com/astaxie/build-web-application-with-golang/blob/master/ebook/03.2.md上の内容はコードを直接持ってきて使います。
package main



import (

    "fmt"

    "net/http"

    "log"

)



func sayhelloName(w http.ResponseWriter, r *http.Request) {

    fmt.Fprintf(w, "Hello!") 

}



func main() {

    http.HandleFunc("/", sayhelloName) //       

    err := http.ListenAndServe(":80", nil) //       

    if err != nil {

        log.Fatal("ListenAndServe: ", err)

    }

}
もちろん私はここで多くのものを削除しました。一番簡単なフレームだけ残して、ポートも80に変えました。文書の中で80ポートが必要ですから。
このような簡単なサーバは、ブラウザからhttp://localhostを入力して、ハローを出力します。
このフレームは変わらないです。私たちが必要な部分はsayhello Nameです。でも用途によって名前を変えたほうがいいです。checkSignature。
checkSignatureを実現します。
これからのことは水の通りになります。検査の流れに従ってcheckSignatureを実現します。
第一歩:必ず、GET要求に添付されているデータを取り出してください。
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"],"")
ステップ2:辞書の並べ替え
tmps:=[]string{token,timestamp,nonce}

sort.Strings(tmps)
ステップ3:shar 1暗号化
func str2sha1(data string)string{

    t:sha1.New()

    io.WriteString(t,data)

    return fmt.Sprintf("%x",t.Sum(nil))

}
ステップ4:対比signature
完全なコードは以下の通りです。
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)

    }

}