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パラメータの内容に戻り、アクセスは有効となります。
検証の流れ:
https://github.com/astaxie/build-web-application-with-golang/blob/master/ebook/03.2.md上の内容はコードを直接持ってきて使います。
このような簡単なサーバは、ブラウザからhttp://localhostを入力して、ハローを出力します。
このフレームは変わらないです。私たちが必要な部分はsayhello Nameです。でも用途によって名前を変えたほうがいいです。checkSignature。
checkSignatureを実現します。
これからのことは水の通りになります。検査の流れに従ってcheckSignatureを実現します。
第一歩:必ず、GET要求に添付されているデータを取り出してください。
完全なコードは以下の通りです。
パブリックプラットフォームを登録するとは言わない。メッセージアクセス部分、ドキュメントアドレス:
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)
}
}