abl0430 2022-05-04 03:42 采纳率: 0%
浏览 112
已结题

如何实现webhook通知

在开发中,有些外部系统需要依赖我们系统的数据,如系统数据发生变更需要告知外部系统(外部系统可能有很多个),我们初步想用webhook的方式来实现,想知道webhook是怎么用的。怎么搭建需要什么技术

  • 写回答

7条回答 默认 最新

  • hyh123a 全栈领域新星创作者 2022-05-04 09:06
    关注
    获得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 的全部内容。

    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 5月12日
  • 创建了问题 5月4日

悬赏问题

  • ¥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网络问题