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
相关产品推荐
相关产品推荐

