加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-16 18:34:47 所属栏目:大数据 来源:网络整理
导读:年前公司接入了微信国际版的支付,当时WeChat Wallet本身的接口还没开发完(上几周WeChat Wallet 终于结束灰度全面开放了), 接入时踩了一大堆坑。 除了当时因为给的文档并不全或错误造成的一些困扰外, 另外有个接口问题折磨了好一阵。 当时有这样一个问题,

年前公司接入了微信国际版的支付,当时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("<"),[]byte("u003e"),[]byte(">"),[]byte("u003d"),[]byte("="),-1)

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

/*
运行结果:
?  wxjson  : go run wxjson.go
Marshal: {"AppID":"testid","Timestamp":1455111299,"Package":"xxcents=100u0026bank=666"}
处理后: {"AppID":"testid","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开发这类接口时要注意这点.


BLOG:http://blog.csdn.net/xcl168

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读