# Hilfe bei Webservice / Webhook mit JAXRS



## beta20 (28. Okt 2020)

Hallo,

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


```
@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)








						Verwenden Sie eingehende Webhooks, um Updates in Echtzeit zu erhalten
					

Halten Sie nach Ereignissen in Ihrem Stripe-Konto Ausschau, damit Ihre Integration automatisch Reaktionen auslösen kann.




					stripe.com
				




Ich versuche den Webhook gerade mit deren Stripe CLI anzusprechen:








						Testen Ihrer Webhooks-Integration mit der Stripe-CLI
					

Testen Sie, ob Ihr Webhook-Endpoint korrekt funktioniert, bevor Sie ihn live einsetzen.




					stripe.com
				




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?


```
@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?


----------



## kneitzel (28. Okt 2020)

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 (29. Okt 2020)

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....








						Set up and deploy a webhook
					

Learn how to set up and deploy a webhook to listen to events from Stripe.




					stripe.com
				




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


----------



## VfL_Freak (29. Okt 2020)

Bitte auf die korrekte Rubrik achten!!
Dies ist wohl kaum ein Java-Anfänger-Thema !!

Danke und VG
Klaus


----------



## mrBrown (29. Okt 2020)

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...



beta20 hat gesagt.:


> Nun benötige ich aber noch eine Authentifizierung.
> Das ist hier beschrieben....
> Build a webhook endpoint


Ne, das ist da nicht beschrieben.



beta20 hat gesagt.:


> Wie bekomme ich das "request" - Objekt her?
> Ich habe nun folgendes versucht:
> 
> *public* Response getEvent(String json, HttpServletRequest request)
> ...


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 (29. Okt 2020)

kneitzel hat gesagt.:


> 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:


```
@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 (29. Okt 2020)

danke...

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


```
@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();

    }
```


----------



## thecain (29. Okt 2020)

beta20 hat gesagt.:


> System.out.println("Webhook error while validating signature."); return Response.status(200).build();


Ein Fehler ist ok?
Andere Fehler sind NOT_FOUND... Willst du deinen Usern ein Rätsel aufgeben?


----------



## mrBrown (29. Okt 2020)

Machs kurz und nimm 
	
	
	
	





```
public Response getEvent(Event event, @HeaderParam("Stripe-Signature") String stripeSignature)
```


----------



## beta20 (29. Okt 2020)

thecain hat gesagt.:


> Ein Fehler ist ok?
> Andere Fehler sind NOT_FOUND... Willst du deinen Usern ein Rätsel aufgeben?


oh!!!. Danke für den Hinweis!!


----------

