Stripe支付请求数据无法传递至后端API的排查求助
问题根源:请求格式与接收方式不匹配
你遇到的核心问题是前端发送的是JSON格式数据,但后端用[FromForm]标注接收,两者完全不兼容,这就导致后端始终拿不到有效数据。
具体来说:
- 你的前端AJAX配置了
contentType: "application/json",明确告诉服务器要发送的是JSON字符串格式的请求体; - 但后端用
[FromForm]修饰参数,这是在告诉ASP.NET Core:"去表单数据(application/x-www-form-urlencoded或multipart/form-data格式)里解析参数",自然无法识别JSON格式的内容。
解决方案1:后端改用[FromBody]接收JSON数据(推荐)
这是最规范的做法,建议创建一个强类型模型来接收数据,比直接用JObject更安全、易维护:
第一步:创建请求模型类
public class StripePaymentRequest { // Stripe Token自带的核心字段 public string Id { get; set; } public string Email { get; set; } // 你的自定义字段 public int SubscriptionId { get; set; } public string City { get; set; } public string Postnr { get; set; } public string Mobil { get; set; } public string Adresse { get; set; } public string CVRVirksomhed { get; set; } }
第二步:修改后端接口接收方式
把[FromForm]改成[FromBody],并用上面的模型类接收参数:
[HttpPost] [Route("api/Stripe")] [Produces("application/json")] public async Task<IActionResult> Post([FromBody] StripePaymentRequest request) { // 先验证数据合法性 if (!ModelState.IsValid) { return BadRequest(ModelState); } var subscriptionId = request.SubscriptionId; // 后续支付处理逻辑(比如调用Stripe官方SDK完成扣款) return Ok("支付请求已接收,处理中"); }
解决方案2:前端调整为发送表单数据(不推荐,仅特殊场景用)
如果你一定要用[FromForm]接收,需要修改前端AJAX的配置,把JSON格式改成表单格式:
$.ajax({ type: "POST", url: "/api/Stripe", // 去掉contentType(默认就是表单格式),或者设置为"application/x-www-form-urlencoded" data: { id: token.id, email: token.email, subscriptionId: $('#SubscriptionId').val(), City: $('#City').val(), // 其他自定义字段... }, success: function (data) { alert(data + "Succes") }, error: function (data) { console.log(data + "Error"); }, dataType: 'json' });
⚠️ 注意:这种方式不适合处理嵌套结构的数据,Stripe Token本身可能包含嵌套字段,所以更推荐第一种方案。
额外排查点
- 打开浏览器开发者工具的Network标签,查看发送的请求体是否是完整的JSON,确认自定义字段都包含在内;
- 如果坚持用
JObject,可以把后端参数改成[FromBody] JObject token,也能正常接收,但强类型模型更利于代码维护; - 检查前端是否有跨域问题(如果前后端域名不同),不过你能发起请求的话大概率没问题。
内容的提问来源于stack exchange,提问作者J Petersen
相关产品推荐
相关产品推荐

