Golang Go语言中为什么 fiber 无法解析 alipay 的 notify 回调的参数?
我现在使用的是 go fiber ,我知道的是这家伙用的是 fasthttp 。
是这样的,我现在要解析支付宝返回来的回调。我发现 fiber 解析出来都是空的,但其它有两三个字段是有的:
{
"notify_time": null,
"notify_type": null,
"notify_id": null,
"app_id": null,
"charset": [
"utf-8"
],
"version": [
"1.0"
],
"sign_type": null,
"sign": [
"CPwn0wkSwa7qjV+k8/RHywHyPpL7kdmadp6QSZuw+NJe5vQ8vgKJHtLKMOA8RxPTY+BWhwEqN86F3RrDU0x6gj2UttN6qOauL4ZOer7KanWmmDEjnIR5YLqPibAbo8FyuCwtNQsUXsC8A8DxjfmJg5bTyEXxcF4UMFCvDfcC55eY+UVkcu0dt6KjLag+mUOMj/+PA5KBARkegfDi0yW4J78pv5Fgb9lD1u5bM9xEHDxOt1Xo6Jf63cnsWm5ccZ+cBQFQFKr4mSUAp0gIP1o1kzvUVJqr9ISK2HFGK8ED26OjuH8bWrtcepd08I8MxvZ170oRP1in9Hpk8wEwDZjyqw=="
],
"trade_no": null,
"out_trade_no": null,
"out_biz_no": null,
"buyer_id": null,
"buyer_logon_id": null,
"trade_status": null
}
fiber 的代码如下:
var input common.AlipayNotifyResponse
if err := c.BodyParser(&input); err != nil {
fmt.Println("failed to parse JSON input")
return errors.New("failed to parse JSON input")
}
然后我就怀疑是 fiber 的问题,试了一下用原生的 net/http 写:
func handlePost(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Access-Control-Allow-Origin", "*")
w.Header().Set("Access-Control-Allow-Headers", "*")
r.ParseForm()
fmt.Println(utils.PrettyJson(r.Form))
}
发现是可以解析的:
{
"app_id": [
"902100sdff"
],
"auth_app_id": [
"902100sdff"
],
"buyer_id": [
"902100sdff"
],
"buyer_pay_amount": [
"8.00"
],
"charset": [
"utf-8"
],
"fund_bill_list": [
"[{\"amount\":\"8.00\",\"fundChannel\":\"ALIPAYACCOUNT\"}]"
],
"gmt_create": [
"2023-08-06 17:48:28"
],
"gmt_payment": [
"2023-08-06 17:48:33"
],
"invoice_amount": [
"8.00"
],
"notify_id": [
"202308060122217483409dd7380500601571"
],
"notify_time": [
"2023-08-06 17:48:34"
],
}
现在已经有好几个接口用 fiber 写好了,不太想大改。就想问问为什么 fiber 会解析不了?有没有哪里是我要注意的
Golang Go语言中为什么 fiber 无法解析 alipay 的 notify 回调的参数?
更多关于Golang Go语言中为什么 fiber 无法解析 alipay 的 notify 回调的参数?的实战教程也可以访问 https://www.itying.com/category-94-b0.html
是不是解析的 struct 有问题?
能有字段应该能表示是收到数据了, fiber 也能成功解析
更多关于Golang Go语言中为什么 fiber 无法解析 alipay 的 notify 回调的参数?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
打日志,对比返回的数据,而不是对比解析后的
最重要的 common.AlipayNotifyResponse 呢?
忘放了<br>type AlipayNotifyResponse struct {<br> NotifyTime string `json:"notify_time"`<br> NotifyType string `json:"notify_type"`<br> NotifyId string `json:"notify_id"`<br> AppId string `json:"app_id"`<br> Charset string `json:"charset"`<br> Version string `json:"version"`<br> SignType string `json:"sign_type"`<br> Sign string `json:"sign"`<br> TradeNo string `json:"trade_no"`<br> OutTradeNo string `json:"out_trade_no"`<br> OutBizNo string `json:"out_biz_no"`<br> BuyerId string `json:"buyer_id"`<br> BuyerLogonId string `json:"buyer_logon_id"`<br> TradeStatus string `json:"trade_status"`<br>}<br><br>字段类型看的支付宝的文档:<br><a target="_blank" href="https://opendocs.alipay.com/open/203/105286/" rel="nofollow noopener">https://opendocs.alipay.com/open/203/105286/</a><br><br><br>
struct 里的 tag 用 form
非常感谢。用 form 就可以了。我刚才打印了一下,才发现是用的 application/x-www-form-urlencoded; charset=utf-8
在Golang中使用Fiber框架时,如果遇到无法解析Alipay的notify回调参数的问题,通常可能是由以下几个原因引起的:
-
请求内容类型不匹配:确保Alipay发送的回调请求是
application/x-www-form-urlencoded
格式,这是Alipay notify回调常用的格式。如果请求头中的Content-Type
不匹配,Fiber可能无法正确解析参数。 -
参数解析方式不当:Fiber默认使用
ctx.FormValue
等方法来解析表单数据。确保你在代码中正确使用了这些方法,并且参数名与Alipay发送的参数名完全一致。 -
字符编码问题:Alipay的回调数据通常使用UTF-8编码。如果编码设置不正确,可能会导致解析错误。检查你的服务器和Fiber框架的字符编码设置。
-
中间件干扰:如果你在Fiber中使用了中间件,确保它们没有干扰到请求体的读取。某些中间件可能会提前读取或修改请求体,导致后续解析失败。
-
Alipay签名验证:在解析参数之前,通常需要先验证Alipay的签名。确保你的签名验证逻辑正确,并且使用了正确的公钥和算法。
解决这类问题通常需要检查请求头、请求体、字符编码以及参数解析逻辑等多个方面。如果上述方法都不能解决问题,建议查看Fiber和Alipay的官方文档,或者寻求来自Fiber社区或Alipay技术支持的帮助。