diff --git a/src/main/java/com/billpaymentservice/bbps/controller/PaymentStartController.java b/src/main/java/com/billpaymentservice/bbps/controller/PaymentStartController.java index 6a42659..d9621fb 100644 --- a/src/main/java/com/billpaymentservice/bbps/controller/PaymentStartController.java +++ b/src/main/java/com/billpaymentservice/bbps/controller/PaymentStartController.java @@ -25,7 +25,7 @@ public class PaymentStartController { // Defensive: if bean not injected, return failure return ResponseEntity.badRequest().body(new ResponseModel("PaymentStartService not available", "FAILED", 400, null)); } - ResponseModel response = paymentStartService.startPayment(paymentStartUserRequest); + ResponseModel response = paymentStartService.startWebPayment(paymentStartUserRequest); return ResponseEntity.ok(response); } } diff --git a/src/main/java/com/billpaymentservice/bbps/service/PaymentStartService.java b/src/main/java/com/billpaymentservice/bbps/service/PaymentStartService.java index eb91879..86b6f0f 100644 --- a/src/main/java/com/billpaymentservice/bbps/service/PaymentStartService.java +++ b/src/main/java/com/billpaymentservice/bbps/service/PaymentStartService.java @@ -5,4 +5,6 @@ import com.billpaymentservice.bbps.dto.request.PaymentStartUserRequest; public interface PaymentStartService { ResponseModel startPayment(PaymentStartUserRequest request); + + ResponseModel startWebPayment(PaymentStartUserRequest request); } diff --git a/src/main/java/com/billpaymentservice/bbps/serviceImpl/HttpService.java b/src/main/java/com/billpaymentservice/bbps/serviceImpl/HttpService.java index 042221b..9541c06 100644 --- a/src/main/java/com/billpaymentservice/bbps/serviceImpl/HttpService.java +++ b/src/main/java/com/billpaymentservice/bbps/serviceImpl/HttpService.java @@ -141,6 +141,46 @@ public class HttpService { return response; } + public HashMap postFormRequest(String url, String formBody) { + HashMap response = new HashMap<>(); + + try { + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED); + + log.info("🌐 Sending FORM POST to: {}", url); + log.info("📦 Payload: {}", formBody); + + ResponseEntity restResponse = restClient.post() + .uri(url) + .headers(h -> h.addAll(headers)) + .body(formBody) + .retrieve() + .toEntity(String.class); + + response.put("respCode", String.valueOf(restResponse.getStatusCode().value())); + + // HTML RESPONSE directly stored + response.put("data", restResponse.getBody()); + + log.info("✅ FORM POST Response Status: {}", restResponse.getStatusCode()); + + } catch (HttpClientErrorException e) { + log.error("❌ FORM POST Error: {} - {}", e.getStatusCode(), e.getMessage()); + + response.put("respCode", String.valueOf(e.getStatusCode().value())); + response.put("data", e.getResponseBodyAsString()); // still HTML or error string + + } catch (Exception e) { + log.error("❌ FORM POST Exception: {}", e.getMessage(), e); + + response.put("respCode", "500"); + response.put("data", "HttpService FORM Error: " + e.getMessage()); + } + + return response; + } + diff --git a/src/main/java/com/billpaymentservice/bbps/serviceImpl/PaymentStartServiceImpl.java b/src/main/java/com/billpaymentservice/bbps/serviceImpl/PaymentStartServiceImpl.java index 52c1f4c..7cae5c4 100644 --- a/src/main/java/com/billpaymentservice/bbps/serviceImpl/PaymentStartServiceImpl.java +++ b/src/main/java/com/billpaymentservice/bbps/serviceImpl/PaymentStartServiceImpl.java @@ -42,7 +42,7 @@ public class PaymentStartServiceImpl implements PaymentStartService { private static final Logger LOGGER = LoggerFactory.getLogger(PaymentStartServiceImpl.class); - private String uatPaymentUrl="https://uat.godemo.in/api/UATIntegration/paymentrequest/seamless"; + private String uatPaymentUrl="https://uat.godemo.in/api/UATIntegration/uat/payin/paymentrequest"; private final PaymentStartRecordRepository paymentStartRecordRepository; private final HttpService httpService; @@ -289,5 +289,82 @@ public class PaymentStartServiceImpl implements PaymentStartService { sent.setUdf14(request.getUdf14()); return sent; } + + @Override + public ResponseModel startWebPayment(PaymentStartUserRequest request) { + + String requestId = request.getReqId(); + String apiName = "StartPayment"; + String txnId = helper.generateTxnId(15); + + helper.validateMerchant(request.getMid()); + + // inbound log + String requestJson = helper.convertObjectToJson(request); + InboundTraceLog inboundLog = + helper.createInboundLog(requestId, txnId, apiName, request.getMid(), + BBPSConstant.HTTP_POST, requestJson); + + // Prepare request payload + PaymentDetailSentRequest sent = createPaymentSentRequest(request); + String orderNo = "ORD" + helper.generateTxnId(12); + sent.setOrderNo(orderNo); + + String plaintext = helper.convertObjectToJson(sent); + String encKey = BBPSConstant.enckey; + sent.setEnckey(encKey); + + String encrypted = encryptionUtil.encryptMData(plaintext, encKey); + + // ----------- BUILD x-www-form-urlencoded PAYLOAD ----------- + String formPayload = + "mid=" + URLEncoder.encode(BBPSConstant.mid, StandardCharsets.UTF_8) + + "&payload=" + URLEncoder.encode(encrypted, StandardCharsets.UTF_8); + LOGGER.info("Form Payload: {}", formPayload); + OutboundTraceLog outboundLog = + helper.createOutboundLog(txnId, requestId, apiName, uatPaymentUrl, + BBPSConstant.HTTP_POST, formPayload); + + // ----------- CALL API (FORM URL-ENCODED) ----------- + Map responseMap = + httpService.postFormRequest(uatPaymentUrl, formPayload); + + LOGGER.info("Payment Start Response: {}", responseMap); + + int httpCode = Integer.parseInt(responseMap.getOrDefault("respCode", "500")); + String respBody = responseMap.getOrDefault("data", ""); + + helper.updateOutboundLogResponse(outboundLog, respBody); + + // ---- HTTP FAILURE ---- + if (httpCode != 200) { + helper.updateInboundLogFailure(inboundLog, respBody, String.valueOf(httpCode)); + throw new CustomException("Upstream HTTP Error", "FAILED", httpCode, respBody); + } + + // ---- EMPTY RESPONSE ---- + if (respBody.isEmpty()) { + helper.updateInboundLogFailure(inboundLog, "Empty response from PG", "500"); + throw new CustomException("Empty response from PG", "FAILED", 500, null); + } + + // ❗❗ PG RETURNS HTML → NO JSON PARSING REQUIRED + helper.updateInboundLogSuccess(inboundLog, respBody, "200"); + + // Save record with HTML (optional) + // bbpsMapperHelper.savePaymentStartHtmlRecord(request, respBody, txnId, orderNo); + + // Return HTML directly in API response + Map result = new HashMap<>(); + result.put("html", respBody); + + return ResponseModel.builder() + .status("SUCCESS") + .statusCode(200) + .message("HTML Response Received") + .data(result) + .build(); + } + } \ No newline at end of file diff --git a/src/main/resources/application-local.properties b/src/main/resources/application-local.properties index aaf1e10..4eaafbc 100644 --- a/src/main/resources/application-local.properties +++ b/src/main/resources/application-local.properties @@ -20,9 +20,9 @@ swagger.server.description=Local Development Server # DataSource spring.datasource.url=jdbc:postgresql://localhost:5432/BBPS spring.datasource.username=postgres -spring.datasource.password=UAT@DB_2025 +#spring.datasource.password=UAT@DB_2025 -#spring.datasource.password=himanshu@123 +spring.datasource.password=himanshu@123 spring.datasource.driver-class-name=org.postgresql.Driver spring.datasource.type=com.zaxxer.hikari.HikariDataSource