Golang: получить открытый идентификатор WeChat через апплет

Go

Зачем получать openid апплета

В процессе разработки апплета WeChat апплет может легко получить идентификатор пользователя, предоставленный WeChat, с помощью возможности входа в систему, предоставляемой официальным WeChat, и быстро установить пользовательскую систему в апплете. Затем этот идентификатор пользователя является openid.

Процесс получения openid апплета

Далее процесс получения openid апплета выглядит следующим образом.Я упростил его здесь, так как нам нужно получить только openid.Подробности см.здесь

Нам нужно вызвать wx.login() в апплете, чтобы получить код кода, а затем отправить код кода на серверную часть, которая содержит код кода и appid, а appsecret инициирует http-запрос к интерфейсу WeChat для получения кода. опенид.

Меры предосторожности

AppID в разрабатываемом апплете должен совпадать с AppID, используемым в бэкенде, иначе он не сможет получить openid

WeChat API, который мы запрашиваем,auth.code2Session,

Адрес запроса:

GET https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code

Четыре обязательных параметра:

Атрибуты Типы По умолчанию Необходимый иллюстрировать
appid string да Апплет AppID
secret string да апплет appSecret
js_code string да код, полученный при входе в систему
grant_type string да Тип авторизации, просто введите здесь код авторизации

js_code — это код, который мы получили через wx.login, grant_type — это author_code, для входа нам осталось только appid и secretПубличная платформа WeChatпосмотри внутри

Мини-демонстрация программного кода

Для того, чтобы облегчить работу, мы написали кнопку на главной странице для запуска событий через кнопку

<!--index.wxml-->
<view class="container">
  <button bindtap="onGetOpenId">点击获取openid</button>
</view>

Затем напишите функцию события:

//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

Данные, отправленные апплетом, и данные, полученные от WeChat API, помещаются в тело http, поэтому нам нужно получить их из тела.

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
}

результат операции

Запустите код и нажмите в апплете:

результат: