调用PayPal Disputes API提交文件时返回INVALID_EVIDENCE_FILE错误
问题分析与修复方案
你的代码核心问题在于MultipartFormDataContent的字段命名和结构不符合PayPal API要求,导致返回INVALID_EVIDENCE_FILE错误,具体问题和修复如下:
1. JSON元数据缺少指定name="input"
PayPal要求multipart请求中的JSON数据部分必须以input作为表单字段名,你的代码未设置该属性,导致API无法识别请求元数据。
2. 文件部分缺少name="file"和filename属性
文件内容的表单字段名必须固定为file,同时需要明确指定filename参数,否则PayPal无法正确解析文件的基本信息。
3. 空evidences列表不符合API规则
evidences数组不能为空,必须至少包含一个证据对象,指定evidence_type(如INVOICE、PROOF_OF_DELIVERY等)和必要的notes说明。
修复后的完整代码
using (var httpClient = new HttpClient()) { httpClient.DefaultRequestHeaders.Authorization = AuthenticationHeaderValue.Parse($"Bearer {auth.access_token}"); var form = new MultipartFormDataContent(); // 构造符合API要求的证据元数据 var evidenceData = new { evidences = new List<object> { new { evidence_type = "INVOICE", // 根据实际证据类型选择对应枚举值 notes = "上传的发票作为争议举证材料" } } }; string strData = JsonConvert.SerializeObject(evidenceData); // 设置JSON部分的表单字段名和内容类型 var jsonPart = new StringContent(strData, Encoding.UTF8, "application/json"); jsonPart.Headers.ContentDisposition = new ContentDispositionHeaderValue("form-data") { Name = "input" // 必须指定该字段名 }; form.Add(jsonPart); // 设置文件部分的表单字段名、文件名和内容类型 var byteContent = new ByteArrayContent(fileBytes); byteContent.Headers.ContentType = new MediaTypeHeaderValue("application/pdf"); byteContent.Headers.ContentDisposition = new ContentDispositionHeaderValue("form-data") { Name = "file", // 必须指定该字段名 FileName = fileNameWithExtension // 明确传入文件名 }; form.Add(byteContent); using (var response = await httpClient.PostAsync($"{BaseUrl()}{path}", form)) { strResponse = await response.Content.ReadAsStringAsync(); var statusCode = (int)response.StatusCode; if (statusCode is < 200 or >= 300) { throw new PaypalClientException(strResponse); } } }
额外注意事项
evidence_type必须使用PayPal允许的枚举值,比如PROOF_OF_SERVICE、TRACKING_INFO等,需根据实际举证类型选择。- 文件大小不能超过10MB,支持的格式包括PDF、JPG、PNG等。
- 确认沙箱环境的token令牌和端点地址配置正确,避免混淆生产环境参数。
内容的提问来源于stack exchange,提问作者Tom Gullen
相关产品推荐
相关产品推荐

