You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Loopback 4集成支付网关遇415不支持媒体类型错误求助

解决415 Unsupported Media Type错误:适配支付网关的表单提交格式

这个报错的原因很直白:你的支付网关是用application/x-www-form-urlencoded格式提交回调数据,但你的Loopback控制器默认只接收application/json类型的请求体,所以触发了415不支持媒体类型的错误。

下面是具体的修复方案:

1. 修改请求体配置,支持表单格式

你需要在@requestBody装饰器里明确声明支持表单格式,并把提交的字段映射到你的payment接口上。

首先确保导入Loopback的getModelSchemaRef工具(用来把TypeScript接口转换成JSON Schema,供表单解析使用):

import {getModelSchemaRef} from '@loopback/rest';

然后修改@requestBody的配置,添加表单格式的支持:

@requestBody({
  content: {
    'application/x-www-form-urlencoded': {
      schema: getModelSchemaRef(payment, {
        title: 'PaymentCallbackRequest',
        // 可选:如果这些字段是必填的,添加required数组确保校验
        required: ['razorpay_order_id', 'razorpay_payment_id', 'razorpay_signature']
      })
    }
  },
  // 额外:如果需要同时兼容JSON格式提交,可以保留下面的配置
  // content: {
  //   'application/json': {schema: getModelSchemaRef(payment)},
  //   'application/x-www-form-urlencoded': {schema: getModelSchemaRef(payment, {title: 'PaymentCallbackRequest'})}
  // }
})

2. 修改后的完整控制器代码

import {post, requestBody, inject} from '@loopback/rest';
import {RestBindings, Response} from '@loopback/rest';
import {getModelSchemaRef} from '@loopback/rest';

export interface payment {
  razorpay_order_id: string;
  razorpay_payment_id: string;
  razorpay_signature: string;
}

@post('/payment-check', {
  responses: {
    '200': {
      description: 'Verify signature',
    },
  },
})
async check(
  @requestBody({
    content: {
      'application/x-www-form-urlencoded': {
        schema: getModelSchemaRef(payment, {
          title: 'PaymentCallbackRequest',
          required: ['razorpay_order_id', 'razorpay_payment_id', 'razorpay_signature']
        })
      }
    }
  }) options: payment,
  @inject(RestBindings.Http.RESPONSE) response: Response
): Promise<any> {
  // 你的签名验证逻辑写在这里
  const query = /* 生成跳转查询参数的代码 */;
  response.redirect('http://192.168.43.147:8100/order-success/?' + query);
  return response; // 确保返回响应对象完成请求处理
}

原理说明

Loopback的@requestBody默认只启用JSON格式的解析器。通过显式添加application/x-www-form-urlencoded的内容配置,Loopback会自动启用对应的表单解析器,把网关提交的键值对转换为payment接口的实例,这样就能正常接收回调数据了。

内容的提问来源于stack exchange,提问作者pratik jaiswal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 22:32:59