首页 > 编程语言 >带参数的微信小程序码服务端(golang)生成

带参数的微信小程序码服务端(golang)生成

时间:2023-03-17 10:23:57浏览次数:49  
标签:return err nil 微信 接口 golang 参数 服务端 string

官方接口

微信小程序码共有3个接口可以生成:

  1. 获取小程序码
    POST https://api.weixin.qq.com/wxa/getwxacode?access_token=ACCESS_TOKEN
    该接口用于获取小程序码,适用于需要的码数量较少的业务场景。通过该接口生成的小程序码,永久有效,有数量限制

    path参数指定扫码进入的页面,最大长度 1024 字节,不能为空可以带参数page/example?foo=bar

  2. 获取不限制的小程序码
    POST https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=ACCESS_TOKEN
    该接口用于获取小程序码,适用于需要的码数量极多的业务场景。通过该接口生成的小程序码,永久有效,数量暂无限制

    page参数指定扫码进入的页面,非必要参数,不可以带参数page/example

  3. 获取小程序二维码
    POST https://api.weixin.qq.com/cgi-bin/wxaapp/createwxaqrcode?access_token=ACCESS_TOKEN
    获取小程序二维码,适用于需要的码数量较少的业务场景。通过该接口生成的小程序码,永久有效,有数量限制

    path参数指定扫码进入的页面,最大长度 128 字节,不能为空,可以带参数page/example?foo=bar

以上3个接口之间的差异主要在于参数以及可以生成的数量, 接口1和3整体差异比较少(path参数长度不同; 小程序码和小程序二维码),接口2生成数量不受限制,但是指定打开的页面的参数page不能带参数(可以考虑通过scene参数传递,我目前还没验证)

具体的差异和参数可以通过链接查看官方文档

Golang实现

我根据自己的需要,选择了接口1的形式来实现,其他的接口只是接口url和参数的差异,整体流程和调用方式都是一样的。

获取ACCESS_TOKEN

func requestToken(appid, secret string) (string, error) {
	u, err := url.Parse("https://api.weixin.qq.com/cgi-bin/token")
	if err != nil {
		log.Fatal(err)
	}
	paras := &url.Values{}
	//设置请求参数
	paras.Set("appid", appid)
	paras.Set("secret", secret)
	paras.Set("grant_type", "client_credential")
	u.RawQuery = paras.Encode()
	resp, err := http.Get(u.String())
	//关闭资源
	if resp != nil && resp.Body != nil {
		defer resp.Body.Close()
	}
	if err != nil {
		return "", errors.New("request token err :" + err.Error())
	}

	jMap := make(map[string]interface{})
	err = json.NewDecoder(resp.Body).Decode(&jMap)
	if err != nil {
		return "", errors.New("request token response json parse err :" + err.Error())
	}
	if jMap["errcode"] == nil || jMap["errcode"] == 0 {
		accessToken, _ := jMap["access_token"].(string)
		return accessToken, nil
	} else {
		//返回错误信息
		errcode := jMap["errcode"].(string)
		errmsg := jMap["errmsg"].(string)
		err = errors.New(errcode + ":" + errmsg)
		return "", err
	}
}

获取小程序码

func GetQRCode(id string) ([]byte, error) {
	//上面生成的access code 判断为空时重新请求
	if appAccessTokenForClient == "" {
		accessToken, err := requestToken(appId, appSecret)
		if err != nil {
			return nil, err
		}
		appAccessTokenForClient = accessToken
	}
	strUrl := fmt.Sprintf("https://api.weixin.qq.com/wxa/getwxacode?access_token=%s", appAccessTokenForClient)

	parm := make(map[string]string)
	parm["path"] = fmt.Sprintf("pages/index/index?id=%s", id)
	jsonStr, err := json.Marshal(parm)
	if err != nil {
		return nil, errors.New("json Marshal QRCode paramter err :" + err.Error())
	}
	req, err := http.NewRequest("POST", strUrl, bytes.NewBuffer([]byte(jsonStr)))
	if err != nil {
		return nil, errors.New("get QRCode err :" + err.Error())
	}

	req.Header.Set("Content-Type", "application/json")
	client := &http.Client{}
	resp, err := client.Do(req)
	if err != nil {
		return nil, errors.New("get QRCode err :" + err.Error())
	}

	defer resp.Body.Close()
	body, err := io.ReadAll(resp.Body)
	if err != nil {
		return nil, errors.New("get QRCode err :" + err.Error())
	}

	return body, nil
}

