如何解决C#调用支付API时出现的400‘存在验证错误’问题?
调用支付API出现400验证错误的排查方案
以下是针对你遇到问题的几个排查方向和解决方法:
数据类型不匹配
支付API通常要求amount为数值类型,但你的代码里将其定义为string并传入字符串"1000"。如果Postman中传的是数字1000,就会导致代码请求的格式不符合API验证规则。
解决:把Root类的amount字段改为decimal或int类型,赋值时直接用数值(比如1000)而非字符串。RestSharp请求体处理不当
手动用Newtonsoft序列化对象后通过AddParameter添加请求体,可能导致RestSharp对JSON进行额外编码,或者格式处理出错。RestSharp本身支持直接序列化对象,不需要手动处理。
解决:删掉手动序列化的代码,用request.AddJsonBody(rootObj)替代AddParameter,让RestSharp自动完成JSON序列化和请求头设置。字段值有效性问题
- 检查
EmailV变量:如果它是空值、格式错误(比如缺少@符号),会触发API的验证错误。 - 确认
transaction_ref是否唯一:很多支付API要求交易号不能重复,如果你多次用同一个transaction_ref发起请求,会被拦截。可以用Guid.NewGuid().ToString()生成唯一值。 - 验证
callback_url:确保它符合API要求,比如必须是HTTPS链接、没有特殊字符等。
- 检查
冗余请求头导致冲突
使用AddJsonBody时,RestSharp会自动添加Content-Type: application/json请求头,手动添加可能导致格式冲突,建议移除手动设置的该请求头。
修改后的示例代码
public class Root { public decimal amount { get; set; } // 改为数值类型 public string email { get; set; } public string currency { get; set; } public string initiate_type { get; set; } public string transaction_ref { get; set; } public string callback_url { get; set; } } var client = new RestClient("https://sandbox-api-d.squadco.com/transaction/initiate"); var rootObj = new Root { amount = 1000, // 直接传入数值 email = EmailV, currency = "NGN", initiate_type = "inline", transaction_ref = Guid.NewGuid().ToString("N"), // 生成唯一交易参考号 callback_url = "https://samplesite.com" }; var request = new RestRequest(); request.Method = Method.Post; request.AddHeader("Authorization", "sandbox_sk_3fae7c45922315aa8cb2a16db028f50a596d5fbdf351"); request.AddJsonBody(rootObj); // 自动处理JSON序列化和Content-Type RestResponse response = client.Execute(request);
内容的提问来源于stack exchange,提问作者Emeka Okoye
相关产品推荐
相关产品推荐

