Go-生成小程序带参数二维码(指定跳转路径)

// PostPathSence 生成并上传OSS小程序带参数二维码
func PostPathSence(token, sence, fileName, page string) (string, error) {
	if len(token) == 0 || len(sence) == 0 {
		log.WithFields(log.Fields{
			"error": "参数为空",
			"token": token,
			"sence": sence,
		}).Warn("PostScene")

		return "", errors.New("参数为空-PostScene")
	}

	url := fmt.Sprintf(CREATE_QRCODE_URL, token)
	senceStruct := SenceRule{
		Scene: sence,
		Width: 430,
		Page:  page,
	}

	jsonBody, jsonErr := json.Marshal(senceStruct)
	if jsonErr != nil {
		log.WithFields(log.Fields{"error": jsonErr}).Warn("JSON加密-PostScene")
		return "", jsonErr
	}

	postBody, postErr := http.Post(url, "application/json; charset=utf-8", bytes.NewReader(jsonBody))
	if postErr != nil {
		log.WithFields(log.Fields{"error": postErr}).Warn("POST提交-PostScene")
		return "", postErr
	}

	defer postBody.Body.Close()
	imagePath := "user/qrcodeId/" + fileName
	uuid := global.GetUUID()
	localPath, localPathErr := GetLocalPath("/public/upload/qrcode-xcx/")
	if localPathErr != nil || len(localPath) == 0 {
		log.WithFields(log.Fields{"error": postErr}).Warn("本地路径-PostScene")
		return "", postErr
	}

	localPath += uuid + ".jpg"
	switch header := postBody.Header.Get("Content-Type"); {
	case strings.HasPrefix(header, "application/json"):
		tokenResp := ReturnBodyRule{}
		decoder := json.NewDecoder(postBody.Body)
		if decodeErr := decoder.Decode(&tokenResp); decodeErr == nil {
			log.WithFields(log.Fields{"error": decodeErr, "token": tokenResp}).Warn("json解密-PostScene")
			return "", decodeErr
		}
	case strings.HasPrefix(header, "image"):
		reply, readAllErr := ioutil.ReadAll(postBody.Body)
		if readAllErr != nil {
			log.WithFields(log.Fields{"error": readAllErr}).Warn("读取返回数据-PostScene")
			return "", jsonErr
		}

		imageContent, createErr := os.Create(localPath)
		if createErr != nil {
			log.WithFields(log.Fields{"error": createErr, "imageContent": imageContent}).Warn("打开本地文件-PostScene")
			return "", createErr
		}

		writeStringRes, writeStringErr := io.WriteString(imageContent, string(reply))
		if writeStringErr != nil {
			log.WithFields(log.Fields{"error": writeStringErr, "writeStringRes": writeStringRes}).Warn("写入本地文件-PostScene")
			return "", writeStringErr
		}

		closeErr := imageContent.Close()
		if closeErr != nil {
			log.WithFields(log.Fields{"error": closeErr}).Warn("关闭本地文件-PostScene")
			return "", closeErr
		}
	default:
		log.WithFields(log.Fields{"error": header}).Warn("响应头获取-PostScene")
		return "", errors.New("响应头获取失败-PostScene")
	}

	ossFilePath, ossFileErr := UploadOssFile(localPath, imagePath)
	return ossFilePath, ossFileErr
}

接口地址:

const CREATE_QRCODE_URL = "https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=%s"

相关结构体:

// SenceRule 带参数二维码
type SenceRule struct {
	Scene     string `json:"scene"`
	Page      string `json:"page,omitempty"`
	Width     int    `json:"width,omitempty"`
	AutoColor bool   `json:"auto_color,omitempty"`
	LineColor string `json:"line_color,omitempty"`
	IsHyaline bool   `json:"is_hyaline,omitempty"`
}

// BufferRule 图片buffer
type BufferRule struct {
	Buffer []byte `json:"Buffer"`
}

// ReturnBodyRule 微信返回通过结果集
type ReturnBodyRule struct {
	ErrorCode    int    `json:"errcode,omitempty"`
	ErrorMessage string `json:"errmsg,omitempty"`
}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

luyaran

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值