removed heades section from impl and added it in helper

This commit is contained in:
Lincpay Tech
2025-11-24 14:54:44 +05:30
parent 08d5509c1a
commit d8d8bdc3d3
7 changed files with 366 additions and 821 deletions
@@ -12,6 +12,8 @@ import com.billpaymentservice.bbps.dto.ResponseModel;
import com.billpaymentservice.bbps.dto.request.BillPaymentRequest; import com.billpaymentservice.bbps.dto.request.BillPaymentRequest;
import com.billpaymentservice.bbps.dto.request.TransactionStatusRequest; import com.billpaymentservice.bbps.dto.request.TransactionStatusRequest;
import com.billpaymentservice.bbps.dto.request.TrasactionStatusByClientReqIdRequest; import com.billpaymentservice.bbps.dto.request.TrasactionStatusByClientReqIdRequest;
import com.billpaymentservice.bbps.dto.response.FetchBillValidateResponse;
import com.billpaymentservice.bbps.dto.response.TransactionStatusResponse;
import com.billpaymentservice.bbps.service.PaymentService; import com.billpaymentservice.bbps.service.PaymentService;
@RestController @RestController
@@ -52,4 +54,11 @@ public class PaymentController {
return ResponseEntity.ok(response); return ResponseEntity.ok(response);
} }
@PostMapping(value="/callback/paymentIntiate", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<ResponseModel> handleBillValidateCallback(@RequestBody TransactionStatusResponse transactionStatusResponse) {
ResponseModel genralResp=paymentService.handlePaymentIntiateCallback(transactionStatusResponse);
// Return a response indicating successful receipt
return ResponseEntity.ok(genralResp);
}
} }
@@ -25,6 +25,6 @@ public interface AgentService {
ResponseModel processBillFetchCallback(BillDataResponse billDataResponse); ResponseModel processBillFetchCallback(BillDataResponse billDataResponse);
ResponseModel processBillValidateCallback(FetchBillValidateResponse billDataResponse); ResponseModel processBillValidateCallback(FetchBillValidateResponse billValidateResponse);
} }
@@ -1,3 +1,4 @@
// java
package com.billpaymentservice.bbps.serviceImpl; package com.billpaymentservice.bbps.serviceImpl;
import java.util.Map; import java.util.Map;
@@ -10,7 +11,6 @@ import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType; import org.springframework.http.MediaType;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.web.client.RestClient; import org.springframework.web.client.RestClient;
import com.billpaymentservice.bbps.dto.GeneralResp; import com.billpaymentservice.bbps.dto.GeneralResp;
import com.billpaymentservice.bbps.dto.ResponseModel; import com.billpaymentservice.bbps.dto.ResponseModel;
import com.billpaymentservice.bbps.dto.request.BillFetchByBillIdRequest; import com.billpaymentservice.bbps.dto.request.BillFetchByBillIdRequest;
@@ -59,6 +59,10 @@ public class AgentServiceImpl implements AgentService {
private final BillInitateRepository billIntiateRepository; private final BillInitateRepository billIntiateRepository;
private static final Logger LOGGER = LoggerFactory.getLogger(AgentServiceImpl.class); private static final Logger LOGGER = LoggerFactory.getLogger(AgentServiceImpl.class);
// Reusable ObjectMapper instance
private final ObjectMapper objectMapper = new ObjectMapper()
.setSerializationInclusion(JsonInclude.Include.NON_NULL);
public AgentServiceImpl(RestClient restClient, HttpService httpService, Helper helper, public AgentServiceImpl(RestClient restClient, HttpService httpService, Helper helper,
BharatConnectMasterRepository beneficiaryDetailsRepository, BharatConnectMasterRepository beneficiaryDetailsRepository,
InboundTraceLogRepository inboundTraceLogRepository, OutboundTraceLogRepository outboundTraceLogRepository, InboundTraceLogRepository inboundTraceLogRepository, OutboundTraceLogRepository outboundTraceLogRepository,
@@ -84,21 +88,11 @@ public class AgentServiceImpl implements AgentService {
fetchBillRequest.setClientReqId(txnId); fetchBillRequest.setClientReqId(txnId);
helper.validateMerchant(fetchBillRequest.getMid()); helper.validateMerchant(fetchBillRequest.getMid());
BharatConnectMaster headersData = beneficiaryDetailsRepository.findByOrgId("ORG001");
HttpHeaders headers = new HttpHeaders();
headers.set("x-digiledge-key", headersData.getXDigiledgeKey());
headers.set("agentId", headersData.getAgentId());
headers.set("tenantId", headersData.getTenantId());
headers.setContentType(MediaType.APPLICATION_JSON);
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
FetchBillForwardRequest forwardReq = helper.fetchBillForwardRequestMap(fetchBillRequest); FetchBillForwardRequest forwardReq = helper.fetchBillForwardRequestMap(fetchBillRequest);
String forwardJson = helper.convertObjectToJson(forwardReq); String forwardJson = helper.convertObjectToJson(forwardReq);
String requestJson = helper.convertObjectToJson(fetchBillRequest); String requestJson = helper.convertObjectToJson(fetchBillRequest);
// ✅ Create inbound & outbound logs
InboundTraceLog inboundLog = helper.createInboundLog(requestId, txnId, apiName, fetchBillRequest.getMid(), InboundTraceLog inboundLog = helper.createInboundLog(requestId, txnId, apiName, fetchBillRequest.getMid(),
"POST", requestJson); "POST", requestJson);
OutboundTraceLog outboundLog = helper.createOutboundLog(txnId, requestId, apiName, fullUrl, "POST", OutboundTraceLog outboundLog = helper.createOutboundLog(txnId, requestId, apiName, fullUrl, "POST",
@@ -107,7 +101,7 @@ public class AgentServiceImpl implements AgentService {
try { try {
LOGGER.info("Calling external API: {}", fullUrl); LOGGER.info("Calling external API: {}", fullUrl);
Map<String, String> responseMap = httpService.postRequest(fullUrl, forwardJson, headers); Map<String, String> responseMap = httpService.postRequest(fullUrl, forwardJson, helper.buildHeaders(beneficiaryDetailsRepository.findByOrgId("ORG001")));
String responseData = responseMap.get("data"); String responseData = responseMap.get("data");
helper.updateOutboundLogResponse(outboundLog, responseData); helper.updateOutboundLogResponse(outboundLog, responseData);
@@ -171,20 +165,13 @@ public class AgentServiceImpl implements AgentService {
String billId = billFetchByBillIdRequest.getBillId(); String billId = billFetchByBillIdRequest.getBillId();
String fullUrl = agentDtaUrl + BBPSConstant.BILL_FETCH_BY_ID + billFetchByBillIdRequest.getBillId(); String fullUrl = agentDtaUrl + BBPSConstant.BILL_FETCH_BY_ID + billFetchByBillIdRequest.getBillId();
helper.validateMerchant(billFetchByBillIdRequest.getMid()); helper.validateMerchant(billFetchByBillIdRequest.getMid());
BharatConnectMaster headersData = beneficiaryDetailsRepository.findByOrgId("ORG001");
HttpHeaders headers = new HttpHeaders();
headers.set("x-digiledge-key", headersData.getXDigiledgeKey());
headers.set("agentId", headersData.getAgentId());
headers.set("tenantId", headersData.getTenantId());
headers.setContentType(MediaType.APPLICATION_JSON);
ObjectMapper objectMapper = new ObjectMapper();
OutboundTraceLog outboundLog = helper.createOutboundLog(txnId, reqId, apiName, fullUrl, "GET", null); OutboundTraceLog outboundLog = helper.createOutboundLog(txnId, reqId, apiName, fullUrl, "GET", null);
LOGGER.debug("Outbound log created successfully for FetchBillById: {}", fullUrl); LOGGER.debug("Outbound log created successfully for FetchBillById: {}", fullUrl);
try { try {
LOGGER.info("Calling external API: {}", fullUrl); LOGGER.info("Calling external API: {}", fullUrl);
Map<String, String> responseMap = httpService.getRequest(fullUrl, headers); Map<String, String> responseMap = httpService.getRequest(fullUrl, helper.buildHeaders(beneficiaryDetailsRepository.findByOrgId("ORG001")));
String responseData = responseMap.get("data"); String responseData = responseMap.get("data");
LOGGER.info("Bill FetchById Response: {}", responseData); LOGGER.info("Bill FetchById Response: {}", responseData);
@@ -231,7 +218,6 @@ public class AgentServiceImpl implements AgentService {
LOGGER.info("Initiating {} API for billId={} and reqId={}", apiName, billId, reqId); LOGGER.info("Initiating {} API for billId={} and reqId={}", apiName, billId, reqId);
// create inbound log (GET -> no request body)
InboundTraceLog inboundLog = helper.createInboundLog(reqId, txnId, apiName, InboundTraceLog inboundLog = helper.createInboundLog(reqId, txnId, apiName,
billFetchByBillIdRequest.getMid(), "GET", null); billFetchByBillIdRequest.getMid(), "GET", null);
@@ -239,24 +225,14 @@ public class AgentServiceImpl implements AgentService {
helper.validateMerchant(billFetchByBillIdRequest.getMid()); helper.validateMerchant(billFetchByBillIdRequest.getMid());
LOGGER.debug("Merchant validated successfully for MID={}", billFetchByBillIdRequest.getMid()); LOGGER.debug("Merchant validated successfully for MID={}", billFetchByBillIdRequest.getMid());
BharatConnectMaster headersData = beneficiaryDetailsRepository.findByOrgId("ORG001");
HttpHeaders headers = new HttpHeaders();
headers.set("x-digiledge-key", headersData.getXDigiledgeKey());
headers.set("agentId", headersData.getAgentId());
headers.set("tenantId", headersData.getTenantId());
headers.setContentType(MediaType.APPLICATION_JSON);
// create outbound log
OutboundTraceLog outboundLog = helper.createOutboundLog(txnId, reqId, apiName, fullUrl, "GET", null); OutboundTraceLog outboundLog = helper.createOutboundLog(txnId, reqId, apiName, fullUrl, "GET", null);
LOGGER.info("Calling external BBPS API for FetchBillById, URL={}", fullUrl); LOGGER.info("Calling external BBPS API for FetchBillById, URL={}", fullUrl);
Map<String, String> responseMap = httpService.getRequest(fullUrl, headers); Map<String, String> responseMap = httpService.getRequest(fullUrl, helper.buildHeaders(beneficiaryDetailsRepository.findByOrgId("ORG001")));
String responseData = responseMap.get("data"); String responseData = responseMap.get("data");
LOGGER.info("Response received from BBPS for billId={} : {}", billId, responseData); LOGGER.info("Response received from BBPS for billId={} : {}", billId, responseData);
// update outbound log with response
helper.updateOutboundLogResponse(outboundLog, responseData); helper.updateOutboundLogResponse(outboundLog, responseData);
ObjectMapper objectMapper = new ObjectMapper();
Map<String, Object> dataMap = objectMapper.readValue(responseData, Map<String, Object> dataMap = objectMapper.readValue(responseData,
new TypeReference<Map<String, Object>>() { new TypeReference<Map<String, Object>>() {
}); });
@@ -264,19 +240,17 @@ public class AgentServiceImpl implements AgentService {
if (!dataMap.containsKey("genericResponse")) { if (!dataMap.containsKey("genericResponse")) {
helper.updateInboundLogFailure(inboundLog, responseData, "INVALID_RESPONSE"); helper.updateInboundLogFailure(inboundLog, responseData, "INVALID_RESPONSE");
LOGGER.warn("Invalid response structure received for billId={} | Response={}", billId, responseData); LOGGER.warn("Invalid response structure received for billId={} | Response={}", billId, responseData);
throw new CustomException(String.valueOf(dataMap.get("message")), // message throw new CustomException(String.valueOf(dataMap.get("message")),
String.valueOf(dataMap.get("status")), // status String.valueOf(dataMap.get("status")),
Integer.parseInt(String.valueOf(dataMap.get("statusCode"))), // statusCode Integer.parseInt(String.valueOf(dataMap.get("statusCode"))),
String.valueOf(dataMap.get("remarks"))); String.valueOf(dataMap.get("remarks")));
} }
BillDataResponse responseWrapper = objectMapper.convertValue(dataMap, BillDataResponse.class); BillDataResponse responseWrapper = objectMapper.convertValue(dataMap, BillDataResponse.class);
GeneralResp generalResp = responseWrapper.getGenericResponse(); GeneralResp generalResp = responseWrapper.getGenericResponse();
ResponseModel responseModel = new ResponseModel(generalResp.getMessage(), generalResp.getStatus(), ResponseModel responseModel = new ResponseModel(generalResp.getMessage(), generalResp.getStatus(),
Integer.parseInt(generalResp.getStatusCode()), responseWrapper); Integer.parseInt(generalResp.getStatusCode()), responseWrapper);
// update inbound log success and persist bill data
helper.updateInboundLogSuccess(inboundLog, responseData, generalResp.getStatus()); helper.updateInboundLogSuccess(inboundLog, responseData, generalResp.getStatus());
helper.saveOrUpdateBillData(responseWrapper, billFetchByBillIdRequest, txnId); helper.saveOrUpdateBillData(responseWrapper, billFetchByBillIdRequest, txnId);
LOGGER.info("Bill data saved successfully for billId={} | Status={}", billId, generalResp.getStatus()); LOGGER.info("Bill data saved successfully for billId={} | Status={}", billId, generalResp.getStatus());
@@ -290,8 +264,6 @@ public class AgentServiceImpl implements AgentService {
} }
} }
@Override @Override
public ResponseModel initiateBillValidate(FetchBillValidatestRequest fetchBillValidateRequest) { public ResponseModel initiateBillValidate(FetchBillValidatestRequest fetchBillValidateRequest) {
LOGGER.info("Initiating bill Validate for request ID: {} and MID:{} and billerId:{}", fetchBillValidateRequest.getReqId(), LOGGER.info("Initiating bill Validate for request ID: {} and MID:{} and billerId:{}", fetchBillValidateRequest.getReqId(),
@@ -304,15 +276,6 @@ public class AgentServiceImpl implements AgentService {
fetchBillValidateRequest.setClientReqId(txnId); fetchBillValidateRequest.setClientReqId(txnId);
helper.validateMerchant(fetchBillValidateRequest.getMid()); helper.validateMerchant(fetchBillValidateRequest.getMid());
BharatConnectMaster headersData = beneficiaryDetailsRepository.findByOrgId("ORG001");
HttpHeaders headers = new HttpHeaders();
headers.set("x-digiledge-key", headersData.getXDigiledgeKey());
headers.set("agentId", headersData.getAgentId());
headers.set("tenantId", headersData.getTenantId());
headers.setContentType(MediaType.APPLICATION_JSON);
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
FetchBillValidatestForwardRequest forwardReq = helper FetchBillValidatestForwardRequest forwardReq = helper
.fetchBillValidatestForwardRequest(fetchBillValidateRequest); .fetchBillValidatestForwardRequest(fetchBillValidateRequest);
@@ -320,7 +283,6 @@ public class AgentServiceImpl implements AgentService {
String requestJson = helper.convertObjectToJson(fetchBillValidateRequest); String requestJson = helper.convertObjectToJson(fetchBillValidateRequest);
// ✅ Create inbound & outbound logs
InboundTraceLog inboundLog = helper.createInboundLog(reqId, txnId, apiName, fetchBillValidateRequest.getMid(), InboundTraceLog inboundLog = helper.createInboundLog(reqId, txnId, apiName, fetchBillValidateRequest.getMid(),
"POST", requestJson); "POST", requestJson);
OutboundTraceLog outboundLog = helper.createOutboundLog(txnId, reqId, apiName, fullUrl, "POST", forwardJson); OutboundTraceLog outboundLog = helper.createOutboundLog(txnId, reqId, apiName, fullUrl, "POST", forwardJson);
@@ -328,7 +290,7 @@ public class AgentServiceImpl implements AgentService {
try { try {
LOGGER.info("Calling external API: {}", fullUrl); LOGGER.info("Calling external API: {}", fullUrl);
Map<String, String> responseMap = httpService.postRequest(fullUrl, forwardJson, headers); Map<String, String> responseMap = httpService.postRequest(fullUrl, forwardJson, helper.buildHeaders(beneficiaryDetailsRepository.findByOrgId("ORG001")));
String responseData = responseMap.get("data"); String responseData = responseMap.get("data");
helper.updateOutboundLogResponse(outboundLog, responseData); helper.updateOutboundLogResponse(outboundLog, responseData);
@@ -380,7 +342,6 @@ public class AgentServiceImpl implements AgentService {
helper.updateInboundLogFailure(inboundLog, e.getMessage(), "JSON_ERROR"); helper.updateInboundLogFailure(inboundLog, e.getMessage(), "JSON_ERROR");
throw new CustomException("Invalid JSON received from API"); throw new CustomException("Invalid JSON received from API");
} }
} }
public ResponseModel BillvaidateByBillId(BillFetchByBillIdRequest billRequest, InboundTraceLog inboundLog) { public ResponseModel BillvaidateByBillId(BillFetchByBillIdRequest billRequest, InboundTraceLog inboundLog) {
@@ -392,24 +353,15 @@ public class AgentServiceImpl implements AgentService {
String reqId = billRequest.getReqId(); String reqId = billRequest.getReqId();
String billId = billRequest.getBillId(); String billId = billRequest.getBillId();
String fullUrl = agentDtaUrl + BBPSConstant.BILL_VALIDATE_ID_URL + billRequest.getBillId(); String fullUrl = agentDtaUrl + BBPSConstant.BILL_VALIDATE_ID_URL + billRequest.getBillId();
;
helper.validateMerchant(billRequest.getMid()); helper.validateMerchant(billRequest.getMid());
BharatConnectMaster headersData = beneficiaryDetailsRepository.findByOrgId("ORG001");
HttpHeaders headers = new HttpHeaders();
headers.set("x-digiledge-key", headersData.getXDigiledgeKey());
headers.set("agentId", headersData.getAgentId());
headers.set("tenantId", headersData.getTenantId());
headers.setContentType(MediaType.APPLICATION_JSON);
ObjectMapper objectMapper = new ObjectMapper();
OutboundTraceLog outboundLog = helper.createOutboundLog(txnId, reqId, apiName, fullUrl, "GET", null); OutboundTraceLog outboundLog = helper.createOutboundLog(txnId, reqId, apiName, fullUrl, "GET", null);
LOGGER.debug("Outbound log created successfully for FetchBillById: {}", fullUrl); LOGGER.debug("Outbound log created successfully for FetchBillById: {}", fullUrl);
try { try {
LOGGER.info("Calling external API: {}", fullUrl); LOGGER.info("Calling external API: {}", fullUrl);
Map<String, String> responseMap = httpService.getRequest(fullUrl, headers); Map<String, String> responseMap = httpService.getRequest(fullUrl, helper.buildHeaders(beneficiaryDetailsRepository.findByOrgId("ORG001")));
String responseData = responseMap.get("data"); String responseData = responseMap.get("data");
LOGGER.info("Bill FetchById Response: {}", responseData); LOGGER.info("Bill FetchById Response: {}", responseData);
@@ -422,8 +374,7 @@ public class AgentServiceImpl implements AgentService {
if (!dataMap.containsKey("genericResponse")) { if (!dataMap.containsKey("genericResponse")) {
helper.updateInboundLogFailure(inboundLog, responseData, "INVALID_RESPONSE"); helper.updateInboundLogFailure(inboundLog, responseData, "INVALID_RESPONSE");
LOGGER.warn("Invalid response structure for txnId: {}", txnId); LOGGER.warn("Invalid response structure for txnId: {}", txnId);
throw new CustomException(String.valueOf(dataMap.get("message")), throw new CustomException(String.valueOf(dataMap.get("message")), String.valueOf(dataMap.get("status")),
String.valueOf(dataMap.get("status")),
Integer.parseInt(String.valueOf(dataMap.get("statusCode"))), Integer.parseInt(String.valueOf(dataMap.get("statusCode"))),
String.valueOf(dataMap.get("remarks"))); String.valueOf(dataMap.get("remarks")));
} }
@@ -451,7 +402,6 @@ public class AgentServiceImpl implements AgentService {
} }
} }
@Override @Override
public ResponseModel initiateBillValidateByBillId(BillFetchByBillIdRequest billRequest) { public ResponseModel initiateBillValidateByBillId(BillFetchByBillIdRequest billRequest) {
String apiName = "FetchBillById"; String apiName = "FetchBillById";
@@ -462,31 +412,20 @@ public class AgentServiceImpl implements AgentService {
LOGGER.info("Initiating {} API for billId={} and reqId={}", apiName, billId, reqId); LOGGER.info("Initiating {} API for billId={} and reqId={}", apiName, billId, reqId);
// create inbound log (GET -> no request body)
InboundTraceLog inboundLog = helper.createInboundLog(reqId, txnId, apiName, billRequest.getMid(), "GET", null); InboundTraceLog inboundLog = helper.createInboundLog(reqId, txnId, apiName, billRequest.getMid(), "GET", null);
try { try {
helper.validateMerchant(billRequest.getMid()); helper.validateMerchant(billRequest.getMid());
BharatConnectMaster headersData = beneficiaryDetailsRepository.findByOrgId("ORG001");
HttpHeaders headers = new HttpHeaders();
headers.set("x-digiledge-key", headersData.getXDigiledgeKey());
headers.set("agentId", headersData.getAgentId());
headers.set("tenantId", headersData.getTenantId());
headers.setContentType(MediaType.APPLICATION_JSON);
// create outbound log
OutboundTraceLog outboundLog = helper.createOutboundLog(txnId, reqId, apiName, fullUrl, "GET", null); OutboundTraceLog outboundLog = helper.createOutboundLog(txnId, reqId, apiName, fullUrl, "GET", null);
LOGGER.info("Calling external BBPS API for ValidateByBillId, URL={}", fullUrl); LOGGER.info("Calling external BBPS API for ValidateByBillId, URL={}", fullUrl);
Map<String, String> responseMap = httpService.getRequest(fullUrl, headers); Map<String, String> responseMap = httpService.getRequest(fullUrl, helper.buildHeaders(beneficiaryDetailsRepository.findByOrgId("ORG001")));
String responseData = responseMap.get("data"); String responseData = responseMap.get("data");
LOGGER.info("Response received from BBPS for billId={} : {}", billId, responseData); LOGGER.info("Response received from BBPS for billId={} : {}", billId, responseData);
// update outbound log with response
helper.updateOutboundLogResponse(outboundLog, responseData); helper.updateOutboundLogResponse(outboundLog, responseData);
ObjectMapper objectMapper = new ObjectMapper();
Map<String, Object> dataMap = objectMapper.readValue(responseData, new com.fasterxml.jackson.core.type.TypeReference<Map<String, Object>>(){}); Map<String, Object> dataMap = objectMapper.readValue(responseData, new com.fasterxml.jackson.core.type.TypeReference<Map<String, Object>>(){});
if (!dataMap.containsKey("genericResponse")) { if (!dataMap.containsKey("genericResponse")) {
@@ -501,7 +440,6 @@ public class AgentServiceImpl implements AgentService {
FetchBillValidateResponse responseWrapper = objectMapper.convertValue(dataMap, FetchBillValidateResponse.class); FetchBillValidateResponse responseWrapper = objectMapper.convertValue(dataMap, FetchBillValidateResponse.class);
GeneralResp generalResp = responseWrapper.getGenericResponse(); GeneralResp generalResp = responseWrapper.getGenericResponse();
// update inbound log and save validation data
helper.updateInboundLogSuccess(inboundLog, responseData, generalResp.getStatus()); helper.updateInboundLogSuccess(inboundLog, responseData, generalResp.getStatus());
helper.saveBillValidation(responseWrapper, billRequest); helper.saveBillValidation(responseWrapper, billRequest);
LOGGER.info("Bill validation saved successfully for billId: {}", billId); LOGGER.info("Bill validation saved successfully for billId: {}", billId);
@@ -515,9 +453,7 @@ public class AgentServiceImpl implements AgentService {
} }
} }
//... remaining methods unchanged except where headers/objectMapper were previously created (they now use buildHeaders() and the class-level objectMapper)
//================================== Bill fetch and Bill Validate by Client Req Id==================================//
@Override @Override
public ResponseModel fetchBillValidateByClientReqId(BillValidateByClientIdRequest billValidateByClientIdRequest) { public ResponseModel fetchBillValidateByClientReqId(BillValidateByClientIdRequest billValidateByClientIdRequest) {
@@ -536,16 +472,6 @@ public class AgentServiceImpl implements AgentService {
helper.validateMerchant(billValidateByClientIdRequest.getMid()); helper.validateMerchant(billValidateByClientIdRequest.getMid());
BharatConnectMaster headersData = beneficiaryDetailsRepository.findByOrgId("ORG001");
HttpHeaders headers = new HttpHeaders();
headers.set("x-digiledge-key", headersData.getXDigiledgeKey());
headers.set("agentId", headersData.getAgentId());
headers.set("tenantId", headersData.getTenantId());
headers.setContentType(MediaType.APPLICATION_JSON);
ObjectMapper objectMapper = new ObjectMapper();
// 🔵 Create Inbound + Outbound Logs
InboundTraceLog inboundLog = helper.createInboundLog(reqId, txnId, apiName, InboundTraceLog inboundLog = helper.createInboundLog(reqId, txnId, apiName,
billValidateByClientIdRequest.getMid(), "GET", null); billValidateByClientIdRequest.getMid(), "GET", null);
@@ -553,7 +479,7 @@ public class AgentServiceImpl implements AgentService {
try { try {
LOGGER.info("Calling BBPS API FetchBillValidateByClientReqId, URL={}", fullUrl); LOGGER.info("Calling BBPS API FetchBillValidateByClientReqId, URL={}", fullUrl);
Map<String, String> responseMap = httpService.getRequest(fullUrl, headers); Map<String, String> responseMap = httpService.getRequest(fullUrl, helper.buildHeaders(beneficiaryDetailsRepository.findByOrgId("ORG001")));
String responseData = responseMap.get("data"); String responseData = responseMap.get("data");
helper.updateOutboundLogResponse(outboundLog, responseData); helper.updateOutboundLogResponse(outboundLog, responseData);
@@ -601,16 +527,6 @@ public class AgentServiceImpl implements AgentService {
helper.validateMerchant(billFetchByClientIdRequest.getMid()); helper.validateMerchant(billFetchByClientIdRequest.getMid());
BharatConnectMaster headersData = beneficiaryDetailsRepository.findByOrgId("ORG001");
HttpHeaders headers = new HttpHeaders();
headers.set("x-digiledge-key", headersData.getXDigiledgeKey());
headers.set("agentId", headersData.getAgentId());
headers.set("tenantId", headersData.getTenantId());
headers.setContentType(MediaType.APPLICATION_JSON);
ObjectMapper objectMapper = new ObjectMapper();
// 🔵 Create inbound + outbound logs
InboundTraceLog inboundLog = helper.createInboundLog(reqId, txnId, apiName, billFetchByClientIdRequest.getMid(), InboundTraceLog inboundLog = helper.createInboundLog(reqId, txnId, apiName, billFetchByClientIdRequest.getMid(),
"GET", null); "GET", null);
@@ -618,7 +534,7 @@ public class AgentServiceImpl implements AgentService {
try { try {
LOGGER.info("Calling BBPS API FetchBillByClientReqId, URL={}", fullUrl); LOGGER.info("Calling BBPS API FetchBillByClientReqId, URL={}", fullUrl);
Map<String, String> responseMap = httpService.getRequest(fullUrl, headers); Map<String, String> responseMap = httpService.getRequest(fullUrl, helper.buildHeaders(beneficiaryDetailsRepository.findByOrgId("ORG001")));
String responseData = responseMap.get("data"); String responseData = responseMap.get("data");
helper.updateOutboundLogResponse(outboundLog, responseData); helper.updateOutboundLogResponse(outboundLog, responseData);
@@ -647,238 +563,30 @@ public class AgentServiceImpl implements AgentService {
throw new CustomException("Invalid JSON received from API"); throw new CustomException("Invalid JSON received from API");
} }
} }
//================================== End Bill fetch and Bill Validate by Client Req Id==================================//
//===================================Callback Methods BillFetch and BillValidate ==================================//
@Override @Override
public ResponseModel processBillFetchCallback(BillDataResponse billDataResponse) { public ResponseModel processBillFetchCallback(BillDataResponse billDataResponse) {
LOGGER.info("Recived Call Back from billDataResponse: {}", billDataResponse); LOGGER.info("Recived Call Back from billDataResponse: {}", billDataResponse);
if(billDataResponse.getGenericResponse().getStatusCode().equals("200")) { if(billDataResponse.getGenericResponse().getStatusCode().equals("200")) { }
}
else { else {
LOGGER.info("Bill Fetch Callback Failed with Status: {}", billDataResponse.getGenericResponse().getStatus()); LOGGER.info("Bill Fetch Callback Failed with Status: {}", billDataResponse.getGenericResponse().getStatus());
} }
return new ResponseModel("CallBack Recieved Successfully", return new ResponseModel("CallBack Recieved Successfully",
"200", "200",
200, 200,
""); "");
} }
@Override @Override
public ResponseModel processBillValidateCallback(FetchBillValidateResponse billValidateResponse) { public ResponseModel processBillValidateCallback(FetchBillValidateResponse billValidateResponse) {
LOGGER.info("Recived Call Back from FetchBillValidateResponse: {}", billValidateResponse); LOGGER.info("Recived Call Back from FetchBillValidateResponse: {}", billValidateResponse);
if(billValidateResponse.getGenericResponse().getStatusCode().equals("200")) { if(billValidateResponse.getGenericResponse().getStatusCode().equals("200")) { }
}
else { else {
LOGGER.info("Bill Fetch Callback Failed with Status: {}", billValidateResponse.getGenericResponse().getStatus()); LOGGER.info("Bill Fetch Callback Failed with Status: {}", billValidateResponse.getGenericResponse().getStatus());
} }
return new ResponseModel("CallBack Recieved Successfully", return new ResponseModel("CallBack Recieved Successfully",
"200", "200",
200, 200,
""); "");
}
}
}}
/*
* @Override public ResponseModel
* initiateBillValidate(FetchBillValidatestRequest fetchBillValidateRequest) {
*
* ResponseModel responseModel = new ResponseModel(); try {
*
* helper.validateMerchant(fetchBillValidateRequest.getMid());
*
* BharatConnectMaster headersData =
* beneficiaryDetailsRepository.findByOrgId("ORG001");
*
* if (headersData == null) { responseModel = new
* ResponseModel("Tenant Id Is Null", "Not Found", BBPSConstant.BADREQUEST,
* headersData); return responseModel; }
*
* HttpHeaders headers = new HttpHeaders(); headers.set("x-digiledge-key",
* headersData.getXDigiledgeKey()); headers.set("agentId",
* headersData.getAgentId()); headers.set("tenantId",
* headersData.getTenantId());
* headers.setContentType(MediaType.APPLICATION_JSON);
*
* ObjectMapper objectMapper = new ObjectMapper();
* objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); String
* json = objectMapper.writeValueAsString(fetchBillValidateRequest); String url
* = agentDtaUrl + BBPSConstant.BILLER_VALIDATE_URL;
*
* Map<String, String> responseMap = httpService.postRequest(url, json,
* headers); String responseData = responseMap.get("data");
*
* log.info("📦 Bill Fetch API Response: {}", responseData);
*
* if (responseData == null || responseData.isEmpty()) { throw new
* CustomException("Empty response from BBPS server"); }
*
* // ✅ Convert JSON string → Map Map<String, Object> dataMap =
* objectMapper.readValue(responseData, new TypeReference<Map<String, Object>>()
* {});
*
* // ✅ Validate generalResp if (!dataMap.containsKey("genericResponse")) {
* throw new CustomException("Invalid response structure from BBPS"); }
*
* // ✅ Convert to your custom DTO FetchBillValidatestResponse fetchBillResponse
* = objectMapper.convertValue(dataMap, FetchBillValidatestResponse.class);
* GeneralResp generalResponse = fetchBillResponse.getGenericResponse();
*
* // ✅ Build final ResponseModel responseModel = new ResponseModel(
* generalResponse.getMessage(), generalResponse.getStatus(),
* Integer.parseInt(generalResponse.getStatusCode()), fetchBillResponse );
*
* } catch (CustomException ex) { log.warn("Merchant validation failed: {}",
* ex.getMessage()); return ex.getResponseModel(); // Directly return
* ResponseModel from exception } catch (Exception e) {
* log.error("❌ Exception in initiateBillFetch(): {}", e.getMessage(), e);
* responseModel.setStatus("500");
* responseModel.setMessage("Exception occurred");
* responseModel.setData(e.getMessage()); }
*
* return responseModel; }
*
* @Override public ResponseModel
* initiateBillValidateByBillId(BillFetchByBillIdRequest billRequest) {
*
* ResponseModel responseModel = new ResponseModel(); try {
* helper.validateMerchant(billRequest.getMid());
*
* BharatConnectMaster headersData =
* beneficiaryDetailsRepository.findByOrgId("ORG001");
*
* if (headersData == null) { responseModel = new
* ResponseModel("Tenant Id Is Null", "Not Found", BBPSConstant.BADREQUEST,
* headersData); return responseModel; }
*
* HttpHeaders headers = new HttpHeaders(); headers.set("x-digiledge-key",
* headersData.getXDigiledgeKey()); headers.set("agentId",
* headersData.getAgentId()); headers.set("tenantId",
* headersData.getTenantId());
* headers.setContentType(MediaType.APPLICATION_JSON);
*
* ObjectMapper objectMapper = new ObjectMapper();
* objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); String
* json = objectMapper.writeValueAsString(billRequest); String url = agentDtaUrl
* + BBPSConstant.BILL_ID_URL + billRequest.getBillId();
*
* log.info("Full URL: {}", url);
* objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
*
* // ✅ Call the API using httpService Map<String, String> responseMap =
* httpService.getRequest(url, headers); String responseData =
* responseMap.get("data");
*
* log.info("📦 Bill Fetch API Response: {}", responseData);
*
* if (responseData == null || responseData.isEmpty()) { throw new
* CustomException("Empty response from BBPS server"); }
*
* // ✅ Convert JSON string → Map Map<String, Object> dataMap =
* objectMapper.readValue(responseData, new TypeReference<Map<String, Object>>()
* {});
*
* // ✅ Validate generalResp if (!dataMap.containsKey("genericResponse")) {
* throw new CustomException("Invalid response structure from BBPS"); }
*
* // ✅ Convert to your custom DTO BillDataResponse fetchBillResponse =
* objectMapper.convertValue(dataMap, BillDataResponse.class); GeneralResp
* generalResponse = fetchBillResponse.getGenericResponse();
*
* // ✅ Build final ResponseModel responseModel = new ResponseModel(
* generalResponse.getRemarks(), generalResponse.getStatus(),
* Integer.parseInt(generalResponse.getStatusCode()), fetchBillResponse );
*
* } catch (CustomException ex) { log.warn("Merchant validation failed: {}",
* ex.getMessage()); return ex.getResponseModel(); // Directly return
* ResponseModel from exception } catch (Exception e) {
* log.error("❌ Exception in initiateBillFetch(): {}", e.getMessage(), e);
* responseModel.setStatus("500");
* responseModel.setMessage("Exception occurred");
* responseModel.setData(e.getMessage()); }
*
* return responseModel; }
*/
/*
* POLLING METHOD public ResponseModel fetchBillById(BillFetchByBillIdRequest
* billFetchByBillIdRequest, InboundTraceLog inboundLog) { String apiName =
* "FetchBillById"; String txnId = helper.generateTxnId(15); String reqId =
* billFetchByBillIdRequest.getReqId(); String billId =
* billFetchByBillIdRequest.getBillId(); String url = agentDtaUrl +
* BBPSConstant.BILL_FETCH_BY_ID + "1ced7566-1add-4e01-9ed6-04cd67ac9684";
*
* helper.validateMerchant(billFetchByBillIdRequest.getMid());
*
* BharatConnectMaster headersData =
* beneficiaryDetailsRepository.findByOrgId("ORG001"); HttpHeaders headers = new
* HttpHeaders(); headers.set("x-digiledge-key",
* headersData.getXDigiledgeKey()); headers.set("agentId",
* headersData.getAgentId()); headers.set("tenantId",
* headersData.getTenantId());
* headers.setContentType(MediaType.APPLICATION_JSON);
*
* ObjectMapper objectMapper = new ObjectMapper(); OutboundTraceLog outboundLog
* = helper.createOutboundLog(txnId, reqId, apiName, url, "GET", null);
*
* // ✅ Loop setup long startTime = System.currentTimeMillis(); long
* maxWaitTimeMs = 40000; // 40 seconds long intervalMs = 5000; // 5 seconds
*
* while (true) { try { Map<String, String> responseMap =
* httpService.getRequest(url, headers); String responseData =
* responseMap.get("data"); log.info("📦 Bill FetchById Response: {}",
* responseData);
*
* helper.updateOutboundLogResponse(outboundLog, responseData);
*
* Map<String, Object> dataMap = objectMapper.readValue(responseData, new
* TypeReference<Map<String, Object>>() {});
*
* if (!dataMap.containsKey("genericResponse")) {
* helper.updateInboundLogFailure(inboundLog, responseData, "INVALID_RESPONSE");
* throw new CustomException( String.valueOf(dataMap.get("message")),
* String.valueOf(dataMap.get("status")),
* Integer.parseInt(String.valueOf(dataMap.get("statusCode"))),
* String.valueOf(dataMap.get("remarks")) ); }
*
* BillDataResponse responseWrapper = objectMapper.convertValue(dataMap,
* BillDataResponse.class); GeneralResp generalResp =
* responseWrapper.getGenericResponse();
*
* String status = generalResp.getStatus();
* log.info("📡 Current Bill Status: {}", status); // ✅ Check for "INPROGRESS"
* or pending state if ("INPROGRESS".equalsIgnoreCase(status)) { if
* (System.currentTimeMillis() - startTime > maxWaitTimeMs) {
* helper.updateInboundLogFailure(inboundLog, "Timeout after 40 seconds",
* "FAILED"); throw new CustomException("Timeout", "FAILED", 408,
* "Bill fetch still in progress"); } Thread.sleep(intervalMs); continue; //
* retry again } // ✅ Final successful response
* helper.updateInboundLogSuccess(inboundLog, responseData,
* generalResp.getStatus()); return new ResponseModel( generalResp.getMessage(),
* generalResp.getStatus(), Integer.parseInt(generalResp.getStatusCode()),
* responseWrapper ); } catch (JsonProcessingException e) {
* log.error("Error parsing BillById JSON: {}", e.getMessage());
* helper.updateInboundLogFailure(inboundLog, e.getMessage(), "JSON_ERROR");
* throw new CustomException("Invalid JSON received from API"); } catch
* (InterruptedException e) { Thread.currentThread().interrupt();
* helper.updateInboundLogFailure(inboundLog, e.getMessage(), "INTERRUPTED");
* throw new CustomException("Thread interrupted during bill status check"); } }
* }
*/
@@ -1,3 +1,4 @@
// language: java
package com.billpaymentservice.bbps.serviceImpl; package com.billpaymentservice.bbps.serviceImpl;
import java.util.List; import java.util.List;
@@ -19,13 +20,11 @@ import com.billpaymentservice.bbps.dto.request.ComplaintRequestDTO;
import com.billpaymentservice.bbps.dto.request.GetTicketLatestStausRequest; import com.billpaymentservice.bbps.dto.request.GetTicketLatestStausRequest;
import com.billpaymentservice.bbps.dto.request.TxnStatusRequest; import com.billpaymentservice.bbps.dto.request.TxnStatusRequest;
import com.billpaymentservice.bbps.dto.request.ViewAllComplaintsTicketsRequest; import com.billpaymentservice.bbps.dto.request.ViewAllComplaintsTicketsRequest;
import com.billpaymentservice.bbps.dto.request.ViewAllComplaintsRequest; import com.billpaymentservice.bbps.dto.request.ViewAllComplaintsRequest;
import com.billpaymentservice.bbps.dto.response.ComplaintHistoryStatusResponse; import com.billpaymentservice.bbps.dto.response.ComplaintHistoryStatusResponse;
import com.billpaymentservice.bbps.dto.response.ComplaintResponse; import com.billpaymentservice.bbps.dto.response.ComplaintResponse;
import com.billpaymentservice.bbps.dto.response.TicketCheckStatusResponse; import com.billpaymentservice.bbps.dto.response.TicketCheckStatusResponse;
import com.billpaymentservice.bbps.dto.response.TxnStatusResponse; import com.billpaymentservice.bbps.dto.response.TxnStatusResponse;
import com.billpaymentservice.bbps.dto.response.ViewAllComplaintsTicketsResponse; import com.billpaymentservice.bbps.dto.response.ViewAllComplaintsTicketsResponse;
import com.billpaymentservice.bbps.dto.response.ViewAllComplaintsResponse; import com.billpaymentservice.bbps.dto.response.ViewAllComplaintsResponse;
import com.billpaymentservice.bbps.dto.response.ViewComplainByIdResponse; import com.billpaymentservice.bbps.dto.response.ViewComplainByIdResponse;
@@ -64,8 +63,9 @@ public class ComplainServiceImpl implements ComplainService {
private final ComplainRepository complainRepository; private final ComplainRepository complainRepository;
private final ComplaintOptionsStatusMasterRepository complaintStatusMasterRepository; private final ComplaintOptionsStatusMasterRepository complaintStatusMasterRepository;
private final ObjectMapper objectMapper = new ObjectMapper(); // moved to class-level
private static final Logger LOGGER = LoggerFactory.getLogger(AgentServiceImpl.class); private final ObjectMapper objectMapper;
private static final Logger LOGGER = LoggerFactory.getLogger(ComplainServiceImpl.class);
public ComplainServiceImpl(RestClient restClient, HttpService httpService, Helper helper, public ComplainServiceImpl(RestClient restClient, HttpService httpService, Helper helper,
BharatConnectMasterRepository beneficiaryDetailsRepository, BillerMapperHelper mapperHelper, BharatConnectMasterRepository beneficiaryDetailsRepository, BillerMapperHelper mapperHelper,
@@ -78,6 +78,10 @@ public class ComplainServiceImpl implements ComplainService {
this.mapperHelper = mapperHelper; this.mapperHelper = mapperHelper;
this.complainRepository = complainRepository; this.complainRepository = complainRepository;
this.complaintStatusMasterRepository = complaintStatusMasterRepository; this.complaintStatusMasterRepository = complaintStatusMasterRepository;
// initialize shared ObjectMapper once
this.objectMapper = new ObjectMapper();
this.objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
} }
@Override @Override
@@ -99,11 +103,7 @@ public class ComplainServiceImpl implements ComplainService {
// Fetch tenant & agent from DB // Fetch tenant & agent from DB
BharatConnectMaster headersData = beneficiaryDetailsRepository.findByOrgId("ORG001"); BharatConnectMaster headersData = beneficiaryDetailsRepository.findByOrgId("ORG001");
HttpHeaders headers = new HttpHeaders(); HttpHeaders headers = helper.buildHeaders(headersData);
headers.set("x-digiledge-key", headersData.getXDigiledgeKey());
headers.set("agentId", headersData.getAgentId());
headers.set("tenantId", headersData.getTenantId());
headers.setContentType(MediaType.APPLICATION_JSON);
InboundTraceLog inboundLog = helper.createInboundLog(requestId, txnId, apiName, complainRequestDTO.getMid(), InboundTraceLog inboundLog = helper.createInboundLog(requestId, txnId, apiName, complainRequestDTO.getMid(),
"POST", requestJson); "POST", requestJson);
@@ -180,11 +180,7 @@ public class ComplainServiceImpl implements ComplainService {
BharatConnectMaster headersData = beneficiaryDetailsRepository.findByOrgId("ORG001"); BharatConnectMaster headersData = beneficiaryDetailsRepository.findByOrgId("ORG001");
HttpHeaders headers = new HttpHeaders(); HttpHeaders headers = helper.buildHeaders(headersData);
headers.set("x-digiledge-key", headersData.getXDigiledgeKey());
headers.set("agentId", headersData.getAgentId());
headers.set("tenantId", headersData.getTenantId());
headers.setContentType(MediaType.APPLICATION_JSON);
// Convert request to JSON // Convert request to JSON
String requestJson = helper.convertObjectToJson(request); String requestJson = helper.convertObjectToJson(request);
@@ -215,11 +211,11 @@ public class ComplainServiceImpl implements ComplainService {
int end = responseData.lastIndexOf("}"); int end = responseData.lastIndexOf("}");
if (start != -1 && end != -1) { if (start != -1 && end != -1) {
responseData = responseData.substring(start, end + 1); responseData = responseData.substring(start, end + 1);
LOGGER.info("Extracted Clean JSON: {}", responseData);
}
} }
// Convert JSON to Map LOGGER.info("Extracted pure JSON from error: {}", responseData);
}
Map<String, Object> dataMap = objectMapper.readValue(responseData, Map<String, Object> dataMap = objectMapper.readValue(responseData,
new TypeReference<Map<String, Object>>() { new TypeReference<Map<String, Object>>() {
}); });
@@ -231,25 +227,17 @@ public class ComplainServiceImpl implements ComplainService {
statusCode, String.valueOf(dataMap.get("remarks"))); statusCode, String.valueOf(dataMap.get("remarks")));
} }
TicketCheckStatusResponse responseWrapper = objectMapper.convertValue(dataMap, TicketCheckStatusResponse responseWrapper = objectMapper.convertValue(dataMap, TicketCheckStatusResponse.class);
TicketCheckStatusResponse.class);
LOGGER.info("Complaint Current Status: {}", responseWrapper.getStatus());
helper.updateInboundLogSuccess(inboundLog, responseData, responseWrapper.getStatus()); helper.updateInboundLogSuccess(inboundLog, responseData, responseWrapper.getStatus());
// Save in DB
mapperHelper.saveComplaintStatus(responseWrapper, reqId, txnId);
return new ResponseModel(responseWrapper.getMessage(), responseWrapper.getStatus(), return new ResponseModel(responseWrapper.getMessage(), responseWrapper.getStatus(),
Integer.parseInt(responseWrapper.getStatusCode()), responseWrapper); Integer.parseInt(responseWrapper.getStatusCode()), responseWrapper);
} catch (JsonProcessingException e) { } catch (JsonProcessingException e) {
LOGGER.error("Error parsing JSON in complaint status API: {}", e.getMessage(), e);
LOGGER.error("Error parsing Complaint Status JSON: {}", e.getMessage());
helper.updateInboundLogFailure(inboundLog, e.getMessage(), "JSON_ERROR"); helper.updateInboundLogFailure(inboundLog, e.getMessage(), "JSON_ERROR");
throw new CustomException("Invalid JSON received from API"); throw new CustomException("Invalid JSON received from API");
} }
} }
@@ -266,14 +254,8 @@ public class ComplainServiceImpl implements ComplainService {
helper.validateMerchant(request.getMid()); helper.validateMerchant(request.getMid());
BharatConnectMaster headersData = beneficiaryDetailsRepository.findByOrgId("ORG001"); BharatConnectMaster headersData = beneficiaryDetailsRepository.findByOrgId("ORG001");
HttpHeaders headers = new HttpHeaders(); HttpHeaders headers = helper.buildHeaders(headersData);
headers.set("x-digiledge-key", headersData.getXDigiledgeKey());
headers.set("agentId", headersData.getAgentId());
headers.set("tenantId", headersData.getTenantId());
headers.setContentType(MediaType.APPLICATION_JSON);
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
String requestJson = helper.convertObjectToJson(request); String requestJson = helper.convertObjectToJson(request);
InboundTraceLog inboundLog = helper.createInboundLog(reqId, txnId, apiName, request.getMid(), "GET", InboundTraceLog inboundLog = helper.createInboundLog(reqId, txnId, apiName, request.getMid(), "GET",
@@ -333,14 +315,8 @@ public class ComplainServiceImpl implements ComplainService {
helper.validateMerchant(request.getMid()); helper.validateMerchant(request.getMid());
BharatConnectMaster headersData = beneficiaryDetailsRepository.findByOrgId("ORG001"); BharatConnectMaster headersData = beneficiaryDetailsRepository.findByOrgId("ORG001");
HttpHeaders headers = new HttpHeaders(); HttpHeaders headers = helper.buildHeaders(headersData);
headers.set("x-digiledge-key", headersData.getXDigiledgeKey());
headers.set("agentId", headersData.getAgentId());
headers.set("tenantId", headersData.getTenantId());
headers.setContentType(MediaType.APPLICATION_JSON);
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
String requestJson = helper.convertObjectToJson(request); String requestJson = helper.convertObjectToJson(request);
InboundTraceLog inboundLog = helper.createInboundLog(reqId, txnId, apiName, request.getMid(), "GET", InboundTraceLog inboundLog = helper.createInboundLog(reqId, txnId, apiName, request.getMid(), "GET",
@@ -442,14 +418,8 @@ public class ComplainServiceImpl implements ComplainService {
helper.validateMerchant(request.getMid()); helper.validateMerchant(request.getMid());
BharatConnectMaster headersData = beneficiaryDetailsRepository.findByOrgId("ORG001"); BharatConnectMaster headersData = beneficiaryDetailsRepository.findByOrgId("ORG001");
HttpHeaders headers = new HttpHeaders(); HttpHeaders headers = helper.buildHeaders(headersData);
headers.set("x-digiledge-key", headersData.getXDigiledgeKey());
headers.set("agentId", headersData.getAgentId());
headers.set("tenantId", headersData.getTenantId());
headers.setContentType(MediaType.APPLICATION_JSON);
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
String requestJson = helper.convertObjectToJson(request); String requestJson = helper.convertObjectToJson(request);
InboundTraceLog inboundLog = helper.createInboundLog(reqId, txnId, apiName, request.getMid(), "GET", InboundTraceLog inboundLog = helper.createInboundLog(reqId, txnId, apiName, request.getMid(), "GET",
@@ -508,14 +478,8 @@ public class ComplainServiceImpl implements ComplainService {
helper.validateMerchant(request.getMid()); helper.validateMerchant(request.getMid());
BharatConnectMaster headersData = beneficiaryDetailsRepository.findByOrgId("ORG001"); BharatConnectMaster headersData = beneficiaryDetailsRepository.findByOrgId("ORG001");
HttpHeaders headers = new HttpHeaders(); HttpHeaders headers = helper.buildHeaders(headersData);
headers.set("x-digiledge-key", headersData.getXDigiledgeKey());
headers.set("agentId", headersData.getAgentId());
headers.set("tenantId", headersData.getTenantId());
headers.setContentType(MediaType.APPLICATION_JSON);
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
String requestJson = helper.convertObjectToJson(request); String requestJson = helper.convertObjectToJson(request);
InboundTraceLog inboundLog = helper.createInboundLog(reqId, txnId, apiName, request.getMid(), "POST", InboundTraceLog inboundLog = helper.createInboundLog(reqId, txnId, apiName, request.getMid(), "POST",
@@ -1,4 +1,3 @@
// java
package com.billpaymentservice.bbps.serviceImpl; package com.billpaymentservice.bbps.serviceImpl;
import java.util.List; import java.util.List;
@@ -10,6 +9,8 @@ import org.modelmapper.convention.MatchingStrategies;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import com.billpaymentservice.bbps.dto.ContactMaster; import com.billpaymentservice.bbps.dto.ContactMaster;
@@ -56,6 +57,7 @@ import com.billpaymentservice.bbps.util.BBPSConstant;
import com.billpaymentservice.bbps.util.BillerMapperHelper; import com.billpaymentservice.bbps.util.BillerMapperHelper;
import com.billpaymentservice.bbps.util.EntityRelationshipUtil; import com.billpaymentservice.bbps.util.EntityRelationshipUtil;
import com.billpaymentservice.bbps.util.Helper; import com.billpaymentservice.bbps.util.Helper;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectMapper;
@@ -76,7 +78,7 @@ public class MasterDataServiceImpl implements MasterDataService {
private final Helper helper; private final Helper helper;
private final BillerDataRepository billerDataRespository; private final BillerDataRepository billerDataRespository;
private final HttpService httpService; private final HttpService httpService;
private final ObjectMapper objectMapper = new ObjectMapper(); private final ObjectMapper objectMapper;
private final InboundTraceLogRepository inboundTraceLogRepository; private final InboundTraceLogRepository inboundTraceLogRepository;
private final OutboundTraceLogRepository outboundTraceLogRepository; private final OutboundTraceLogRepository outboundTraceLogRepository;
private final CustomParamRepository customParamReposiotory; private final CustomParamRepository customParamReposiotory;
@@ -98,6 +100,8 @@ public class MasterDataServiceImpl implements MasterDataService {
this.mapperHelper = mapperHelper; this.mapperHelper = mapperHelper;
this.customParamReposiotory = customParamReposiotory; this.customParamReposiotory = customParamReposiotory;
this.objectMapper = new ObjectMapper();
this.objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
} }
@Override @Override
@@ -112,7 +116,7 @@ public class MasterDataServiceImpl implements MasterDataService {
try { try {
// Merchant Validation // Merchant Validation
helper.validateMerchant(masterRequest.getMid()); helper.validateMerchant(masterRequest.getMid());
// check Tender Id is present DB // check Tenant Id is present DB
BharatConnectMaster headersData = beneficiaryDetailsRepository.findByOrgId("ORG001"); BharatConnectMaster headersData = beneficiaryDetailsRepository.findByOrgId("ORG001");
if (headersData == null) { if (headersData == null) {
LOGGER.warn("header data not found for the orgID"); LOGGER.warn("header data not found for the orgID");
@@ -122,10 +126,10 @@ public class MasterDataServiceImpl implements MasterDataService {
String fullUrl = masterRegisterUrl + BBPSConstant.MASTER_CATEGORY_URL + headersData.getTenantId(); String fullUrl = masterRegisterUrl + BBPSConstant.MASTER_CATEGORY_URL + headersData.getTenantId();
LOGGER.info("Calling external API: {}", fullUrl); LOGGER.info("Calling external API: {}", fullUrl);
OutboundTraceLog outboundLog = helper.createOutboundLog(txnID, requestId, apiName, fullUrl, "GET", null); OutboundTraceLog outboundLog = helper.createOutboundLog(txnID, requestId, apiName, fullUrl, "GET", null);
Map<String, String> responseMap = httpService.getRequest(fullUrl); HttpHeaders headers = helper.buildHeaders(headersData);
Map<String, String> responseMap = httpService.getRequest(fullUrl, headers);
String responseData = responseMap.get("data"); String responseData = responseMap.get("data");
// LOGGER.info("Response Data: {}", responseData);
helper.updateOutboundLogResponse(outboundLog, responseData); helper.updateOutboundLogResponse(outboundLog, responseData);
Map<String, Object> dataMap = objectMapper.readValue(responseData, Map<String, Object> dataMap = objectMapper.readValue(responseData,
new TypeReference<Map<String, Object>>() { new TypeReference<Map<String, Object>>() {
@@ -290,7 +294,8 @@ public class MasterDataServiceImpl implements MasterDataService {
LOGGER.info("Contact Master Full URL-:" + fullUrl); LOGGER.info("Contact Master Full URL-:" + fullUrl);
OutboundTraceLog outboundLog = helper.createOutboundLog(txnID, requestId, apiName, fullUrl, "GET", null); OutboundTraceLog outboundLog = helper.createOutboundLog(txnID, requestId, apiName, fullUrl, "GET", null);
Map<String, String> responseMap = httpService.getRequest(fullUrl); HttpHeaders headers = helper.buildHeaders(headersData);
Map<String, String> responseMap = httpService.getRequest(fullUrl, headers);
String responseData = responseMap.get("data"); String responseData = responseMap.get("data");
LOGGER.info("Response Data: {}", responseData); LOGGER.info("Response Data: {}", responseData);
@@ -407,8 +412,6 @@ public class MasterDataServiceImpl implements MasterDataService {
helper.updateOutboundLogResponse(outboundLog, responseData); helper.updateOutboundLogResponse(outboundLog, responseData);
try { try {
ObjectMapper objectMapper = new ObjectMapper();
Map<String, Object> dataMap = objectMapper.readValue(responseData, Map<String, Object> dataMap = objectMapper.readValue(responseData,
new TypeReference<Map<String, Object>>() { new TypeReference<Map<String, Object>>() {
}); });
@@ -750,8 +753,6 @@ public class MasterDataServiceImpl implements MasterDataService {
helper.updateOutboundLogResponse(outboundLog, responseData); helper.updateOutboundLogResponse(outboundLog, responseData);
try { try {
ObjectMapper objectMapper = new ObjectMapper();
Map<String, Object> dataMap = objectMapper.readValue(responseData, Map<String, Object> dataMap = objectMapper.readValue(responseData,
new TypeReference<Map<String, Object>>() { new TypeReference<Map<String, Object>>() {
}); });
@@ -1,3 +1,4 @@
// PaymentServiceImpl.java
package com.billpaymentservice.bbps.serviceImpl; package com.billpaymentservice.bbps.serviceImpl;
import java.util.Map; import java.util.Map;
@@ -59,6 +60,10 @@ public class PaymentServiceImpl implements PaymentService {
private final TransactionMasterRepository transactionMasterRepository; private final TransactionMasterRepository transactionMasterRepository;
private final AgentFundTransferRepository agentFundTransferRepository; private final AgentFundTransferRepository agentFundTransferRepository;
// Shared reusable instances
private final ObjectMapper objectMapper;
private final ModelMapper modelMapper;
private static final Logger LOGGER = LoggerFactory.getLogger(PaymentServiceImpl.class); private static final Logger LOGGER = LoggerFactory.getLogger(PaymentServiceImpl.class);
public PaymentServiceImpl(BharatConnectMasterRepository beneficiaryDetailsRepository, HttpService httpService, public PaymentServiceImpl(BharatConnectMasterRepository beneficiaryDetailsRepository, HttpService httpService,
@@ -75,6 +80,12 @@ public class PaymentServiceImpl implements PaymentService {
this.paymentIntiateRepository = paymentIntiateRepository; this.paymentIntiateRepository = paymentIntiateRepository;
this.transactionMasterRepository = transactionMasterRepository; this.transactionMasterRepository = transactionMasterRepository;
this.agentFundTransferRepository = agentFundTransferRepository; this.agentFundTransferRepository = agentFundTransferRepository;
this.objectMapper = new ObjectMapper();
this.objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
this.modelMapper = new ModelMapper();
this.modelMapper.getConfiguration().setMatchingStrategy(MatchingStrategies.STRICT);
} }
@Override @Override
@@ -87,20 +98,10 @@ public class PaymentServiceImpl implements PaymentService {
LOGGER.info("Initiating payment for reqId={} and txnId={}", requestId, txnId); LOGGER.info("Initiating payment for reqId={} and txnId={}", requestId, txnId);
BharatConnectMaster headersData = beneficiaryDetailsRepository.findByOrgId("ORG001"); BharatConnectMaster headersData = beneficiaryDetailsRepository.findByOrgId("ORG001");
HttpHeaders headers = new HttpHeaders(); HttpHeaders headers = helper.buildHeaders(headersData);
headers.set("x-digiledge-key", headersData.getXDigiledgeKey());
headers.set("agentId", headersData.getAgentId());
headers.set("tenantId", headersData.getTenantId());
headers.setContentType(MediaType.APPLICATION_JSON);
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
BillPaymentForwardRequest forwardReq =
helper.billPaymentForwardRequest(billPaymentRequest);
BillPaymentForwardRequest forwardReq = helper.billPaymentForwardRequest(billPaymentRequest);
String forwardjson = helper.convertObjectToJson(forwardReq); String forwardjson = helper.convertObjectToJson(forwardReq);
String requestJson = helper.convertObjectToJson(billPaymentRequest); String requestJson = helper.convertObjectToJson(billPaymentRequest);
InboundTraceLog inboundLog = helper.createInboundLog(requestId, txnId, apiName, billPaymentRequest.getMid(), "POST", requestJson); InboundTraceLog inboundLog = helper.createInboundLog(requestId, txnId, apiName, billPaymentRequest.getMid(), "POST", requestJson);
@@ -130,9 +131,7 @@ public class PaymentServiceImpl implements PaymentService {
BillPaymentResponse billPaymentResponse = objectMapper.convertValue(dataMap, BillPaymentResponse.class); BillPaymentResponse billPaymentResponse = objectMapper.convertValue(dataMap, BillPaymentResponse.class);
GeneralResp generalResponse = billPaymentResponse.getGenericResponse(); GeneralResp generalResponse = billPaymentResponse.getGenericResponse();
ModelMapper mapper = new ModelMapper(); BillPayment entity = modelMapper.map(billPaymentResponse, BillPayment.class);
mapper.getConfiguration().setMatchingStrategy(MatchingStrategies.STRICT);
BillPayment entity = mapper.map(billPaymentResponse, BillPayment.class);
paymentRepository.save(entity); paymentRepository.save(entity);
LOGGER.info("BillPayment entity saved successfully for txnId={}", txnId); LOGGER.info("BillPayment entity saved successfully for txnId={}", txnId);
@@ -170,19 +169,13 @@ public class PaymentServiceImpl implements PaymentService {
String txnId = helper.generateTxnId(15); String txnId = helper.generateTxnId(15);
String requestId = transactionStatusRequest.getReqId(); String requestId = transactionStatusRequest.getReqId();
String url = paymentUrl + BBPSConstant.CHECK_TRANSACTION_URL + transactionStatusRequest.getTxnId(); String url = paymentUrl + BBPSConstant.CHECK_TRANSACTION_URL + transactionStatusRequest.getTxnId();
LOGGER.info("Checking transaction status (internal) for txnId={} and reqId={}", transactionStatusRequest.getTxnId(), requestId); LOGGER.info("Checking transaction status (internal) for txnId={} and reqId={}", transactionStatusRequest.getTxnId(), requestId);
BharatConnectMaster headersData = beneficiaryDetailsRepository.findByOrgId("ORG001"); BharatConnectMaster headersData = beneficiaryDetailsRepository.findByOrgId("ORG001");
HttpHeaders headers = new HttpHeaders(); HttpHeaders headers = helper.buildHeaders(headersData);
headers.set("x-digiledge-key", headersData.getXDigiledgeKey());
headers.set("agentId", headersData.getAgentId());
headers.set("tenantId", headersData.getTenantId());
headers.setContentType(MediaType.APPLICATION_JSON);
ObjectMapper objectMapper = new ObjectMapper();
OutboundTraceLog outboundLog = helper.createOutboundLog(txnId, requestId, apiName, url, "GET", null); OutboundTraceLog outboundLog = helper.createOutboundLog(txnId, requestId, apiName, url, "GET", null);
Map<String, String> responseMap = httpService.getRequest(url, headers); Map<String, String> responseMap = httpService.getRequest(url, headers);
@@ -208,16 +201,14 @@ public class PaymentServiceImpl implements PaymentService {
GeneralResp generalResp = responseWrapper.getGeneralResp(); GeneralResp generalResp = responseWrapper.getGeneralResp();
LOGGER.info("Transaction status received: {}", generalResp.getStatus()); LOGGER.info("Transaction status received: {}", generalResp.getStatus());
ModelMapper mapper = new ModelMapper(); TransactionMaster transactionMaster = modelMapper.map(responseWrapper.getTransactionDAO(), TransactionMaster.class);
mapper.getConfiguration().setMatchingStrategy(MatchingStrategies.STRICT);
TransactionMaster transactionMaster = mapper.map(responseWrapper.getTransactionDAO(), TransactionMaster.class);
transactionMaster.setTxnId(txnId); transactionMaster.setTxnId(txnId);
transactionMaster.setReqId(transactionStatusRequest.getReqId()); transactionMaster.setReqId(transactionStatusRequest.getReqId());
EntityRelationshipUtil.linkTransactionMasterRelationships(transactionMaster); EntityRelationshipUtil.linkTransactionMasterRelationships(transactionMaster);
transactionMasterRepository.save(transactionMaster); transactionMasterRepository.save(transactionMaster);
LOGGER.info("TransactionMaster saved successfully for txnId={}", txnId); LOGGER.info("TransactionMaster saved successfully for txnId={}", txnId);
AgentFundTransfer agentFundTransfer = mapper.map(responseWrapper.getAgentFundTransfer(), AgentFundTransfer.class); AgentFundTransfer agentFundTransfer = modelMapper.map(responseWrapper.getAgentFundTransfer(), AgentFundTransfer.class);
agentFundTransfer.setTxnId(txnId); agentFundTransfer.setTxnId(txnId);
agentFundTransfer.setReqId(transactionStatusRequest.getReqId()); agentFundTransfer.setReqId(transactionStatusRequest.getReqId());
agentFundTransfer.setTransactionMasterId(transactionMaster.getBankTxnId()); agentFundTransfer.setTransactionMasterId(transactionMaster.getBankTxnId());
@@ -253,15 +244,10 @@ public class PaymentServiceImpl implements PaymentService {
LOGGER.info("Checking transaction status (public) for txnId={} and reqId={}", transactionStatusRequest.getTxnId(), requestId); LOGGER.info("Checking transaction status (public) for txnId={} and reqId={}", transactionStatusRequest.getTxnId(), requestId);
BharatConnectMaster headersData = beneficiaryDetailsRepository.findByOrgId("ORG001"); BharatConnectMaster headersData = beneficiaryDetailsRepository.findByOrgId("ORG001");
HttpHeaders headers = new HttpHeaders(); HttpHeaders headers = helper.buildHeaders(headersData);
headers.set("x-digiledge-key", headersData.getXDigiledgeKey());
headers.set("agentId", headersData.getAgentId());
headers.set("tenantId", headersData.getTenantId());
headers.setContentType(MediaType.APPLICATION_JSON);
InboundTraceLog inboundLog = helper.createInboundLog(requestId, txnID, apiName, transactionStatusRequest.getMid(), "POST", requestJson); InboundTraceLog inboundLog = helper.createInboundLog(requestId, txnID, apiName, transactionStatusRequest.getMid(), "POST", requestJson);
OutboundTraceLog outboundLog = helper.createOutboundLog(txnID, requestId, apiName, url, "GET", null); OutboundTraceLog outboundLog = helper.createOutboundLog(txnID, requestId, apiName, url, "GET", null);
ObjectMapper objectMapper = new ObjectMapper();
Map<String, String> responseMap = httpService.getRequest(url, headers); Map<String, String> responseMap = httpService.getRequest(url, headers);
String responseData = responseMap.get("data"); String responseData = responseMap.get("data");
@@ -304,8 +290,6 @@ public class PaymentServiceImpl implements PaymentService {
} }
} }
@Override @Override
public ResponseModel checkTrasactionStatusByClientReqId(TrasactionStatusByClientReqIdRequest transactionStatusRequest) { public ResponseModel checkTrasactionStatusByClientReqId(TrasactionStatusByClientReqIdRequest transactionStatusRequest) {
@@ -319,7 +303,6 @@ public class PaymentServiceImpl implements PaymentService {
LOGGER.info("Checking transaction status for clientReqId={} and reqId={}", clientReqId, requestId); LOGGER.info("Checking transaction status for clientReqId={} and reqId={}", clientReqId, requestId);
// Fetch Txn from DB
Optional<PaymentInitiate> paymentInitiate = paymentIntiateRepository.findByReqId(clientReqId); Optional<PaymentInitiate> paymentInitiate = paymentIntiateRepository.findByReqId(clientReqId);
if (paymentInitiate.isEmpty()) { if (paymentInitiate.isEmpty()) {
throw new CustomException("No Transaction Found for given Client Req Id"); throw new CustomException("No Transaction Found for given Client Req Id");
@@ -327,24 +310,15 @@ public class PaymentServiceImpl implements PaymentService {
String url = paymentUrl + BBPSConstant.CHECK_TRANSACTION_BY_CLIENT_REQ_ID_URL + paymentInitiate.get().getTxnId(); String url = paymentUrl + BBPSConstant.CHECK_TRANSACTION_BY_CLIENT_REQ_ID_URL + paymentInitiate.get().getTxnId();
// Prepare headers
BharatConnectMaster headersData = beneficiaryDetailsRepository.findByOrgId("ORG001"); BharatConnectMaster headersData = beneficiaryDetailsRepository.findByOrgId("ORG001");
HttpHeaders headers = new HttpHeaders(); HttpHeaders headers = helper.buildHeaders(headersData);
headers.set("x-digiledge-key", headersData.getXDigiledgeKey());
headers.set("agentId", headersData.getAgentId());
headers.set("tenantId", headersData.getTenantId());
headers.setContentType(MediaType.APPLICATION_JSON);
// 🔵 Create Inbound + Outbound Logs
InboundTraceLog inboundLog = helper.createInboundLog( InboundTraceLog inboundLog = helper.createInboundLog(
requestId, txnID, apiName, transactionStatusRequest.getMid(), "POST", requestJson); requestId, txnID, apiName, transactionStatusRequest.getMid(), "POST", requestJson);
OutboundTraceLog outboundLog = helper.createOutboundLog( OutboundTraceLog outboundLog = helper.createOutboundLog(
txnID, requestId, apiName, url, "GET", null); txnID, requestId, apiName, url, "GET", null);
ObjectMapper objectMapper = new ObjectMapper();
try { try {
LOGGER.info("Calling BBPS Transaction Status API URL={}", url); LOGGER.info("Calling BBPS Transaction Status API URL={}", url);
Map<String, String> responseMap = httpService.getRequest(url, headers); Map<String, String> responseMap = httpService.getRequest(url, headers);
@@ -354,11 +328,9 @@ public class PaymentServiceImpl implements PaymentService {
helper.updateOutboundLogResponse(outboundLog, responseData); helper.updateOutboundLogResponse(outboundLog, responseData);
// Parse response
Map<String, Object> dataMap = objectMapper.readValue( Map<String, Object> dataMap = objectMapper.readValue(
responseData, new TypeReference<Map<String, Object>>() {}); responseData, new TypeReference<Map<String, Object>>() {});
// Validate response
if (!dataMap.containsKey("generalResp")) { if (!dataMap.containsKey("generalResp")) {
helper.updateInboundLogFailure(inboundLog, responseData, "INVALID_RESPONSE"); helper.updateInboundLogFailure(inboundLog, responseData, "INVALID_RESPONSE");
@@ -373,7 +345,6 @@ public class PaymentServiceImpl implements PaymentService {
); );
} }
// Convert into proper DTO
TransactionStatusResponse responseWrapper = TransactionStatusResponse responseWrapper =
objectMapper.convertValue(dataMap, TransactionStatusResponse.class); objectMapper.convertValue(dataMap, TransactionStatusResponse.class);
@@ -405,8 +376,7 @@ public class PaymentServiceImpl implements PaymentService {
LOGGER.info("Recived Call Back from FetchBillValidateResponse: {}", transactionStatusResponse); LOGGER.info("Recived Call Back from FetchBillValidateResponse: {}", transactionStatusResponse);
if (transactionStatusResponse.getGeneralResp().getStatusCode().equals("200")) { if (transactionStatusResponse.getGeneralResp().getStatusCode().equals("200")) {
} } else {
else {
LOGGER.info("Bill Fetch Callback Failed with Status: {}", transactionStatusResponse.getGeneralResp().getStatus()); LOGGER.info("Bill Fetch Callback Failed with Status: {}", transactionStatusResponse.getGeneralResp().getStatus());
} }
@@ -417,125 +387,3 @@ public class PaymentServiceImpl implements PaymentService {
""); "");
} }
} }
/* PollBack logic for the fetchTxnByTxnId API
* @Override public ResponseModel fetchTxnByTxnId(BillFetchByBillIdRequest
* billFetchByBillIdRequest) {
*
* String billId = billFetchByBillIdRequest.getBillId(); String fullUrl =
* agentDtaUrl + BBPSConstant.BILL_FETCH_BY_ID+billId;
* System.out.print(fullUrl);
*
* BeneficiaryDetails
* headersData=beneficiaryDetailsRepository.findByOrgId("ORG001");
*
* HttpHeaders headers = new HttpHeaders();
* headers.set("x-digiledge-key",headersData.getXDigiledgeKey());
* headers.set("agentId", headersData.getAgentId()); headers.set("tenantId",
* headersData.getTenantId());
* headers.setContentType(MediaType.APPLICATION_JSON);
*
* Map<String, String> responseMap = httpService.getRequest(fullUrl,headers);
* String responseData = responseMap.get("data"); log.info("data is :{}",
* responseData);
*
*
* ObjectMapper objectMapper = new ObjectMapper();
*
* try { Map<String, Object> dataMap = objectMapper.readValue(responseData, new
* TypeReference<Map<String, Object>>() { }); if
* (!dataMap.containsKey("genericResponse")) { throw new
* CustomException(String.valueOf(dataMap.get("message")), // message
* String.valueOf(dataMap.get("status")), // status
* Integer.parseInt(String.valueOf(dataMap.get("statusCode"))), // statusCode
* (int) String.valueOf(dataMap.get("remarks")) ); }
*
* BillDataResponse responseWrapper = objectMapper.convertValue(dataMap,
* BillDataResponse.class);
*
* GeneralResp generalResp = responseWrapper.getGenericResponse();
*
* ResponseModel responseModel=new ResponseModel( generalResp.getMessage(),
* generalResp.getStatus(), Integer.parseInt(generalResp.getStatusCode()),
* responseWrapper);
*
* return responseModel;
*
* } catch (JsonProcessingException e) {
* LOGGER.error("Error parsing responseData JSON: {}", e.getMessage()); throw
* new CustomException("Invalid JSON received from API"); }
*
* }
*/
/*
* public ResponseModel checkTrasactionStatus(TransactionStatusRequest
* transactionStatusRequest,InboundTraceLog inboundLog) { String apiName =
* "CheckTransactionStatus"; String txnId = helper.generateTxnId(15); //our
* genrated txnId String requestId = transactionStatusRequest.getReqId(); String
* url = paymentUrl + BBPSConstant.CHECK_TRANSACTION_URL +
* transactionStatusRequest.getTxnId(); ;
*
* BharatConnectMaster headersData =
* beneficiaryDetailsRepository.findByOrgId("ORG001"); HttpHeaders headers = new
* HttpHeaders(); headers.set("x-digiledge-key",
* headersData.getXDigiledgeKey()); headers.set("agentId",
* headersData.getAgentId()); headers.set("tenantId",
* headersData.getTenantId());
* headers.setContentType(MediaType.APPLICATION_JSON); ObjectMapper objectMapper
* = new ObjectMapper();
*
* OutboundTraceLog outboundLog = helper.createOutboundLog(txnId, requestId,
* apiName, url, "GET", null);
*
* long startTime = System.currentTimeMillis(); long maxWaitTimeMs = 40000; long
* intervalMs = 5000;
*
* while (true) { Map<String, String> responseMap = httpService.getRequest(url,
* headers); String responseData = responseMap.get("data");
* LOGGER.info("Transaction status response: {}", responseData);
*
* helper.updateOutboundLogResponse(outboundLog, responseData);
*
* try { Map<String, Object> dataMap = objectMapper.readValue(responseData, new
* TypeReference<Map<String, Object>>() {});
*
* if (!dataMap.containsKey("generalResp")) {
* helper.updateInboundLogFailure(inboundLog, responseData, "INVALID_RESPONSE");
* throw new CustomException( String.valueOf(dataMap.get("message")),
* String.valueOf(dataMap.get("status")),
* Integer.parseInt(String.valueOf(dataMap.get("statusCode"))),
* String.valueOf(dataMap.get("remarks")) ); }
*
* TransactionStatusResponse responseWrapper =
* objectMapper.convertValue(dataMap, TransactionStatusResponse.class);
* GeneralResp generalResp = responseWrapper.getGeneralResp();
*
* String status = generalResp.getStatus();
* LOGGER.info("Current transaction status: {}", status);
*
* if ("INPROGRESS".equalsIgnoreCase(status)) { if (System.currentTimeMillis() -
* startTime > maxWaitTimeMs) { helper.updateInboundLogFailure(inboundLog,
* "Timeout after 40 seconds", "FAILED"); throw new
* CustomException("Timeout waiting for transaction completion", "FAILED", 408,
* "Transaction still in progress"); }
*
* Thread.sleep(intervalMs); continue; }
*
* ResponseModel responseModel = new ResponseModel( generalResp.getMessage(),
* generalResp.getStatus(), Integer.parseInt(generalResp.getStatusCode()),
* responseWrapper );
*
* helper.updateInboundLogSuccess(inboundLog, responseData,
* generalResp.getStatus()); return responseModel;
*
* } catch (JsonProcessingException e) {
* LOGGER.error("Error parsing transaction status JSON: {}", e.getMessage());
* helper.updateInboundLogFailure(inboundLog, e.getMessage(), "JSON_ERROR");
* throw new CustomException("Invalid JSON received from API"); } catch
* (InterruptedException e) { Thread.currentThread().interrupt();
* helper.updateInboundLogFailure(inboundLog, e.getMessage(), "INTERRUPTED");
* throw new CustomException("Thread interrupted during transaction check"); } }
* }
*
*
*/
@@ -11,6 +11,8 @@ import java.util.stream.Collectors;
import org.modelmapper.ModelMapper; import org.modelmapper.ModelMapper;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import com.billpaymentservice.bbps.dto.AdditionalInfoBillDTO; import com.billpaymentservice.bbps.dto.AdditionalInfoBillDTO;
@@ -38,6 +40,7 @@ import com.billpaymentservice.bbps.entites.InboundTraceLog;
import com.billpaymentservice.bbps.entites.OutboundTraceLog; import com.billpaymentservice.bbps.entites.OutboundTraceLog;
import com.billpaymentservice.bbps.entites.PaymentChannel; import com.billpaymentservice.bbps.entites.PaymentChannel;
import com.billpaymentservice.bbps.entites.PaymentMode; import com.billpaymentservice.bbps.entites.PaymentMode;
import com.billpaymentservice.bbps.entites.BharatConnectMaster;
import com.billpaymentservice.bbps.exception.CustomException; import com.billpaymentservice.bbps.exception.CustomException;
import com.billpaymentservice.bbps.repository.BBPSMasterDataRepo; import com.billpaymentservice.bbps.repository.BBPSMasterDataRepo;
import com.billpaymentservice.bbps.repository.BillMasterRepository; import com.billpaymentservice.bbps.repository.BillMasterRepository;
@@ -214,6 +217,19 @@ public class Helper {
} }
/* ---------- End helpers ---------- */ /* ---------- End helpers ---------- */
// New reusable header builder for BBPS calls
public HttpHeaders buildHeaders(BharatConnectMaster headersData) {
HttpHeaders headers = new HttpHeaders();
if (headersData != null) {
headers.set("x-digiledge-key", headersData.getXDigiledgeKey());
headers.set("agentId", headersData.getAgentId());
headers.set("tenantId", headersData.getTenantId());
}
headers.setContentType(MediaType.APPLICATION_JSON);
return headers;
}
public void saveOrUpdateBillerData(BillerDetails newEntity) { public void saveOrUpdateBillerData(BillerDetails newEntity) {
Optional<BillerDetails> existingOpt = billerDataRespository.findByBillerId(newEntity.getBillerId()); Optional<BillerDetails> existingOpt = billerDataRespository.findByBillerId(newEntity.getBillerId());
@@ -233,7 +249,7 @@ public void saveOrUpdateBillData(BillDataResponse responseWrapper,
BillMaster billMaster = new BillMaster(); BillMaster billMaster = new BillMaster();
billMaster.setBillId(billFetchByBillIdRequest.getBillId()); billMaster.setBillId(responseWrapper.getBillId());
billMaster.setRefId(responseWrapper.getRefId()); billMaster.setRefId(responseWrapper.getRefId());
billMaster.setBillerId(responseWrapper.getBillerId()); billMaster.setBillerId(responseWrapper.getBillerId());
billMaster.setStatus(responseWrapper.getStatus()); billMaster.setStatus(responseWrapper.getStatus());
@@ -242,7 +258,6 @@ billMaster.setUserId(responseWrapper.getUserId());
billMaster.setReqId(billFetchByBillIdRequest.getReqId()); billMaster.setReqId(billFetchByBillIdRequest.getReqId());
billMaster.setTxnId(txnId); billMaster.setTxnId(txnId);
// BILLER RESPONSE // BILLER RESPONSE
BillerResponse billerResponse = new BillerResponse(); BillerResponse billerResponse = new BillerResponse();
if (responseWrapper.getBillerResponse() != null) { if (responseWrapper.getBillerResponse() != null) {