自定义请求失败
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
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
}
smartwalle commented
对的,这个方法昨天才添加的,先用master分支。