go + uniapp 通过 微信 code 获取 appid 等信息 无废话

go + uniapp 通过 微信 code 获取 appid 等信息 无废话

  • login.vue 通过 uni.login 获取 code
uni.login({
	"provider": "weixin",
	"onlyAuthorize": true, // 微信登录仅请求授权认证
	success: (event) => {
		// 登录成功
		console.log(event);

		const {
			code
		} = event;
		// 向后端发送服务 获取 APPID
		weixinLogin(code).then((res)=> {
			console.log(res);
		})
	}
})
  • weixinLogin 把 code 发送给后端
  • 请求 api/user.js
import request from '@/utils/request/index.js'; // 封装的request.js文件的位置

// 微信登录获取 AppID
export const weixinLogin = (code) => {
	return request(`/api/user/wxlogin/${code}`, 'POST')
}
  • 封装的 utils/request.js
const url_all = {
	// 'DEV': 'http://localhost:9999', // 开发
	'DEV': 'http://192.168.137.33:9999', // 安卓模拟器 手机测试的局域网地址
	// 'PRO': 'http://111.111.111.111:8080', // 生产
}

let BASEURL = url_all['DEV'] // 调整当前环境
/*
* 全局请求封装
* @param path 请求路径
* @param method 请求类型(GET/POST/DELETE等)
* @oaram data 请求体数据
* @param loading 请求未完成是是否显示加载中,默认为true
*/
export default (path, method, data = {}, loading = true) => {
	// 获取存储token
	const token = uni.getStorageSync("token");
	if (loading) {
		uni.showLoading({
			title: "加载中",
			mask: true
		});
	};
	//根据token进行调用函数
	if (token != '') {
		return tokenRequest(path, method, data, loading, token)
	} else {
		return noTokenRequest(path, method, data, loading)
	}
};

// 无token时发送请求函数
function noTokenRequest(path, method, data, loading) { 
	return new Promise((resolve, reject) => {
		uni.request({
			url: BASEURL + path,
			method: method,
			data,
			success(response) {
				// console.log('%c响应拦截:', ' background:green', response);
				/* if (response.data.code === 3001) {
					// logout()
				} */
				/* if (response.data.code !== 20) {
					uni.showToast({
						icon: "none",
						duration: 4000,
						title: response.data.msg
					});
				} */
				// console.log(response.data)
				resolve(response.data);
			},
			fail(err) {
				uni.showToast({
					icon: "none",
					title: '服务响应失败'
				});
				console.error(err);
				reject(err);
			},
			complete() {
				uni.hideLoading();
			}
		});
	});
}


// 有token时发送请求函数
function tokenRequest(path, method, data, loading,token) {
	return new Promise((resolve, reject) => {
		uni.request({
			url: BASEURL + path,
			method: method,
			data,
			header: {
				"token":  token
			},
			success(response) {
				// console.log('%c响应拦截:', ' background:green', response);
				if (response.data.code === 40101) {
					// logout()
				}
				// console.log(response.data)
				resolve(response.data);
			},
			fail(err) {
				uni.showToast({
					icon: "none",
					title: '服务响应失败'
				});
				console.error(err);
				reject(err);
			},
			complete() {
				uni.hideLoading();
			}
		});
	});
}

  • go -> GetWeiXinOpenID.go
func (db userDB) GetWeiXinOpenID(ctx *gin.Context) {
	code := ctx.Params.ByName("code")
	//小程序appid
	var appid = "" //小程序id
	//小程序secret
	var secret = "" //密钥
	//wx接口路径
	var url = "https://api.weixin.qq.com/sns/jscode2session"
	data := make(map[string]string)
	data["appid"] = appid
	data["secret"] = secret
	data["js_code"] = code
	data["grant_type"] = "authorization_code"
	request, err := http.NewRequest("GET", url, nil)
	if err != nil {
		panic(err)
	}
	query := request.URL.Query()
	query.Add("appid", appid)
	query.Add("secret", secret)
	query.Add("js_code", code)
	query.Add("grant_type", "authorization_code")
	
	var encode string = query.Encode()
	s := strings.Split(encode, "&")
	reData := make(map[string]string)
	for i := range s {
		reData[strings.Split(s[i], "=")[0]] = strings.Split(s[i], "=")[1]
	}
	println(reData)
	if encode != "" {
		response.Success(ctx, gin.H{"data": reData}, "SELECT SUCCESS")
	}
}
  • 封装的 response
package response

import (
	"github.com/gin-gonic/gin"
	"net/http"
)

func Response(ctx *gin.Context, httpStatus int, code int, data gin.H, msg string) {
	ctx.JSON(httpStatus, gin.H{"code": code, "data": data, "msg": msg})
}

func Success(ctx *gin.Context, data gin.H, msg string) {
	Response(ctx, http.StatusOK, 200, data, msg)
}
func File(ctx *gin.Context, data gin.H, msg string) {
	Response(ctx, http.StatusNotFound, 404, data, msg)
}

  • go -> router.go
userFun := userController.UserFunction()
userGroup := r.Group("api/user/")
userGroup.POST("/wxlogin/:code", userFun.GetWeiXinOpenID)
  • go -> mian.go
package main

import (
	"github.com/gin-contrib/cors"
	"github.com/gin-gonic/gin"
	"github.com/spf13/viper"
	"go-app/common"
	"os"
)

func main() {
	InitConfig()
	common.InitDB()
	r := gin.Default()
	config := cors.DefaultConfig()
	config.AllowAllOrigins = true                            //允许所有域名
	config.AllowMethods = []string{"GET", "POST", "OPTIONS"} //允许请求的方法
	config.AllowHeaders = []string{"token", "tus-resumable", "upload-length", "upload-metadata", "cache-control", "x-requested-with", "*"}
	r.Use(cors.New(config))

	// 定义路由和处理函数
	r = CollectRoute(r)
	port := viper.GetString("server.port")
	if port != "" {
		panic(r.Run(":" + port))
	}
	r.Run()
}

func InitConfig() {
	workDir, _ := os.Getwd()
	viper.SetConfigName("application")
	viper.SetConfigType("yml")
	viper.AddConfigPath(workDir + "/config")
	err := viper.ReadInConfig()
	if err != nil {
		panic(err)
	}
}

你可能感兴趣的:(项目踩坑日记,uniapp,golang,uni-app,微信)