PayPal Webhook验证Java SDK
我目前正在将“PayPal智能支付按钮”集成到一个网络应用程序中。 传递自定义字段并接收带有此数据的Webhook/购买确认非常有效 我在验证收到的Webhook时遇到问题。文档很差,导致麻省理工学院要么使用v1(不推荐使用),要么使用v2javasdk,其中没有提到Webhook验证 我在Java中集成了以下SDKPayPal 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> &
<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的服务器端实现
使用这种服务器端集成时不需要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();
}
}
希望我能帮忙,
祝你今天愉快 谢谢你的回答。我想我将切换到服务器端实现。