为什么我的Java服务器代码在尝试从Stripe接收Webhook时抛出502错误?

时间:2019-07-25 15:58:03

标签: java stripe-payments webhooks

当我尝试将Webhook发送到服务器时,我一直收到此错误消息。

a

<html><body><h1>502 Bad Gateway</h1>
The server returned an invalid or incomplete response.
</body></html>

我的api的完整网址为http://localhost:8081/api。 我正在使用ngrok将此URL隧道传输到Internet。结果网址为https://75bb9fa8.ngrok.iohttp://75bb9fa8.ngrok.io 在Stripe仪表板中,我创建了一个Webhook,并将端点设置为https://75bb9fa8.ngrok.io/api/webhooks/webhook,因为这是我接收Webhook的服务器方法的完整URL和路径。 Webhook.JPG

这是我完整的webhook接收器类。它基于https://stripe.com/docs/webhooks/setup ...

package org.groundlist.core.services;

import java.util.Optional;

import javax.ws.rs.POST;
import javax.ws.rs.Path;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.google.gson.JsonSyntaxException;
import com.stripe.model.Event;
import com.stripe.model.EventDataObjectDeserializer;
import com.stripe.model.StripeObject;
import com.stripe.net.ApiResource;

import spark.Request;
import spark.Response;

@Path("/webhooks")
public final class WebhookService {
    private static final Logger LOGGER = LoggerFactory.getLogger(WebhookService.class);

    public WebhookService() {
    }

    // Retrieve webhook endpoint's signing secret
    final String endpointSecret = "whsec_4S4Htm9f2qU8llC70kDRP0AkP5Fl6gkx";

    // Using the Spark framework (http://sparkjava.com)
    @POST
    @Path("/webhook")
    public Object handle(RequestResponse requestresponse) {
        Request request = requestresponse.request;
        Response response = requestresponse.response;
        String payload = request.body();
        Event event = null;

        try {
            event = ApiResource.GSON.fromJson(payload, Event.class);
        } catch (JsonSyntaxException e) {
            // Invalid payload
            response.status(400);
            return "";
        }

        // Deserialize the nested object inside the event
        EventDataObjectDeserializer dataObjectDeserializer = event.getDataObjectDeserializer();
        Optional<StripeObject> stripeObject = null;
        if (dataObjectDeserializer.getObject().isPresent()) {
            stripeObject = dataObjectDeserializer.getObject();
        } else {
            // Deserialization failed, probably due to an API version mismatch.
            // Refer to the Javadoc documentation on `EventDataObjectDeserializer` for
            // instructions on how to handle this case, or return an error here.
        }

        // Handle the event
        switch (event.getType()) {
        case "customer.created":
            System.out.println("customer created webhook");
            break;
        default:
            // Unexpected event type
            response.status(400);
            return "";
        }

        response.status(200);
        return "";
    }

    public static class RequestResponse {
        Response response;
        Request request;
    }
}

为了完整起见,这是我的服务器日志...

