PayPal Webhook验证Java SDK

PayPal Webhook验证Java SDK,java,spring,paypal,paypal-webhooks,Java,Spring,Paypal,Paypal Webhooks,我目前正在将“PayPal智能支付按钮”集成到一个网络应用程序中。 传递自定义字段并接收带有此数据的Webhook/购买确认非常有效 我在验证收到的Webhook时遇到问题。文档很差,导致麻省理工学院要么使用v1(不推荐使用),要么使用v2javasdk,其中没有提到Webhook验证 我在Java中集成了以下SDK <dependency> <groupId>com.paypal.sdk</groupId> &

我目前正在将“PayPal智能支付按钮”集成到一个网络应用程序中。 传递自定义字段并接收带有此数据的Webhook/购买确认非常有效

我在验证收到的Webhook时遇到问题。文档很差,导致麻省理工学院要么使用v1(不推荐使用),要么使用v2javasdk,其中没有提到Webhook验证

我在Java中集成了以下SDK

<dependency>
            <groupId>com.paypal.sdk</groupId>
            <artifactId>checkout-sdk</artifactId>
            <version>1.0.2</version>
        </dependency>

com.paypal.sdk
签出sdk
1.0.2
但我无法找到一种方法来验证Webhook。
我有没有读过一些东西,或者如何实现Webhook验证

没有支持webhook集成的SDK

(本页对旧SDK的引用:已过期)

所以,你有一些选择

  • DIY验证,使用事件标题中的信息:

  • 与HTTPS API的直接集成:

  • 任何事情都不要使用Webhook,而是将您的集成切换到不需要Webhook的服务器端实现

最后一个选项实际上是我建议的

以下是您需要的服务器端SDK:

这样,您将实现两个路由,一个用于“设置事务”(创建订单),另一个用于“捕获事务”(捕获订单)。这里有这些步骤的指南:

然后将连接到这两个服务器端路由的web前端是:


使用这种服务器端集成时不需要Webhook;在服务器上执行捕获时,您会立即得到成功或失败的响应。

与您的问题完全相同,这就是我创建自己的API来处理该问题的原因:

它使用第一个SDK中提供的官方验证方法

下面是一个将my API与spring结合使用的示例:

@RestController
@RequestMapping(value=“paypal hook”,method=RequestMethod.POST)
公共类薪资福利示例{
//这是在听https://.../paypal-hook
//用于paypal通知消息,并返回“OK”文本作为响应。
@GetMapping(products=“text/plain”)
public@responseBy字符串receiveAndRespond(HttpServletRequest){
System.out.println(“在…/paypal hook/…)收到webhook事件”;
试一试{
PayHook PayHook=新的PayHook();
payHook.setSandboxMode(true);//默认值为false。请在生产中删除此选项。
//获取标题和正文
WebhookEventHeader header=payHook.parseAndGetHeader(getHeadersAsMap(请求));
JsonObject body=payHook.parseAndGetBody(getBodyAsString(request));
//创建此事件
WebhookEvent事件=新的WebhookEvent(
“在此处插入有效的webhook id”,//从此处获取:https://developer.paypal.com/developer/applications/
Arrays.asList(“CHECKOUT.ORDER.APPROVED”、“PAYMENTS.PAYMENT.CREATED”),//在此处插入有效的事件类型/名称。所有事件类型/名称的完整列表如下:https://developer.paypal.com/docs/api-basics/notifications/webhooks/event-names
标题,
身体);
//执行事件验证
payHook.validateWebhookEvent(事件);
System.out.println(“验证成功!”);
}捕获(例外e){
e、 printStackTrace();
System.out.println(“验证失败:+e.getMessage());
}
返回“OK”;
}
//帮助您从HttpServletRequest对象提取头的简单帮助器方法。
私有映射getHeadersAsMap(HttpServletRequest){
Map Map=newhashmap();
@抑制警告(“原始类型”)
枚举headerNames=request.getHeaderNames();
while(headerNames.hasMoreElements()){
字符串键=(字符串)headerNames.nextElement();
字符串值=request.getHeader(键);
map.put(键、值);
}
返回图;
}
//从HttpServletRequest对象获取字符串形式的请求数据的简单帮助器方法。
私有字符串getBodyAsString(HttpServletRequest请求)引发IOException{
StringBuilder StringBuilder=新的StringBuilder();
try(BufferedReader=new BufferedReader(new InputStreamReader(request.getInputStream())){
字符串行=”;
而((line=reader.readLine())!=null)
stringBuilder.append(行);
}
返回stringBuilder.toString();
}
}
希望我能帮忙,
祝你今天愉快

谢谢你的回答。我想我将切换到服务器端实现。