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

8 回复

是不是解析的 struct 有问题?
能有字段应该能表示是收到数据了, fiber 也能成功解析

更多关于Golang Go语言中为什么 fiber 无法解析 alipay 的 notify 回调的参数?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


打日志,对比返回的数据,而不是对比解析后的

struct 定义呢? tag 对不上吧?

最重要的 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回调参数的问题,通常可能是由以下几个原因引起的:

  1. 请求内容类型不匹配:确保Alipay发送的回调请求是application/x-www-form-urlencoded格式,这是Alipay notify回调常用的格式。如果请求头中的Content-Type不匹配,Fiber可能无法正确解析参数。

  2. 参数解析方式不当:Fiber默认使用ctx.FormValue等方法来解析表单数据。确保你在代码中正确使用了这些方法,并且参数名与Alipay发送的参数名完全一致。

  3. 字符编码问题:Alipay的回调数据通常使用UTF-8编码。如果编码设置不正确,可能会导致解析错误。检查你的服务器和Fiber框架的字符编码设置。

  4. 中间件干扰:如果你在Fiber中使用了中间件,确保它们没有干扰到请求体的读取。某些中间件可能会提前读取或修改请求体,导致后续解析失败。

  5. Alipay签名验证:在解析参数之前,通常需要先验证Alipay的签名。确保你的签名验证逻辑正确,并且使用了正确的公钥和算法。

解决这类问题通常需要检查请求头、请求体、字符编码以及参数解析逻辑等多个方面。如果上述方法都不能解决问题,建议查看Fiber和Alipay的官方文档,或者寻求来自Fiber社区或Alipay技术支持的帮助。

回到顶部