// 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"`
}