我正在开发一个当前使用 GrapQL 的项目。我正在集成一个支付处理器,当用户支付成功时,支付处理器会向 webhook URL 发送一个 POST 请求,该 URL 旨在指向我的服务器。现在我想知道如何实现这一目标,考虑到 GraphQL 仅公开一个端点(在我的例子中
/graphql
)。如何捕获传入的 POST 请求?为了更好的上下文,
如果我使用 REST API,则在成功付款后,Webhook 会向
/payment/verify
发送包含付款数据的 POST 请求。但是,如何使用 GraphQL 服务器实现此目的,将数据从 webhook 直接获取到 GraphQL 服务器中的解析器?谢谢您,期待您的回复。
除非支付处理器发送的post请求符合graphql请求的形式。请求负载必须满足标准 GraphQL AST。只有这样,服务器端的 GraphQL 才能解析 AST,进行 validation 和 execution 工作。
GraphQL 发布请求表单为:
require('isomorphic-fetch');
fetch('http://localhost:4000', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ query: `
query {
todos {
edges {
node {
completed
id
text
}
}
}
}`
}),
})
.then(res => res.json())
.then(res => console.log(res.data));
您可以创建额外的路由和端点来用作Webhooks,但更好的方法是将Webhooks功能提取到独立的服务中。连接数据库,执行业务逻辑,处理数据。
您的 GraphQL API 服务器只有一个端点
/graphql
用于 API 网关服务。 webhook 服务是后端服务之一。
是的,简短的回答是不可能。
要接收 Webhook,您需要一个具有特定正文的 POST HTTP 端点,而 graphql 使用了不同的正文格式,以“查询或突变”开头,并需要它特定的响应,例如:
mutation CreateReviewForEpisode($ep: Episode!, $review: ReviewInput!) {
createReview(episode: $ep, review: $review) {
stars
commentary
}
}
并且不可能以简单的方式进行映射。
我的建议是创建一个简单的 HTTP 端点来接收 webwook 请求
例如,使用 NestJS(这是我最喜欢的后端框架),您可以创建它。
$ nest g resource web-hook
你会收到...
您可以像这样指定您的端点:
@Controller("webhooks")
export class WebhooksController {
constructor(private readonly webhooksService: WebhooksService) {}
@Post("/order-payment/khipu")
confirmPayment(@Body() confirmPaymentInput: ConfirmPaymentInput) {
return this.webhooksService.confirmPayment(confirmPaymentInput);
}
}
确认付款输入在哪里
export class ConfirmPaymentInput {
@IsString()
notification_token: string;
}
这样,您就可以接收 Webhook 的有效负载。