package
0.0.0-20170417092845-701127331479
Repository: https://github.com/c77cc/wechat.git
Documentation: pkg.go.dev

# README

网页授权获取用户基本信息

snsapi_base 版本,不需要用户确认授权

package main

import (
	"encoding/json"
	"fmt"
	"io"
	"log"
	"net/http"
	"net/url"

	"github.com/c77cc/session"
	"github.com/c77cc/util/random"
	"github.com/c77cc/wechat/mp/user/oauth2"
)

var (
	sessionStorage = session.New(20*60, 60*60)

	oauth2Config = oauth2.NewOAuth2Config(
		"appid",     // 填上自己的参数
		"appsecret", // 填上自己的参数
		"http://192.168.1.168/page2",
		"snsapi_base",
	)
)

func Page1Handler(w http.ResponseWriter, r *http.Request) {
	state := string(random.NewToken())

	sid := string(random.NewSessionId())
	if err := sessionStorage.Add(sid, state); err != nil {
		io.WriteString(w, err.Error())
		return
	}

	cookie := http.Cookie{
		Name:     "sid",
		Value:    sid,
		HttpOnly: true,
	}
	http.SetCookie(w, &cookie)

	http.Redirect(w, r, oauth2Config.AuthCodeURL(state), http.StatusFound)
}

func Page2Handler(w http.ResponseWriter, r *http.Request) {
	if r.URL == nil {
		io.WriteString(w, "r.URL == nil")
		return
	}
	urlValues, err := url.ParseQuery(r.URL.RawQuery)
	if err != nil {
		io.WriteString(w, err.Error())
		return
	}

	cookie, err := r.Cookie("sid")
	if err != nil {
		io.WriteString(w, err.Error())
		return
	}
	session, err := sessionStorage.Get(cookie.Value)
	if err != nil {
		io.WriteString(w, err.Error())
		return
	}

	savedState := session.(string)

	code := urlValues.Get("code")
	urlState := urlValues.Get("state")

	if savedState != urlState {
		io.WriteString(w, fmt.Sprintf("state 不匹配, session 中的为 %q, url 传递过来的是 %q", savedState, urlState))
		return
	}

	if code == "" {
		log.Println("客户禁止授权")
		return
	}

	oauth2Client := oauth2.Client{
		OAuth2Config: oauth2Config,
	}

	token, err := oauth2Client.Exchange(code)
	if err != nil {
		io.WriteString(w, err.Error())
		return
	}

	json.NewEncoder(w).Encode(token)
	return
}

func init() {
	http.HandleFunc("/page1", Page1Handler)
	http.HandleFunc("/page2", Page2Handler)
}

func main() {
	http.ListenAndServe(":80", nil)
}

snsapi_userinfo 版本,需要用户确认授权

package main

import (
	"encoding/json"
	"fmt"
	"io"
	"log"
	"net/http"
	"net/url"

	"github.com/c77cc/session"
	"github.com/c77cc/util/random"
	"github.com/c77cc/wechat/mp/user/oauth2"
)

var (
	sessionStorage = session.New(20*60, 60*60)

	oauth2Config = oauth2.NewOAuth2Config(
		"appid",     // 填上自己的参数
		"appsecret", // 填上自己的参数
		"http://192.168.1.168/page2",
		"snsapi_userinfo",
	)
)

func Page1Handler(w http.ResponseWriter, r *http.Request) {
	state := string(random.NewToken())

	sid := string(random.NewSessionId())
	if err := sessionStorage.Add(sid, state); err != nil {
		io.WriteString(w, err.Error())
		return
	}

	cookie := http.Cookie{
		Name:     "sid",
		Value:    sid,
		HttpOnly: true,
	}
	http.SetCookie(w, &cookie)

	http.Redirect(w, r, oauth2Config.AuthCodeURL(state), http.StatusFound)
}

func Page2Handler(w http.ResponseWriter, r *http.Request) {
	if r.URL == nil {
		io.WriteString(w, "r.URL == nil")
		return
	}
	urlValues, err := url.ParseQuery(r.URL.RawQuery)
	if err != nil {
		io.WriteString(w, err.Error())
		return
	}

	cookie, err := r.Cookie("sid")
	if err != nil {
		io.WriteString(w, err.Error())
		return
	}
	session, err := sessionStorage.Get(cookie.Value)
	if err != nil {
		io.WriteString(w, err.Error())
		return
	}

	savedState := session.(string)

	code := urlValues.Get("code")
	urlState := urlValues.Get("state")

	if savedState != urlState {
		io.WriteString(w, fmt.Sprintf("state 不匹配, session 中的为 %q, url 传递过来的是 %q", savedState, urlState))
		return
	}

	if code == "" {
		log.Println("客户禁止授权")
		return
	}

	oauth2Client := oauth2.Client{
		OAuth2Config: oauth2Config,
	}

	_, err = oauth2Client.Exchange(code)
	if err != nil {
		io.WriteString(w, err.Error())
		return
	}

	userinfo, err := oauth2Client.UserInfo(oauth2.Language_zh_CN)
	if err != nil {
		io.WriteString(w, err.Error())
		return
	}

	json.NewEncoder(w).Encode(userinfo)
	return
}

func init() {
	http.HandleFunc("/page1", Page1Handler)
	http.HandleFunc("/page2", Page2Handler)
}

func main() {
	http.ListenAndServe(":80", nil)
}