一、场景
调用 微信小程序码生成接口 报错:
invalid scene rid: f05f96ab-5382f139-14b13d2f
二、分析
1、百度翻译
- 百度翻译一下为:
无效的场景rid
,可能是我们的scene
参数的值格式错误
2、执行以下代码
package main
import (
"bytes"
"encoding/json"
"fmt"
"log"
)
func main() {
data := map[string]interface{
}{
"scence": "user_id=1&order_id=3",
}
transferMean(data)
//notTransferMean(data)
}
//转义
func transferMean(body map[string]interface{
}) {
var bodyJson []byte
if body != nil {
var err error
bodyJson, err = json.Marshal(body)
if err != nil {
log.Print(err)
}
}
fmt.Println(bytes.NewBuffer(bodyJson))
}
//不转义
func notTransferMean(body map[string]interface{
}) {
buffer := bytes.NewBuffer([]byte{
})
if body != nil {
jsonEncoder := json.NewEncoder(buffer)
jsonEncoder.SetEscapeHTML(false)
err := jsonEncoder.Encode(body)
if err != nil {
log.Print(err)
}
}
fmt.Println(buffer)
}
3、打印
{
"scence":"user_id=1\u0026order_id=3"}
Process finished with exit code 0
4、分析
- 我们可以看到符号
&
被转义成了\u0026
- 而我们的
scene
只支持最大32个可见字符,只支持数字,大小写英文以及部分特殊字符:!#$&'()*+,/:;=?@-._~,其它字符请自行编码为合法字符(因不支持%,中文无法使用 urlencode 处理,请使用其他编码方式)
- 很明显转义后的
\
并不包含在scene
中 - 所以我们要禁止
json.Marshal()方法 特殊字符转义
- 打开这行注释
//notTransferMean(data)
,即可得到结果如下:
{
"scence":"user_id=1\u0026order_id=3"}
{
"scence":"user_id=1&order_id=3"}
Process finished with exit code 0