在開發微信小程序的過程當中,小程序能夠經過微信官方提供的登陸能力方便地獲取微信提供的用戶身份標識,快速創建小程序內的用戶體系。那麼這個用戶身份標識就是 openid。html
那麼小程序獲取 openid 的流程具體以下,這裏我簡化了一下,由於咱們只須要獲取到 openid 便可,具體能夠參考這裏 json
咱們須要在小程序中調用 wx.login() 獲取 code 碼,而後將這個 code 碼發送給後端,後端帶着這個 code 碼和 appid,appsecret 向微信接口發起 http 請求獲取 openid。小程序
在開發的小程序中的 AppID 必定要和後端使用的 AppID 保持一致,不然會獲取 openid 失敗 後端
咱們請求的微信 API 爲 auth.code2Session,微信小程序
請求地址爲:api
GET https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code
複製代碼
所需的四個參數爲:bash
屬性 | 類型 | 默認值 | 必填 | 說明 |
---|---|---|---|---|
appid | string | 是 | 小程序 appId | |
secret | string | 是 | 小程序 appSecret | |
js_code | string | 是 | 登陸時獲取的 code | |
grant_type | string | 是 | 受權類型,此處只需填寫 authorization_code |
js_code 就是咱們經過 wx.login 獲得的 code,grant_type 爲 authorization_code,只剩下 appid 和 secret 須要咱們登陸微信公總平臺裏面找 微信
爲了方便操做,咱們在 index 頁面編寫了一個 button,經過 button 觸發事件session
<!--index.wxml-->
<view class="container">
<button bindtap="onGetOpenId">點擊獲取openid</button>
</view>
複製代碼
而後編寫事件函數:app
//index.js
Page({
onGetOpenId() {
wx.login({
success: res => {
if (res.code) {
wx.request({
url: "http://localhost:2020/openid",
method: "POST",
data: {
code: res.code
},
success: res => {
console.log(res);
}
});
}
}
});
}
});
複製代碼
那麼,在小程序中發送 http 請求強制要求地址必須爲 https,因爲咱們在開發中,咱們能夠把強制 https 的設置關閉
小程序發過來的數據和去微信 API 獲取的數據都是放在 http body 裏,因此咱們要從 body 獲取
package main
import (
"encoding/json"
"fmt"
"net/http"
)
func main() {
http.HandleFunc("/openid", getOpenID)
http.ListenAndServe(":2020", nil)
}
func getOpenID(writer http.ResponseWriter, request *http.Request) {
if request.Method != http.MethodPost {
return
}
var codeMap map[string]string
err := json.NewDecoder(request.Body).Decode(&codeMap)
if err != nil {
return
}
defer request.Body.Close()
code := codeMap["code"]
openid, err := sendWxAuthAPI(code)
if err != nil {
return
}
fmt.Println("my openid", openid)
}
const (
code2sessionURL = "https://api.weixin.qq.com/sns/jscode2session?appid=%s&secret=%s&js_code=%s&grant_type=authorization_code"
appID = "你的AppID"
appSecret = "你的AppSecret"
)
func sendWxAuthAPI(code string) (string, error) {
url := fmt.Sprintf(code2sessionURL, appID, appSecret, code)
resp, err := http.DefaultClient.Get(url)
if err != nil {
return "", err
}
var wxMap map[string]string
err = json.NewDecoder(resp.Body).Decode(&wxMap)
if err != nil {
return "", err
}
defer resp.Body.Close()
return wxMap["openid"], nil
}
複製代碼
運行代碼,在小程序中點擊:
結果: