Hilfe bei Webservice / Webhook mit JAXRS

beta20

Top Contributor
Hallo,

ich versuche gerade einen Webhook zu implementieren, der mir Requests entgegen nimmt von Stripe (Zahlungsanbieter)
Ich habe derzeit folgendes implementiert:

Java:
@Path("/")
public class WebhhookStripe {

    @POST
    @Path("/webhook/PSPWebhooks/Stripe")
    @Consumes(MediaType.APPLICATION_JSON)
    @Produces(MediaType.APPLICATION_JSON)

    public ResponseBuilder getEvent(String json) {

        try {

            Event event = Event.GSON.fromJson(json, Event.class);
            System.out.println("Webhook event : " + event);
        }

        catch (Exception e) {
            LOGGER.error(ExceptionUtils.getFullStackTrace(e));
            return Response.serverError();
        }

        return Response.ok();
    }


Laut Doku hier ein Ausschnitt (dort wird aber Sparks verwendet)

Ich versuche den Webhook gerade mit deren Stripe CLI anzusprechen:

Das geht auch und ich komme im Debug Mode in die obere Methode rein.
Allerdings ist das "Event" NULL.... Ich denke irgendwas stimmt nicht mit dem Parameter?

Java:
@Path("/")

public class WebhhookStripe {

    @POST
    @Path("/webhook/PSPWebhooks/Stripe")
    @Consumes(MediaType.APPLICATION_JSON)
    @Produces(MediaType.APPLICATION_JSON)
    public ResponseBuilder getEvent(String json) {

Was mache ich falsch?
 
Zuletzt bearbeitet:
K

kneitzel

Gast
Hmm, ich kenne es von meinem Code (mit Spring Framework... also ggf. Spring typisch) eigentlich so, dass ich im Controller das Json selbst nicht bekomme sondern dies bereits ausgewertet ist. Daher würde ich da als Parameter nicht String erwarten sondern direkt ein Parameter vom Typ Event.

Und wenn das im Request Body kommt, dann ist da noch ein @RequestBody davor.

Vielleicht hilft Dir das ja etwas....
 

beta20

Top Contributor
Danke... Also ich habe es nun doch geschafft mit dem oberen Code... Ich hatte ein Problem mit der Stripe CLI....

Nun benötige ich aber noch eine Authentifizierung.
Das ist hier beschrieben....

Wie bekomme ich das "request" - Objekt her?
Ich habe nun folgendes versucht:

public Response getEvent(String json, HttpServletRequest request)


Und dann:
String payload = request.body();

Aber das Request - Objekt scheint nicht richtig zu sein:
The method body() is undefined for the type HttpServletRequest

Die Frage ist nun, wie bekomme ich den Request Body und Request Header?

Vielen Dank
 

mrBrown

Super-Moderator
Mitarbeiter
Ich hab's glaub ich schon X mal gesagt, aber du solltest dich wirklich ein bisschen mit Grundlagen des entsprechenden Frameworks beschäftigen, bevor du Kunden irgendwelche Zahlungen damit abwickeln lässt...

Nun benötige ich aber noch eine Authentifizierung.
Das ist hier beschrieben....
Build a webhook endpoint
Ne, das ist da nicht beschrieben.

Wie bekomme ich das "request" - Objekt her?
Ich habe nun folgendes versucht:

public Response getEvent(String json, HttpServletRequest request)


Und dann:
String payload = request.body();

Aber das Request - Objekt scheint nicht richtig zu sein:
The method body() is undefined for the type HttpServletRequest
Den Body des HttpServletRequest hast du bereits als ersten Parameter bekommen, den brauchst du nicht nochmal, der Code ist also sowieso Unsinn – abgesehen davon, dass er nicht kompilieren würde.


Wenn ich ganz ins Blaue raten müsste, würde ich sagen dass du eigentlich den aktuellen Nutzer haben möchtest, der in deiner Anwendung angemeldet ist?
 

mrBrown

Super-Moderator
Mitarbeiter
Hmm, ich kenne es von meinem Code (mit Spring Framework... also ggf. Spring typisch) eigentlich so, dass ich im Controller das Json selbst nicht bekomme sondern dies bereits ausgewertet ist. Daher würde ich da als Parameter nicht String erwarten sondern direkt ein Parameter vom Typ Event.

Und wenn das im Request Body kommt, dann ist da noch ein @RequestBody davor.
Das ist mit JAX-RS genauso, der Code oben wäre in üblichem Code einfach:

Java:
@Path("/")
public class WebhhookStripe {
    @POST
    @Path("/webhook/PSPWebhooks/Stripe")
    @Consumes(MediaType.APPLICATION_JSON)
    @Produces(MediaType.APPLICATION_JSON)
    public ResponseBuilder getEvent(Event event) {
        System.out.println("Webhook event : " + event);
        return Response.ok();
    }
}
 

beta20

Top Contributor
danke...

ich habe es nun so gelöst, was m.M. bisher erstmal funktioniert:

Java:
    @POST
    @Path("/webhook/PSPWebhooks/Stripe")
    @Consumes(MediaType.APPLICATION_JSON)
    @Produces(MediaType.APPLICATION_JSON)
    public Response getEvent(@Context HttpHeaders headers, String json) {

        LOGGER.info("START getEvent");

        try {

            Event event = Event.GSON.fromJson(json, Event.class);

            // Replace this endpoint secret with your endpoint's unique secret
            // If you are testing with the CLI, find the secret by running 'stripe listen'
            // If you are using an endpoint defined with the API or dashboard, look in your
            // webhook settings
            // at https://dashboard.stripe.com/webhooks
            String endpointSecret = "xxxxxx";

            String sigHeader = headers.getHeaderString("Stripe-Signature");
            if (endpointSecret != null && sigHeader != null) {
                // Only verify the event if you have an endpoint secret defined.
                // Otherwise use the basic event deserialized with GSON.
                try {
                    event = Webhook.constructEvent(json, sigHeader, endpointSecret);
                } catch (SignatureVerificationException e) {
                    // Invalid signature
                    System.out.println("Webhook error while validating signature.");
                    return Response.status(200).build();
                }
            }

            StripeObject stripeObject = null;

            // Deserialize the nested object inside the event
            EventDataObjectDeserializer dataObjectDeserializer = event.getDataObjectDeserializer();

            if (dataObjectDeserializer.getObject().isPresent()) {
                stripeObject = dataObjectDeserializer.getObject().get();
            } 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.

                return Response.status(Response.Status.NOT_FOUND).build();
            }

            if (event.getType().equals("charge.failed")) {
                Charge charge = (Charge) stripeObject;
            }
        }

        catch (Exception e) {
            LOGGER.error(ExceptionUtils.getFullStackTrace(e));
            return Response.status(Response.Status.NOT_FOUND).build();
        }

        return Response.ok().build();

    }
 

mrBrown

Super-Moderator
Mitarbeiter
Machs kurz und nimm
Java:
public Response getEvent(Event event, @HeaderParam("Stripe-Signature") String stripeSignature)
 

Ähnliche Java Themen

Neue Themen


Oben