常见问题

整个过程主要在调试时比较费时间,微信接口返回的错误信息比较范,记录下主要遇到的几种问题

40159

{\"errcode\":40159,\"errmsg\":\"invalid length for path, or the data is not json string hint: [Id2VBa0339xa11]\"}

主要是检查传递的参数,特别是path对应的长度

我这边是因为从接口2修改为接口1,但是page参数名没有修改为path,导致系统判断path为空,一直提示此错误

40169

errCode: 40169 errMsg: "openapi.wxacode.getUnlimited:fail invalid length for scene, or the data is not json string rid: 62764ad3-09f60c12-58046222"

接口2中scene参数,最大32个可见字符,只支持数字,大小写英文以及部分特殊字符:!#$&'()*+,/:;=?@-._~,其它字符请自行编码为合法字符(因不支持%,中文无法使用 urlencode 处理,请使用其他编码方式)

标签:return,err,nil,微信,接口,golang,参数,服务端,string
From: https://www.cnblogs.com/ioridy/p/17225641.html

相关文章

  • Goravel ORM 新增模型关联,用 Golang 写关联也可以跟 Laravel 一样简单
    关于GoravelGoravel是一个功能完备、具有良好扩展能力的Web应用程序框架。作为一个起始脚手架帮助Golang开发者快速构建自己的应用。框架风格与Laravel保持一致,让......
  • golang_gin_learn_todolist
    /Users/song/codelearn/golang/bubble-master/go.modmodulebubblego1.13require( github.com/0xAX/notificatorv0.0.0-20220220101646-ee9b8921e557//indirect......
  • SpringBoot部署到外部Tomcat无法注册到Nacos服务端
    事情经过近期做一个项目投标演示(POC)环境支持,需要集成Nacos服务端。考虑到现有项目中已经有了Nacos相关依赖,那还不简单?新建个服务端,配置几下重启不就搞定了吗?然而事情远......
  • 微信小程序累计独立访客(UV)不低于 1000 是什么意思
    微信小程序累计独立访客(UV)不低于1000是什么意思首先微信小程序“累计独立访客(UV)不低于1000”是指UV是UniqueVisitor的英文缩写,1天内相同的访客多次访问您的网站只计算......
  • golang goroutine
    一.goroutine基本介绍1.进程和线程说明介绍1)进行就是程序在操作系统中的一次执行过程,是系统进行资源分配和调度的基本单位(比如迅雷进程)2)线程是进程的一个执行实例,是程序......
  • maui BlazorWebView+本地html (vue、uniapp等都可以) 接入微信sdk 开发 Android ap
       之前没接触过Androidmaui开发,这几天刚摸索,有些不合理的地方欢迎指出。首先添加微信sdk的绑定库  nuget包:Chi.MauiBinding.Android.WeChat 项目地址:http......
  • 微信支付V3 InvalidKeyException: Illegal key size
    使用Java加载密钥时,抛出异常InvalidKeyException:Illegalkeysize受到美国法律的约束,早期Java的运行时限制了JCE支持的密钥长度,即默认不支持256位的AES。解决的方法有三......
  • Golang-微服务-紧急升级-缓存
    1.背景API服务器timewait一直下不去尝试阿里云优化方案,修改内核配置,也不管用前端表现为:页面访问卡顿页面丢失(接口504)Postmanstart_trasfer参数忽高忽......
  • Vscode golang初始化配置
    1、下载安装GO插件2、写代码时vscode提示你需要安装go插件,点击installall进行安装如果安装失败,原因是有道墙,解决方法是,配置国内源如下:goenv-wGO111MODULE=ongoe......
  • 微信小程序日期时间选择器(年月日时分秒)
    笔者这几天也被这个给烦到了,要有一个选择年月日时分秒的选择器,一开始采用的是vantUI的时间选择器,功能是实现了,但是会出现安卓机卡顿的情况,改来改去都不行最终选择放弃。发......