2019-07-25 03:09:01.997 DESKTOP-2AB6RK0 com.dieselpoint.dieseljax.server.Server$Builder 766  INFO  Initializing server at http://192.168.1.91:8081/ in C:\Users\User\Documents\Work\Dieselpoint\groundlist\groundlist.core\.
2019-07-25 03:09:02.024 DESKTOP-2AB6RK0 org.eclipse.jetty.util.log 793  INFO  Logging initialized @1511ms to org.eclipse.jetty.util.log.Slf4jLog
2019-07-25 03:09:02.366 DESKTOP-2AB6RK0 org.eclipse.jetty.server.Server 1135 INFO  jetty-9.4.12.v20180830; built: 2018-08-30T13:59:14.071Z; git: 27208684755d94a92186989f695db2d7b21ebc51; jvm 1.8.0_191-b12
2019-07-25 03:09:03.619 DESKTOP-2AB6RK0 org.hibernate.validator.internal.util.Version 2388 INFO  HV000001: Hibernate Validator 6.0.11.Final
2019-07-25 03:09:04.038 DESKTOP-2AB6RK0 org.eclipse.jetty.server.handler.ContextHandler 2807 INFO  Started o.e.j.s.ServletContextHandler@402f80f5{/,null,AVAILABLE}
2019-07-25 03:09:04.296 DESKTOP-2AB6RK0 org.eclipse.jetty.server.AbstractConnector 3065 INFO  Started ServerConnector@5c909414{HTTP/1.1,[http/1.1]}{0.0.0.0:8081}
2019-07-25 03:09:04.297 DESKTOP-2AB6RK0 org.eclipse.jetty.server.Server 3066 INFO  Started @3787ms
2019-07-25 03:09:35.763 DESKTOP-2AB6RK0 com.dieselpoint.dieseljax.server.ExceptionMappers$OtherExceptionMapper 34532 ERROR java.lang.NullPointerException
java.lang.NullPointerException: null
    at org.groundlist.core.services.WebhookService.handle(WebhookService.java:36)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.glassfish.jersey.server.model.internal.ResourceMethodInvocationHandlerFactory.lambda$static$0(ResourceMethodInvocationHandlerFactory.java:52)
    at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher$1.run(AbstractJavaResourceMethodDispatcher.java:124)
    at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.invoke(AbstractJavaResourceMethodDispatcher.java:167)
    at org.glassfish.jersey.server.model.internal.JavaResourceMethodDispatcherProvider$ObjectOutInvoker.doDispatch(JavaResourceMethodDispatcherProvider.java:192)
    at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.dispatch(AbstractJavaResourceMethodDispatcher.java:79)
    at org.glassfish.jersey.server.model.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:469)
    at org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:391)
    at org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:80)
    at org.glassfish.jersey.server.ServerRuntime$1.run(ServerRuntime.java:253)
    at org.glassfish.jersey.internal.Errors$1.call(Errors.java:248)
    at org.glassfish.jersey.internal.Errors$1.call(Errors.java:244)
    at org.glassfish.jersey.internal.Errors.process(Errors.java:292)
    at org.glassfish.jersey.internal.Errors.process(Errors.java:274)
    at org.glassfish.jersey.internal.Errors.process(Errors.java:244)
    at org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:265)
    at org.glassfish.jersey.server.ServerRuntime.process(ServerRuntime.java:232)
    at org.glassfish.jersey.server.ApplicationHandler.handle(ApplicationHandler.java:679)
    at org.glassfish.jersey.servlet.WebComponent.serviceImpl(WebComponent.java:392)
    at org.glassfish.jersey.servlet.WebComponent.service(WebComponent.java:346)
    at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:365)
    at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:318)
    at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:205)
    at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:873)
    at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:542)
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:146)
    at org.eclipse.jetty.server.handler.gzip.GzipHandler.handle(GzipHandler.java:703)
    at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:132)
    at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:257)
    at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1345)
    at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:203)
    at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:480)
    at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:201)
    at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1247)
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:144)
    at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:132)
    at org.eclipse.jetty.server.Server.handle(Server.java:505)
    at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:370)
    at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:267)
    at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:305)
    at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:103)
    at org.eclipse.jetty.io.ChannelEndPoint$2.run(ChannelEndPoint.java:117)
    at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:765)
    at org.eclipse.jetty.util.thread.QueuedThreadPool$2.run(QueuedThreadPool.java:683)
    at java.lang.Thread.run(Unknown Source)
2019-07-25 03:09:35.911 DESKTOP-2AB6RK0 org.glassfish.jersey.server.ServerRuntime$Responder 34680 ERROR Error occurred when processing a response created from an already mapped exception.
2019-07-25 03:09:35.916 DESKTOP-2AB6RK0 org.eclipse.jetty.server.HttpChannel 34685 WARN  /api/webhooks/webhook
javax.servlet.ServletException: org.glassfish.jersey.server.ContainerException: java.lang.NoSuchMethodError: org.eclipse.jetty.util.BufferUtil.remaining([Ljava/nio/ByteBuffer;)J
    at org.glassfish.jersey.servlet.WebComponent.serviceImpl(WebComponent.java:408)
    at org.glassfish.jersey.servlet.WebComponent.service(WebComponent.java:346)
    at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:365)
    at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:318)
    at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:205)
    at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:873)
    at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:542)
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:146)
    at org.eclipse.jetty.server.handler.gzip.GzipHandler.handle(GzipHandler.java:703)
    at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:132)
    at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:257)
    at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1345)
    at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:203)
    at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:480)
    at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:201)
    at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1247)
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:144)
    at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:132)
    at org.eclipse.jetty.server.Server.handle(Server.java:505)
    at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:370)
    at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:267)
    at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:305)
    at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:103)
    at org.eclipse.jetty.io.ChannelEndPoint$2.run(ChannelEndPoint.java:117)
    at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:765)
    at org.eclipse.jetty.util.thread.QueuedThreadPool$2.run(QueuedThreadPool.java:683)
    at java.lang.Thread.run(Unknown Source)
