OmgNotifyRequestArgumentResolver.java 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. package com.ruoyi.app.omgpay;
  2. import com.ruoyi.app.omgpay.dto.OmgNotifyRequest;
  3. import com.ruoyi.common.utils.ip.IpUtils;
  4. import jakarta.servlet.http.HttpServletRequest;
  5. import org.springframework.core.MethodParameter;
  6. import org.springframework.stereotype.Component;
  7. import org.springframework.web.bind.support.WebDataBinderFactory;
  8. import org.springframework.web.context.request.NativeWebRequest;
  9. import org.springframework.web.method.support.HandlerMethodArgumentResolver;
  10. import org.springframework.web.method.support.ModelAndViewContainer;
  11. import java.io.IOException;
  12. import java.nio.charset.StandardCharsets;
  13. /** Reads the raw form before MVC can discard unknown or empty callback fields. */
  14. @Component
  15. public class OmgNotifyRequestArgumentResolver implements HandlerMethodArgumentResolver {
  16. private final OmgNotifyFormParser parser;
  17. public OmgNotifyRequestArgumentResolver(OmgNotifyFormParser parser) {
  18. this.parser = parser;
  19. }
  20. @Override
  21. public boolean supportsParameter(MethodParameter parameter) {
  22. return OmgNotifyRequest.class.equals(parameter.getParameterType())
  23. && parameter.hasParameterAnnotation(OmgNotifyForm.class);
  24. }
  25. @Override
  26. public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer,
  27. NativeWebRequest webRequest, WebDataBinderFactory binderFactory) {
  28. HttpServletRequest request = webRequest.getNativeRequest(HttpServletRequest.class);
  29. if (request == null) {
  30. return OmgNotifyFormParser.invalid("unknown", "", "REQUEST_UNAVAILABLE");
  31. }
  32. String sourceIp = IpUtils.getIpAddr(request);
  33. try {
  34. byte[] body = request.getInputStream().readNBytes(OmgNotifyFormParser.MAX_FORM_BYTES + 1);
  35. return parser.parse(body, sourceIp, request.getContentType());
  36. } catch (IOException exception) {
  37. return OmgNotifyFormParser.invalid(sourceIp,
  38. "<request-body-read-error:" + exception.getClass().getSimpleName() + ">",
  39. "BODY_READ_FAILED");
  40. }
  41. }
  42. }