smartwalle / alipay

支付宝 AliPay SDK for Go, 集成简单,功能完善,持续更新,支持公钥证书和普通公钥进行签名和验签,支持文件上传和接口内容加密。
MIT License
1.87k stars 425 forks source link

自定义请求失败 #182

Closed phpha closed 11 months ago

phpha commented 11 months ago

背景

在对接支付宝医保支付,医保相关参数较多,目前 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 11 months ago

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


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

phpha commented 11 months ago

@smartwalle

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

phpha commented 11 months ago

参考 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 11 months ago

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