在开发中,有些外部系统需要依赖我们系统的数据,如系统数据发生变更需要告知外部系统(外部系统可能有很多个),我们初步想用webhook的方式来实现,想知道webhook是怎么用的。怎么搭建需要什么技术
7条回答 默认 最新
关注
获得5.40元问题酬金 webhook 的概念很简单,webhook 就是一个简单的 HTTP 回调。当发生某些事情时,HTTP POST 调用的注册 URL 作为简单通知。
换句话说,我们所说的 Webhook 是在 Web 应用程序中,当某些事情发生时,通过 HTTP POST 调用自动注册的 URL 以通知 Web 应用程序上的用户您请求的数据状态已更改,请查看它。
1.> 首先,我们将创建一个 API,从用户那里获取 KYC 信息,然后通过 RestTemplate 将此信息发送给第三方应用程序以验证用户信息,第三方将 Json Response 作为 KYC 详细信息提交返回给用户.
UserKYCController class
package com.example.com.controller; @Api @RestController @RequestMapping(value = UrlConstant.BASE_URI_V1) public class UserKYCController { private Logger logger = LoggerFactory.getLogger(UserKYCController.class); @Autowired private UserKYCService userKYCService; /** * @param userKYCInput * @param result * @return */ @RequestMapping(value = UrlConstant.UPLOAD_CONSUMER_KYC_DOCUMENT, method = RequestMethod.POST) public ResponseEntity<Object> uploadKYCDetails(@Valid @RequestBody UserKYCInput userKYCInput, BindingResult result) { if (result.hasErrors()) { return ResponseHandler.response(HttpStatus.BAD_REQUEST, true, ErrorCollectionUtil.getError(result), ErrorCode.ERROR, Message("bad.request"), ResponseCode.ACKNOWLEDGE_OPTIONAL_RESPONSE_OBJECT, ErrorCollectionUtil.getErrorMap(result)); } ResponseEntity<String> response = userKYCService.sendUserKyc(userKYCInput); if (response != null) { return ResponseHandler.response(HttpStatus.OK, false, Message("user.KYC.save.success"), ErrorCode.OK, ResponseCode.ACKNOWLEDGE, response); } else { genericUtil.saveData(userKYCInput); return ResponseHandler.response(HttpStatus.INTERNAL_SERVER_ERROR, true, Message("user.KYC.save.failure"), ErrorCode.ERROR, ResponseCode.ACKNOWLEDGE_OPTIONAL_RESPONSE_OBJECT); } } }
UserKYCServiceImpl class
package com.example.com.service.Userkyc; @Service public class UserKYCServiceImpl implements UserKYCService { public static final Logger logger = LoggerFactory.getLogger(UserKYCServiceImpl.class); @Autowired private UserKYCRepository userKYCRepository; @Value("${user.kyc.restTemplate.url}") private String kycClientURL; @Value("${user.kyc.restTemplate.authKey}") private String kycAuthKey; @Autowired private UserService userService; @Override public ResponseEntity<String> sendUserKyc(UserKYCInput userKYCDetail) { RestTemplate restTemplate = new RestTemplate(); String url = kycClientURL; String base64Creds = kycAuthKey; HttpHeaders headers = new HttpHeaders(); headers.add("Authorization", "Basic " + base64Creds); HttpEntity<UserKYCInput> request = new HttpEntity<>(userKYCDetail, headers); ResponseEntity<String> response = restTemplate.exchange(url, HttpMethod.POST, request, String.class); uploadUserKyc(userKYCDetail, response); return response; } }
2.> 其次,我们将创建另一个 API,并且此 API URL 已在发送用户 KYC 信息的第三方应用程序中注册,当验证成功时,第三方将使用更新的 Json 响应自动调用我们注册的 URL,或者我们可以说用户会通过调用这个注册 URL 被第三方自动通知,所以这个 URL 被称为(Webhook URL)。
UserKYCWebhookController class
package com.example.com.controller; @Api @RestController @RequestMapping(value = UrlConstant.BASE_KYC_WEBHOOK_URI_V1) public class UserKYCWebhookController { private static final Logger logger = getLogger(UserKYCWebhookController.class); @Autowired private UserKYCService userKYCService; @Autowired private WebHookDetailsService webHookDetailsService; @Autowired private PasswordEncoderUtil passwordEncoderUtil; /** * @param notificationDto * @param httpRequest * @throws Exception */ @RequestMapping(value = UrlConstant.CONSUMER_KYC_WEBHOOK_NOTIFICATION_REQUEST, method = RequestMethod.POST) public void getKYCWebhookData(@RequestBody Map<String, Object> notificationDto,HttpServletRequest httpRequest) { final String authorization = httpRequest.getHeader("Authorization"); logger.debug("authorization {}", authorization); if (authorization != null && authorization.startsWith("Basic")) { String base64Credentials = authorization.substring("Basic".length()).trim(); String credentials = new String(Base64.getDecoder().decode(base64Credentials), Charset.forName("UTF-8")); final String[] values = credentials.split(":", 2); String userName = values[0].trim(); String password = values[1].trim(); WebHookDetails details = webHookDetailsService.getwebHookDetailsByUserName(userName); if (Objects.nonNull(details)) { String tid = notificationDto.get("tid").toString(); String state = notificationDto.get("state").toString(); Map<String, Object> response = new HashMap<>(); response.put("tid", tid); response.put("state", state); if (passwordEncoderUtil.matches(password, details.getPassword())) { userKYCService.saveWebhookUpdatedResponse(response); } else { logger.debug("response == {}", false); } } } } }
这就是使用 spring web 应用程序实现 webhook 的全部内容。
解决 1无用
悬赏问题
- ¥99 利用C/C++语言,使用TCP/IP协议,编一个简易聊天程序
- ¥15 如何使用python 实现对串口/dev/ttyUSB0进行上锁,使得该串口只能在一个python脚本中使用,其他脚本不能操作这个串口
- ¥15 晶体塑性有限元——Damask求解
- ¥15 写出这个有没有人能写一下今天中午就要
- ¥30 设计一个图形用户界面来控制你机械臂的运动
- ¥30 3d打印机无法识别到SD卡,如何解决?(相关搜索:格式化)
- ¥15 RPG游戏架构设计和开发方法
- ¥15 前端返回pdf时不显示内容
- ¥50 如何在不能联网影子模式下的电脑解决usb锁
- ¥20 服务器redhat5.8网络问题