Golang:經過小程序獲取微信 openid

爲何要獲取小程序的 openid

在開發微信小程序的過程當中,小程序能夠經過微信官方提供的登陸能力方便地獲取微信提供的用戶身份標識,快速創建小程序內的用戶體系。那麼這個用戶身份標識就是 openid。html

小程序獲取 openid 的流程

那麼小程序獲取 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 的設置關閉

Go 語言後端代碼演示

小程序發過來的數據和去微信 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
}

複製代碼

運行結果

運行代碼,在小程序中點擊:

結果:
相關文章
相關標籤/搜索