smartwalle/alipay

自定义请求失败

phpha opened this issue · 4 comments

phpha commented

背景

在对接支付宝医保支付,医保相关参数较多,目前 SDK 中封装的参数不够,所以采用自定义请求的方式。

接口

App 支付接口 alipay.trade.app.pay - TradeAppPay()

问题

请求参数最小化,使用 TradeAppPay() 可以成功,使用自定义请求失败。

代码

使用 TradeAppPay()

func (c *Client) TradeAppPay2() (output string, err error) {
	//
	output, err = c.client.TradeAppPay(alipay.TradeAppPay{
		Trade: alipay.Trade{
			OutTradeNo:  "2220231122151512703856",
			TotalAmount: "2.00",
			Subject:     "测试订单",
		},
	})
	return
}

单元测试:

=== RUN   TestClient_TradeAppPay2
"app_id=2021004124607751\u0026biz_content=%7B%22subject%22%3A%22%E6%B5%8B%E8%AF%95%E8%AE%A2%E5%8D%95%22%2C%22out_trade_no%22%3A%222220231122151512703856%22%2C%22total_amount%22%3A%222.00%22%2C%22product_code%22%3A%22%22%7D\u0026charset=utf-8\u0026format=JSON\u0026method=alipay.trade.app.pay\u0026sign=qigKGb2AbIbXU%2BNOGMN7YsbUrjLnHLsTdl4u6nYNSCzkYeqsOzPL0HzOUbK9S%2Bo6YglxQBmI4vtfYC13bJ858ncNJFsNbAXPF11FBPulmhzH00%2FsIK1lJ56ZUDe%2FN0e64vI2VVmiyrU9m2j9y09CPAL2G2H4An9UjmsihEbbVg0o8lwxwkwiqkK%2BqQQpN6vIQ%2FdfETv3rtWromf53k97Rd3PAwvRchTrt0rAq0BZis4oo7XoExwd%2BWcB%2BYCgPuPX9t4m5eh%2FBs%2FCeqwT2%2FKmX8XBYfolkEXTTdmrNT%2BP73qGBrVur0I5K6eINnsSvlfy45c8uAEd3M17gTMzOfzv4w%3D%3D\u0026sign_type=RSA2\u0026timestamp=2023-11-22+15%3A31%3A53\u0026version=1.0"
--- PASS: TestClient_TradeAppPay2 (0.00s)

自定义请求

// TradeAppPay alipay.trade.app.pay APP支付
func (c *Client) TradeAppPay() (output string, err error) {
	// 初始化
	p := alipay.NewPayload("alipay.trade.app.pay")
	// 业务参数
	p.AddBizField("out_trade_no", "2220231122151512703856")
	p.AddBizField("total_amount", "2.00")
	p.AddBizField("subject", "测试订单")
	p.AddBizField("product_code", "QUICK_MSECURITY_PAY")
	// 请求
	err = c.client.Request(p, &output)
	// 返回
	return
}

单元测试:

=== RUN   TestClient_TradeAppPay
    client_test.go:130: invalid character '<' looking for beginning of value
--- FAIL: TestClient_TradeAppPay (1.45s)

补充

看报错应该是请求支付宝网关返回异常,解析为 json 失败。

另外提个建议,SDK 是否能支持调试模式,把最原始的响应返回。

phpha commented

发现问题了,该接口是只用生成签名就行。


// 应用场景三:只需要对参数进行签名,如 App 支付(alipay.trade.app.pay)
var s, err = client.EncodeParam(p)
...

phpha commented

@smartwalle

client.EncodeParam(p) 木有找到呢…

phpha commented

参考 master 分支代码先能用再说,估计是代码没合并到 V3 吧。

func (c *Client) EncodeParam(param Param) (string, error) {
	p, err := c.URLValues(param)
	if err != nil {
		return "", err
	}
	return p.Encode(), nil
}

对的,这个方法昨天才添加的,先用master分支。