smartwalle / alipay

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

"自定义请求"如何上传文件 #168

Closed aidevjoe closed 1 year ago

aidevjoe commented 1 year ago

请教一下,使用"自定义请求"参数涉及到文件时,一直报错"PARAM_ILLEGAL | 入参不合法"

支付宝文档

商户上传处理图片

实现

func UploadImage(file *multipart.FileHeader, app ApplicationType) (*ImageUploadResponse, error) {
    client, err := client(app)
    if err != nil {
        return nil, err
    }
    fileExt := path.Ext(file.Filename)

    // 读取文件。
    f, openError := file.Open()
    if openError != nil {
        return nil, errors.New("function file.Open() Failed, err:" + openError.Error())
    }
    defer f.Close()
    fileContents, err := ioutil.ReadAll(f)
    if err != nil {
        return nil, err
    }

    p := alipay.NewPayload("alipay.merchant.image.upload")

    p.Set("image_type", strings.TrimLeft(strings.ToLower(fileExt), "."))
    p.Set("image_content", fileContents)

    var result ImageUploadResponse
    err = client.Request(p, &result)
    if err != nil {
        return nil, err
    }
    if !result.IsSuccess() {
        return nil, errors.New(result.SubMsg)
    }
    return &result, nil
}
smartwalle commented 1 year ago

可以使用 v3.2.13 版本,参照 https://github.com/smartwalle/alipay#%E6%96%87%E4%BB%B6%E4%B8%8A%E4%BC%A0

aidevjoe commented 1 year ago

使用商家上传接口还是无法上传,但是示例中的上传接口可以。发现上传成功后文件ID是通用的,也算解决了。感谢🙏

smartwalle commented 1 year ago

我测试 https://opendocs.alipay.com/mini/02ctgk?pathHash=c08922b1 这个接口是可以的,你再确认一下是不是权限的问题。

smartwalle commented 1 year ago

https://opendocs.alipay.com/open/03kt9z?pathHash=691129f6 这个接口也可以

aidevjoe commented 1 year ago

应该不是权限问题,「交易支付投诉处理」API中除了上传图片接口失败,其他都可以,所以可以排除权限问题

smartwalle commented 1 year ago

我小程序没有这个权限,没有网页应用可以测试。你的返回结果是什么?

aidevjoe commented 1 year ago

之前版本和最新版本都是返回 PARAM_ILLEGAL | 入参不合法

aidevjoe commented 1 year ago

我看了下小程序也有这个权限,

image
smartwalle commented 1 year ago

企业账号才有,我是个人账号,你添加这个权限试试

aidevjoe commented 1 year ago

已经勾选了,不然其他接口也调用不了。截图中是另外一个应用。

smartwalle commented 1 year ago

md,我找到原因了,biz_content 这个字段,其它接口没有值的时候可以传 {},就这个接口不行。