用Go开发WeChat接口的一个小坑

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用Go开发WeChat接口的一个小坑相关的知识,希望对你有一定的参考价值。


      年前公司接入了微信国际版的支付,当时WeChat Wallet本身的接口还没开发完(上几周WeChat Wallet

终于结束灰度全面开放了), 接入时踩了一大堆坑。 除了当时因为给的文档并不全或错误造成的一些困扰外,

 另外有个接口问题折磨了好一阵。


        当时有这样一个问题,当支付完成时,需要去WeChat支付后台查看支付状态。


但我依文档的JSON格式,加密和序列化后,提交给WeChat查单接口,老提示签名不对。


查询的规则很简单,前面支付的规则也是类似写法也没问题,按理查询不应当出现这种问题的。 


        后来在前端经验丰富的同事和微信那边开发的支持下才查出,原来问题出在JSON序列化上.


Go语言序列化会自动对一些特殊字符会作编码处理,而WeChat后台查询那边接口不会识别,


但WeChat支付那边的接口却能识别(估计是两组不同人马写的接口....).


先看个例子:

package main

/*

Author:xcl
Date:2016-2-10
*/

import (
"bytes"
"encoding/json"
"fmt"
"time"
)

type Query struct
AppID string `json:"AppID"`
Timestamp int64 `json:"Timestamp"`
Package string `json:"Package"`


func main()
MarshalDemo()


func MarshalDemo()
v := &Query
v.AppID = "testid"
v.Timestamp = time.Now().Unix()
v.Package = "xxcents=100&bank=666"

data, _ := json.Marshal(v)
fmt.Println("Marshal:", string(data))

data = bytes.Replace(data, []byte("\\\\u0026"), []byte("&"), -1)
data = bytes.Replace(data, []byte("\\\\u003c"), []byte("<"), -1)
data = bytes.Replace(data, []byte("\\\\u003e"), []byte(">"), -1)
data = bytes.Replace(data, []byte("\\\\u003d"), []byte("="), -1)

fmt.Println("处理后:", string(data))


/*
运行结果:
➜ wxjson : go run wxjson.go
Marshal: "AppID":"testid","Timestamp":1455111299,"Package":"xxcents=100\\u0026bank=666"
处理后: "AppID":"testid","Timestamp":1455111299,"Package":"xxcents=100&bank=666"
*/


​https://golang.org/pkg/encoding/json/​


String values encode as JSON strings coerced to valid UTF-8, replacing invalid bytes with the Unicode replacement rune. The angle brackets "<" and ">" are escaped to "\\u003c" and "\\u003e" to keep some browsers from misinterpreting JSON output as html. Ampersand "&" is also escaped to "\\u0026" for the same reason.




​ https://studygolang.com/static/pkgdoc/pkg/encoding_json.htm​


 字符串编码为json字符串。角括号"<"和">"会转义为"\\u003c"和"\\u003e"以避免某些浏览器吧json输出错误理解为HTML。基于同样的原因,"&"转义为"\\u0026"。



这就是造成签名错误的原因. 用Go开发这类接口时要注意这点.




以上是关于用Go开发WeChat接口的一个小坑的主要内容,如果未能解决你的问题,请参考以下文章

在golang中使用mongodb官方驱动用ID查询的一个小坑

[系列] Go - json.Unmarshal 遇到的小坑

微信小程序 之wx.getLocation()获取地理信息中的小坑

Map里遇到的小坑,掉进去两次

Mac OSX在eclipse里运行Go test 的一些小坑

小程序开发中的那些小坑