go-pay / gopay

微信、支付宝、通联支付、拉卡拉、PayPal、Apple 的Go版本SDK。【极简、易用的聚合支付SDK】

Home Page:https://github.com/go-pay/gopay

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

/v3/ecommerce/account/cancel-applications/media 图片Content-Type非法

githubzhaoqian opened this issue · comments

/v3/ecommerce/account/cancel-applications/media
电商平台服务商调用注销申请接口时,需要先调用本接口上传相关的资料图片,获取图片ID后,再填写到注销申请请求中。
文档

func (c *ClientV3) CancelApplicationsMedia(ctx context.Context, fileName, fileSha256 string, img *gopay.File) (wxRsp *CancelApplicationsMediaRsp, err error) {
	bmFile := make(gopay.BodyMap)
	//bmFile.SetBodyMap("meta", func(bmFile gopay.BodyMap) {
	//	bmFile.Set("file_name", fileName).Set("file_digest", fileSha256)
	//})
	bmFile.Set("file_name", fileName).Set("file_digest", fileSha256)
	authorization, err := c.authorization(MethodPost, v3CancelApplicationsMedia, bmFile)
	if err != nil {
		return nil, err
	}
	bm := make(gopay.BodyMap)
	bm.SetBodyMap("meta", func(bm gopay.BodyMap) {
		bm.Set("file_name", fileName).Set("file_digest", fileSha256)
	}).SetFormFile("file", img)
	res, si, bs, err := c.doProdPostFile(ctx, bm, v3CancelApplicationsMedia, authorization)

}

按着文档修改了参数但是提示 {"code":"INVALID_REQUEST","message":"图片Content-Type非法"}试着其他修改也没有变化,也没看出来除参数外和其他上传有什么不同

func TestCancelApplicationsMedia(t *testing.T) {
	fileName := "id_copy.jpg"
	fileContent, err := os.ReadFile("/Users/mac/Downloads/id_copy.jpg")
	if err != nil {
		logx.Error(err)
		return
	}
	h := sha256.New()
	h.Write(fileContent)
	sha256Str := hex.EncodeToString(h.Sum(nil))
	logx.Debug("sha256:", sha256Str)

	img := &gopay.File{
		Name:    fileName,
		Content: fileContent,
	}
	wxRsp, err := client.CancelApplicationsMedia(ctx, fileName, sha256Str, img)
	if err != nil {
		logx.Error(err)
		return
	}
	logx.Errorf("wxRsp:%v", wxRsp)
}

CancelApplicationsMedia换成包里的V3MediaUploadImage方法是可以成功的,也是复制V3MediaUploadImage方法改的CancelApplicationsMedia方法

找到原因了

/v3/ecommerce/account/cancel-applications/media 这个接口验证了文件的传输文件的Content-Type,
golang multipart.Writer 的CreateFormFile 方法默认设置的是Set("Content-Type", "application/octet-stream"),就通不过接口的验证,可以重写CreateFormFile方法 h.Set("Content-Type", http.DetectContentType(file.Content[:512]))获取文件默认的contentType,我是将gopay的EndBytes复制了一份修改的