86 lines
2.3 KiB
Go

package Scheme
import (
"context"
"encoding/json"
"errors"
"fmt"
"hospital-open-api/extend/weChat"
"hospital-open-api/global"
"strings"
"time"
)
// GetSchemeJumpWxaRequest 跳转到的目标小程序信息
type GetSchemeJumpWxaRequest struct {
Path string `json:"path"`
Query string `json:"query"`
// envVersion 要打开的小程序版本。正式版为 "release",体验版为 "trial",开发版为 "develop"
EnvVersion string `json:"env_version"`
}
// GetSchemeRequest 请求参数
// https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/url-scheme/urlscheme.generate.html#请求参数
type GetSchemeRequest struct {
JumpWxa *GetSchemeJumpWxaRequest `json:"jump_wxa"`
ExpireType int `json:"expire_type"`
ExpireTime int64 `json:"expire_time"`
ExpireInterval int `json:"expire_interval"`
}
// GetSchemeResponse 获取加密scheme码返回数据
type GetSchemeResponse struct {
OpenLink string `json:"openlink"`
weChat.CommonError
}
// GetScheme 获取加密scheme码
func (r *GetSchemeRequest) GetScheme(userType int) (string, error) {
// 初始化配置
weChatConfig := weChat.GetConfig(userType)
// 获取token
accessToken, err := weChatConfig.GetAccessToken()
if err != nil {
return "", err
}
url := fmt.Sprintf("%s?access_token=%s", "https://api.weixin.qq.com/wxa/generatescheme", accessToken)
// 将请求数据转换为 JSON
requestBody, err := json.Marshal(r)
if err != nil {
return "", err
}
// 去除json的转义
requestBody = []byte(strings.Replace(string(requestBody), "\\u0026", "&", -1))
body, err := weChat.PostRequest(url, requestBody)
if err != nil {
return "", errors.New(err.Error())
}
var GetSchemeResponse GetSchemeResponse
err = json.Unmarshal(body, &GetSchemeResponse)
if err != nil {
// json解析失败
return "", err
}
if GetSchemeResponse.ErrCode != 0 || GetSchemeResponse.ErrMsg != "ok" {
return "", errors.New(GetSchemeResponse.ErrMsg)
}
if GetSchemeResponse.OpenLink == "" {
return "", errors.New("失败")
}
// 加入缓存
redisKey := "c:official_account.scheme." + r.JumpWxa.Path + "." + r.JumpWxa.Query
global.Redis.Set(context.Background(), redisKey, GetSchemeResponse.OpenLink, 60*60*24*10*time.Second)
return GetSchemeResponse.OpenLink, nil
}