Caused by: org.glassfish.jersey.server.ContainerException: java.lang.NoSuchMethodError: org.eclipse.jetty.util.BufferUtil.remaining([Ljava/nio/ByteBuffer;)J
    at org.glassfish.jersey.servlet.internal.ResponseWriter.rethrow(ResponseWriter.java:254)
    at org.glassfish.jersey.servlet.internal.ResponseWriter.failure(ResponseWriter.java:236)
    at org.glassfish.jersey.server.ServerRuntime$Responder.process(ServerRuntime.java:436)
    at org.glassfish.jersey.server.ServerRuntime$1.run(ServerRuntime.java:261)
    at org.glassfish.jersey.internal.Errors$1.call(Errors.java:248)
    at org.glassfish.jersey.internal.Errors$1.call(Errors.java:244)
    at org.glassfish.jersey.internal.Errors.process(Errors.java:292)
    at org.glassfish.jersey.internal.Errors.process(Errors.java:274)
    at org.glassfish.jersey.internal.Errors.process(Errors.java:244)
    at org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:265)
    at org.glassfish.jersey.server.ServerRuntime.process(ServerRuntime.java:232)
    at org.glassfish.jersey.server.ApplicationHandler.handle(ApplicationHandler.java:679)
    at org.glassfish.jersey.servlet.WebComponent.serviceImpl(WebComponent.java:392)
    ... 26 common frames omitted
Caused by: java.lang.NoSuchMethodError: org.eclipse.jetty.util.BufferUtil.remaining([Ljava/nio/ByteBuffer;)J
    at org.eclipse.jetty.io.WriteFlusher.flush(WriteFlusher.java:392)
    at org.eclipse.jetty.io.WriteFlusher.write(WriteFlusher.java:277)
    at org.eclipse.jetty.io.AbstractEndPoint.write(AbstractEndPoint.java:380)
    at org.eclipse.jetty.server.HttpConnection$SendCallback.process(HttpConnection.java:814)
    at org.eclipse.jetty.util.IteratingCallback.processing(IteratingCallback.java:241)
    at org.eclipse.jetty.util.IteratingCallback.iterate(IteratingCallback.java:224)
    at org.eclipse.jetty.server.HttpConnection.send(HttpConnection.java:550)
    at org.eclipse.jetty.server.HttpChannel.sendResponse(HttpChannel.java:845)
    at org.eclipse.jetty.server.HttpChannel.write(HttpChannel.java:921)
    at org.eclipse.jetty.server.HttpOutput.write(HttpOutput.java:249)
    at org.eclipse.jetty.server.HttpOutput.write(HttpOutput.java:225)
    at org.eclipse.jetty.server.HttpOutput.write(HttpOutput.java:550)
    at org.glassfish.jersey.servlet.internal.ResponseWriter$NonCloseableOutputStreamWrapper.write(ResponseWriter.java:301)
    at java.io.ByteArrayOutputStream.writeTo(Unknown Source)
    at org.glassfish.jersey.message.internal.CommittingOutputStream.flushBuffer(CommittingOutputStream.java:278)
    at org.glassfish.jersey.message.internal.CommittingOutputStream.commit(CommittingOutputStream.java:232)
    at org.glassfish.jersey.message.internal.CommittingOutputStream.close(CommittingOutputStream.java:247)
    at org.glassfish.jersey.message.internal.OutboundMessageContext.close(OutboundMessageContext.java:824)
    at org.glassfish.jersey.server.ContainerResponse.close(ContainerResponse.java:389)
    at org.glassfish.jersey.server.ServerRuntime$Responder.writeResponse(ServerRuntime.java:710)
    at org.glassfish.jersey.server.ServerRuntime$Responder.processResponse(ServerRuntime.java:371)
    at org.glassfish.jersey.server.ServerRuntime$Responder.process(ServerRuntime.java:417)
    ... 36 common frames omitted

我做错了什么? 谢谢。 也许问题与我的webhook方法的参数有关。 @POST和@Path批注要求该方法仅将单个JSON对象作为参数。但是,Webhook可能正在发送两个单独的参数-请求对象和响应对象。如果您认为这种不一致是问题的根源,那么我该如何重构服务器代码以适应Webhook的结构?

1 个答案:

答案 0 :(得分:0)

您可以尝试将其添加到path参数下

@Consumes("application/x-www-form-urlencoded")

因为标头身份验证关系