Use isTest flag for PayU base URL
All checks were successful
build-and-deploy / build-deploy (push) Successful in 37s

This commit is contained in:
androidlover5842
2026-01-30 06:05:35 +05:30
parent 91a45d62e8
commit d1f98c8cb1
5 changed files with 37 additions and 5 deletions

View File

@@ -28,11 +28,25 @@ class PayuSettingsSchemaFix(
salt_32 varchar, salt_32 varchar,
salt_256 varchar, salt_256 varchar,
base_url varchar not null, base_url varchar not null,
is_test boolean not null default false,
use_salt_256 boolean not null default true, use_salt_256 boolean not null default true,
updated_at timestamptz not null updated_at timestamptz not null
) )
""".trimIndent() """.trimIndent()
) )
} }
val hasIsTest = jdbcTemplate.queryForObject(
"""
select count(*)
from information_schema.columns
where table_name = 'payu_settings'
and column_name = 'is_test'
""".trimIndent(),
Int::class.java
) ?: 0
if (hasIsTest == 0) {
logger.info("Adding payu_settings.is_test column")
jdbcTemplate.execute("alter table payu_settings add column is_test boolean not null default false")
}
} }
} }

View File

@@ -166,7 +166,7 @@ class PayuQrPayments(
contentType = MediaType.APPLICATION_FORM_URLENCODED contentType = MediaType.APPLICATION_FORM_URLENCODED
} }
val entity = org.springframework.http.HttpEntity(form, headers) val entity = org.springframework.http.HttpEntity(form, headers)
val response = restTemplate.postForEntity(settings.baseUrl, entity, String::class.java) val response = restTemplate.postForEntity(resolveBaseUrl(settings), entity, String::class.java)
val responseBody = response.body ?: "" val responseBody = response.body ?: ""
record.responsePayload = responseBody record.responsePayload = responseBody
@@ -196,6 +196,14 @@ class PayuQrPayments(
return "https://api.hoteltrisolaris.in/properties/$propertyId/payu/return/$path" return "https://api.hoteltrisolaris.in/properties/$propertyId/payu/return/$path"
} }
private fun resolveBaseUrl(settings: com.android.trisolarisserver.models.payment.PayuSettings): String {
return if (settings.isTest) {
"https://test.payu.in/_payment"
} else {
"https://secure.payu.in/_payment"
}
}
private fun sha512(input: String): String { private fun sha512(input: String): String {
val bytes = MessageDigest.getInstance("SHA-512").digest(input.toByteArray()) val bytes = MessageDigest.getInstance("SHA-512").digest(input.toByteArray())
return bytes.joinToString("") { "%02x".format(it) } return bytes.joinToString("") { "%02x".format(it) }

View File

@@ -52,7 +52,12 @@ class PayuSettingsController(
val key = request.merchantKey.trim().ifBlank { val key = request.merchantKey.trim().ifBlank {
throw ResponseStatusException(HttpStatus.BAD_REQUEST, "merchantKey required") throw ResponseStatusException(HttpStatus.BAD_REQUEST, "merchantKey required")
} }
val baseUrl = request.baseUrl?.trim()?.ifBlank { null } ?: "https://secure.payu.in/_payment" val isTest = request.isTest ?: false
val baseUrl = if (isTest) {
"https://test.payu.in/_payment"
} else {
"https://secure.payu.in/_payment"
}
val existing = payuSettingsRepo.findByPropertyId(propertyId) val existing = payuSettingsRepo.findByPropertyId(propertyId)
val updated = if (existing == null) { val updated = if (existing == null) {
PayuSettings( PayuSettings(
@@ -61,6 +66,7 @@ class PayuSettingsController(
salt32 = request.salt32?.trim()?.ifBlank { null }, salt32 = request.salt32?.trim()?.ifBlank { null },
salt256 = request.salt256?.trim()?.ifBlank { null }, salt256 = request.salt256?.trim()?.ifBlank { null },
baseUrl = baseUrl, baseUrl = baseUrl,
isTest = isTest,
useSalt256 = request.useSalt256 ?: true, useSalt256 = request.useSalt256 ?: true,
updatedAt = OffsetDateTime.now() updatedAt = OffsetDateTime.now()
) )
@@ -69,6 +75,7 @@ class PayuSettingsController(
if (request.salt32 != null) existing.salt32 = request.salt32.trim().ifBlank { null } if (request.salt32 != null) existing.salt32 = request.salt32.trim().ifBlank { null }
if (request.salt256 != null) existing.salt256 = request.salt256.trim().ifBlank { null } if (request.salt256 != null) existing.salt256 = request.salt256.trim().ifBlank { null }
existing.baseUrl = baseUrl existing.baseUrl = baseUrl
existing.isTest = isTest
if (request.useSalt256 != null) existing.useSalt256 = request.useSalt256 if (request.useSalt256 != null) existing.useSalt256 = request.useSalt256
existing.updatedAt = OffsetDateTime.now() existing.updatedAt = OffsetDateTime.now()
existing existing
@@ -82,7 +89,7 @@ private fun PayuSettings.toResponse(): PayuSettingsResponse {
return PayuSettingsResponse( return PayuSettingsResponse(
propertyId = propertyId, propertyId = propertyId,
merchantKey = merchantKey, merchantKey = merchantKey,
baseUrl = baseUrl, isTest = isTest,
useSalt256 = useSalt256, useSalt256 = useSalt256,
hasSalt32 = !salt32.isNullOrBlank(), hasSalt32 = !salt32.isNullOrBlank(),
hasSalt256 = !salt256.isNullOrBlank() hasSalt256 = !salt256.isNullOrBlank()

View File

@@ -6,14 +6,14 @@ data class PayuSettingsUpsertRequest(
val merchantKey: String, val merchantKey: String,
val salt32: String? = null, val salt32: String? = null,
val salt256: String? = null, val salt256: String? = null,
val baseUrl: String? = null, val isTest: Boolean? = null,
val useSalt256: Boolean? = null val useSalt256: Boolean? = null
) )
data class PayuSettingsResponse( data class PayuSettingsResponse(
val propertyId: UUID, val propertyId: UUID,
val merchantKey: String, val merchantKey: String,
val baseUrl: String, val isTest: Boolean,
val useSalt256: Boolean, val useSalt256: Boolean,
val hasSalt32: Boolean, val hasSalt32: Boolean,
val hasSalt256: Boolean val hasSalt256: Boolean

View File

@@ -40,6 +40,9 @@ class PayuSettings(
@Column(name = "base_url", nullable = false) @Column(name = "base_url", nullable = false)
var baseUrl: String = "https://secure.payu.in/_payment", var baseUrl: String = "https://secure.payu.in/_payment",
@Column(name = "is_test", nullable = false)
var isTest: Boolean = false,
@Column(name = "use_salt_256", nullable = false) @Column(name = "use_salt_256", nullable = false)
var useSalt256: Boolean = true, var useSalt256: Boolean = true,