imroved webbased datasaved
This commit is contained in:
@@ -1,8 +1,13 @@
|
|||||||
package com.billpaymentservice.bbps.dto.request;
|
package com.billpaymentservice.bbps.dto.request;
|
||||||
|
|
||||||
|
import jakarta.validation.constraints.NotBlank;
|
||||||
|
|
||||||
public class CallbackRequest {
|
public class CallbackRequest {
|
||||||
|
@NotBlank(message = "mid is mandatory")
|
||||||
private String mid;
|
private String mid;
|
||||||
|
@NotBlank(message = "data is mandatory")
|
||||||
private String data;
|
private String data;
|
||||||
|
@NotBlank(message = "signature is mandatory")
|
||||||
private String signature;
|
private String signature;
|
||||||
|
|
||||||
public String getMid() {
|
public String getMid() {
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ package com.billpaymentservice.bbps.dto.request;
|
|||||||
|
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
|
|
||||||
|
import jakarta.validation.constraints.NotBlank;
|
||||||
import lombok.AllArgsConstructor;
|
import lombok.AllArgsConstructor;
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
import lombok.NoArgsConstructor;
|
import lombok.NoArgsConstructor;
|
||||||
@@ -13,13 +14,20 @@ import lombok.Setter;
|
|||||||
@AllArgsConstructor
|
@AllArgsConstructor
|
||||||
// DTO representing the user request payload described by the user
|
// DTO representing the user request payload described by the user
|
||||||
public class PaymentStartUserRequest extends BaseClass implements Serializable {
|
public class PaymentStartUserRequest extends BaseClass implements Serializable {
|
||||||
|
@NotBlank(message = "amount can not be null")
|
||||||
private String amount;
|
private String amount;
|
||||||
private String currency;
|
@NotBlank(message = "currency can not be null")
|
||||||
private String emailId;
|
String currency;
|
||||||
|
@NotBlank(message = "customerVpa can not be null")
|
||||||
private String customerVpa;
|
private String customerVpa;
|
||||||
private String mobileNo;
|
@NotBlank(message = "txnReqType can not be null")
|
||||||
private String respUrl;
|
|
||||||
private String txnReqType;
|
private String txnReqType;
|
||||||
|
@NotBlank(message = "udf1(Latitude) can not be null")
|
||||||
|
private String udf1;
|
||||||
|
@NotBlank(message = "udf2(Longitude) can not be null")
|
||||||
|
private String udf2;
|
||||||
|
private String emailId;
|
||||||
|
private String mobileNo;
|
||||||
private String name;
|
private String name;
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -26,11 +26,9 @@ public class AdditionalInfo {
|
|||||||
private Long id; // primary key for the table
|
private Long id; // primary key for the table
|
||||||
|
|
||||||
@Column(name = "param_config_id", nullable = false)
|
@Column(name = "param_config_id", nullable = false)
|
||||||
@NotBlank(message = "Param Config ID cannot be blank")
|
|
||||||
private String paramConfigId;
|
private String paramConfigId;
|
||||||
|
|
||||||
@Column(name = "param_name", nullable = false)
|
@Column(name = "param_name", nullable = false)
|
||||||
@NotBlank(message = "Param name cannot be blank")
|
|
||||||
private String paramName;
|
private String paramName;
|
||||||
|
|
||||||
@Column(name = "data_type_dao")
|
@Column(name = "data_type_dao")
|
||||||
|
|||||||
@@ -21,11 +21,9 @@ public class BillerAdditionalInfoPayment {
|
|||||||
private Long id; // primary key for the table
|
private Long id; // primary key for the table
|
||||||
|
|
||||||
@Column(name = "param_config_id", nullable = false)
|
@Column(name = "param_config_id", nullable = false)
|
||||||
@NotBlank(message = "Param Config ID cannot be blank")
|
|
||||||
private String paramConfigId;
|
private String paramConfigId;
|
||||||
|
|
||||||
@Column(name = "param_name", nullable = false)
|
@Column(name = "param_name", nullable = false)
|
||||||
@NotBlank(message = "Param name cannot be blank")
|
|
||||||
private String paramName;
|
private String paramName;
|
||||||
|
|
||||||
@Column(name = "data_type_dao")
|
@Column(name = "data_type_dao")
|
||||||
|
|||||||
@@ -45,18 +45,15 @@ public class BillerDetails{
|
|||||||
private String billerId;
|
private String billerId;
|
||||||
|
|
||||||
@Column(name = "biller_name")
|
@Column(name = "biller_name")
|
||||||
@NotBlank(message = "Biller name cannot be blank")
|
|
||||||
private String billerName;
|
private String billerName;
|
||||||
|
|
||||||
@Column(name = "biller_alias_name")
|
@Column(name = "biller_alias_name")
|
||||||
private String billerAliasName;
|
private String billerAliasName;
|
||||||
|
|
||||||
@Column(name = "biller_category_name", nullable = false)
|
@Column(name = "biller_category_name")
|
||||||
@NotBlank(message = "Biller category name cannot be blank")
|
|
||||||
private String billerCategoryName;
|
private String billerCategoryName;
|
||||||
|
|
||||||
@Column(name = "biller_mode")
|
@Column(name = "biller_mode")
|
||||||
@NotBlank(message = "Biller mode cannot be blank")
|
|
||||||
private String billerMode;
|
private String billerMode;
|
||||||
|
|
||||||
@Column(name = "biller_accepts_adhoc")
|
@Column(name = "biller_accepts_adhoc")
|
||||||
@@ -69,14 +66,12 @@ public class BillerDetails{
|
|||||||
private String parentBillerId;
|
private String parentBillerId;
|
||||||
|
|
||||||
@Column(name = "biller_ownership")
|
@Column(name = "biller_ownership")
|
||||||
@NotBlank(message = "Biller ownership is required (PSU or Private)")
|
|
||||||
private String billerOwnerShp;
|
private String billerOwnerShp;
|
||||||
|
|
||||||
@Column(name = "biller_coverage")
|
@Column(name = "biller_coverage")
|
||||||
private String billerCoverage;
|
private String billerCoverage;
|
||||||
|
|
||||||
@Column(name = "fetch_requirement")
|
@Column(name = "fetch_requirement")
|
||||||
@NotBlank(message = "Fetch requirement is mandatory")
|
|
||||||
private String fetchRequirement;
|
private String fetchRequirement;
|
||||||
|
|
||||||
@Column(name = "payment_amount_exactness")
|
@Column(name = "payment_amount_exactness")
|
||||||
|
|||||||
@@ -24,7 +24,6 @@ public class BillerPlanResponseParams {
|
|||||||
private Long id; // Primary Key
|
private Long id; // Primary Key
|
||||||
|
|
||||||
@Column(name = "biller_plan_response_id", nullable = false, unique = true)
|
@Column(name = "biller_plan_response_id", nullable = false, unique = true)
|
||||||
@NotBlank(message = "Biller Plan Response ID cannot be blank")
|
|
||||||
private String billerPlanResponseId;
|
private String billerPlanResponseId;
|
||||||
// ✅ params list — since it's not a separate table, we can store as JSON or text
|
// ✅ params list — since it's not a separate table, we can store as JSON or text
|
||||||
@Column(name = "params", columnDefinition = "TEXT")
|
@Column(name = "params", columnDefinition = "TEXT")
|
||||||
|
|||||||
@@ -29,11 +29,9 @@ public class InterchangeFee {
|
|||||||
private Long id; // Primary key
|
private Long id; // Primary key
|
||||||
|
|
||||||
@Column(name = "interchange_fee_id", nullable = false, unique = true)
|
@Column(name = "interchange_fee_id", nullable = false, unique = true)
|
||||||
@NotBlank(message = "Interchange Fee ID cannot be blank")
|
|
||||||
private String interchangeFeeId;
|
private String interchangeFeeId;
|
||||||
|
|
||||||
@Column(name = "fee_code", nullable = false)
|
@Column(name = "fee_code", nullable = false)
|
||||||
@NotBlank(message = "Fee code is mandatory")
|
|
||||||
private String feeCode;
|
private String feeCode;
|
||||||
|
|
||||||
@Column(name = "fee_description")
|
@Column(name = "fee_description")
|
||||||
|
|||||||
@@ -27,7 +27,6 @@ public class InterchangeFeeConf {
|
|||||||
private Long id; // Primary Key for DB table
|
private Long id; // Primary Key for DB table
|
||||||
|
|
||||||
@Column(name = "interchange_fee_conf_id", nullable = false, unique = true)
|
@Column(name = "interchange_fee_conf_id", nullable = false, unique = true)
|
||||||
@NotBlank(message = "Interchange Fee Config ID cannot be blank")
|
|
||||||
private String interChangeFeeConfId;
|
private String interChangeFeeConfId;
|
||||||
|
|
||||||
@Column(name = "mti")
|
@Column(name = "mti")
|
||||||
|
|||||||
@@ -24,7 +24,6 @@ public class PaymentChannel {
|
|||||||
@Column(name = "payment_channel_limit_id")
|
@Column(name = "payment_channel_limit_id")
|
||||||
private String paymentChannelLimitId; // Primary key (manual, not auto-generated)
|
private String paymentChannelLimitId; // Primary key (manual, not auto-generated)
|
||||||
|
|
||||||
@NotBlank(message = "Payment channel is required")
|
|
||||||
@Column(name = "payment_channel", nullable = false)
|
@Column(name = "payment_channel", nullable = false)
|
||||||
private String paymentChannel;
|
private String paymentChannel;
|
||||||
|
|
||||||
|
|||||||
@@ -26,11 +26,9 @@ public class PaymentMode {
|
|||||||
|
|
||||||
@Id //
|
@Id //
|
||||||
@Column(name = "payment_model_limit_id", unique = true, length = 50)
|
@Column(name = "payment_model_limit_id", unique = true, length = 50)
|
||||||
@NotBlank(message = "Payment model limit ID cannot be blank")
|
|
||||||
private String paymentModelLimitId;
|
private String paymentModelLimitId;
|
||||||
|
|
||||||
@Column(name = "payment_mode", nullable = false, length = 50)
|
@Column(name = "payment_mode", nullable = false, length = 50)
|
||||||
@NotBlank(message = "Payment mode is mandatory")
|
|
||||||
private String paymentMode;
|
private String paymentMode;
|
||||||
|
|
||||||
@Column(name = "max_limit")
|
@Column(name = "max_limit")
|
||||||
@@ -42,7 +40,6 @@ public class PaymentMode {
|
|||||||
private long minLimit;
|
private long minLimit;
|
||||||
|
|
||||||
@Column(name = "support_pending_status", length = 10)
|
@Column(name = "support_pending_status", length = 10)
|
||||||
@Pattern(regexp = "^(Yes|No)?$", message = "Support pending status must be either 'Yes' or 'No'")
|
|
||||||
private String supportPendingStatus;
|
private String supportPendingStatus;
|
||||||
|
|
||||||
// 🔗 Many-to-One relationship with BillerDAO
|
// 🔗 Many-to-One relationship with BillerDAO
|
||||||
|
|||||||
@@ -286,11 +286,36 @@ public class PaymentStartServiceImpl implements PaymentStartService {
|
|||||||
// Save record with HTML (persist original request and HTML response)
|
// Save record with HTML (persist original request and HTML response)
|
||||||
String responseTypeWeb = BBPSConstant.RESPONSE_TYPE_HTML;
|
String responseTypeWeb = BBPSConstant.RESPONSE_TYPE_HTML;
|
||||||
String rawResponseWeb = respBody == null ? "" : respBody;
|
String rawResponseWeb = respBody == null ? "" : respBody;
|
||||||
// bbpsMapperHelper.savePaymentStartRecord(request, null, txnId, orderNo, requestJson, rawResponseWeb, responseTypeWeb);
|
|
||||||
LOGGER.info("[startWebPayment] saved payment start record txnId={} orderNo={} responseType={}", txnId, orderNo, responseTypeWeb);
|
// Try to extract useful fields from returned HTML (txnId, amount, mid)
|
||||||
|
Map<String, String> parsed = parseHtmlResponse(rawResponseWeb);
|
||||||
|
|
||||||
|
// Build a minimal PaymentStartApiResponse so savePaymentStartRecord() can safely read fields
|
||||||
|
com.billpaymentservice.bbps.dto.response.PaymentStartApiResponse apiResp = new com.billpaymentservice.bbps.dto.response.PaymentStartApiResponse();
|
||||||
|
com.billpaymentservice.bbps.dto.response.PaymentStartApiResponse.ResponseData rd = new com.billpaymentservice.bbps.dto.response.PaymentStartApiResponse.ResponseData();
|
||||||
|
|
||||||
|
String parsedTxn = parsed.getOrDefault("txnId", "");
|
||||||
|
String parsedAmount = parsed.getOrDefault("amount", "0.00");
|
||||||
|
String parsedMid = parsed.getOrDefault("mid", paymentMid == null ? "DUMMY_MID" : paymentMid);
|
||||||
|
|
||||||
|
// prefer HTML-provided txnId if present, otherwise reuse generated txnId
|
||||||
|
rd.setTxnId(parsedTxn != null && !parsedTxn.isEmpty() ? parsedTxn : txnId);
|
||||||
|
rd.setAmount(parsedAmount != null && !parsedAmount.isEmpty() ? parsedAmount : "0.00");
|
||||||
|
rd.setMid(parsedMid);
|
||||||
|
rd.setOrderNo(orderNo);
|
||||||
|
rd.setQrString("NO_QR");
|
||||||
|
rd.setCreatedOn(LocalDateTime.now().toString());
|
||||||
|
|
||||||
|
apiResp.setResponseData(rd);
|
||||||
|
apiResp.setMessage("HTML_RESPONSE");
|
||||||
|
apiResp.setStatusCode(String.valueOf(BBPSConstant.HTTP_OK_INT));
|
||||||
|
|
||||||
|
bbpsMapperHelper.savePaymentStartRecord(request, apiResp, txnId, orderNo, requestJson, rawResponseWeb, responseTypeWeb);
|
||||||
|
LOGGER.info("[startWebPayment] saved payment start record txnId={} orderNo={} responseType={}", txnId, orderNo, responseTypeWeb);
|
||||||
|
|
||||||
// Return HTML directly in API response
|
// Return HTML directly in API response
|
||||||
Map<String, String> result = new HashMap<>();
|
Map<String, String> result = new HashMap<>();
|
||||||
|
result.put("OrderId", orderNo);
|
||||||
result.put("html", respBody);
|
result.put("html", respBody);
|
||||||
|
|
||||||
LOGGER.info("[startWebPayment] complete txnId={} orderNo={} returning HTML", txnId, orderNo);
|
LOGGER.info("[startWebPayment] complete txnId={} orderNo={} returning HTML", txnId, orderNo);
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
package com.billpaymentservice.bbps.util;
|
package com.billpaymentservice.bbps.util;
|
||||||
|
|
||||||
|
import java.time.LocalDateTime;
|
||||||
import java.time.OffsetDateTime;
|
import java.time.OffsetDateTime;
|
||||||
import java.time.format.DateTimeFormatter;
|
import java.time.format.DateTimeFormatter;
|
||||||
import java.time.temporal.ChronoUnit;
|
import java.time.temporal.ChronoUnit;
|
||||||
@@ -1109,14 +1110,15 @@ public class BillerMapperHelper {
|
|||||||
record.setClientMid(request.getMid());
|
record.setClientMid(request.getMid());
|
||||||
record.setClientUserId(request.getClientUserId());
|
record.setClientUserId(request.getClientUserId());
|
||||||
record.setInternalTxnId(txnId);
|
record.setInternalTxnId(txnId);
|
||||||
if (apiResponse != null && apiResponse.getResponseData() != null) {
|
|
||||||
record.setAmount(apiResponse.getResponseData().getAmount());
|
|
||||||
record.setMid(apiResponse.getResponseData().getMid());
|
record.setAmount(Optional.ofNullable(apiResponse.getResponseData().getAmount()).orElse("0.00"));
|
||||||
record.setTxnId(apiResponse.getResponseData().getTxnId());
|
record.setMid(Optional.ofNullable(apiResponse.getResponseData().getMid()).orElse("DUMMY_MID"));
|
||||||
record.setQrString(apiResponse.getResponseData().getQrString());
|
record.setTxnId(Optional.ofNullable(apiResponse.getResponseData().getTxnId()).orElse("DUMMY_TXN"));
|
||||||
record.setCreatedOn(apiResponse.getResponseData().getCreatedOn());
|
record.setQrString(Optional.ofNullable(apiResponse.getResponseData().getQrString()).orElse("NO_QR"));
|
||||||
record.setTxnStatus("PENDING");
|
record.setCreatedOn(Optional.ofNullable(apiResponse.getResponseData().getCreatedOn()).orElse(LocalDateTime.now().toString()));
|
||||||
}
|
record.setTxnStatus("PENDING");
|
||||||
|
|
||||||
|
|
||||||
// store the original request body and raw response
|
// store the original request body and raw response
|
||||||
record.setRequestBody(requestJson);
|
record.setRequestBody(requestJson);
|
||||||
|
|||||||
@@ -20,9 +20,9 @@ swagger.server.description=Local Development Server
|
|||||||
# DataSource
|
# DataSource
|
||||||
spring.datasource.url=jdbc:postgresql://localhost:5432/BBPS
|
spring.datasource.url=jdbc:postgresql://localhost:5432/BBPS
|
||||||
spring.datasource.username=postgres
|
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.driver-class-name=org.postgresql.Driver
|
||||||
spring.datasource.type=com.zaxxer.hikari.HikariDataSource
|
spring.datasource.type=com.zaxxer.hikari.HikariDataSource
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user