diff --git a/src/main/kotlin/com/android/trisolarisserver/config/PayuSettingsSchemaFix.kt b/src/main/kotlin/com/android/trisolarisserver/config/PayuSettingsSchemaFix.kt index d0c4c71..e19abc0 100644 --- a/src/main/kotlin/com/android/trisolarisserver/config/PayuSettingsSchemaFix.kt +++ b/src/main/kotlin/com/android/trisolarisserver/config/PayuSettingsSchemaFix.kt @@ -28,11 +28,25 @@ class PayuSettingsSchemaFix( salt_32 varchar, salt_256 varchar, base_url varchar not null, + is_test boolean not null default false, use_salt_256 boolean not null default true, updated_at timestamptz not null ) """.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") + } } } diff --git a/src/main/kotlin/com/android/trisolarisserver/controller/PayuQrPayments.kt b/src/main/kotlin/com/android/trisolarisserver/controller/PayuQrPayments.kt index e4a67b9..e00fd13 100644 --- a/src/main/kotlin/com/android/trisolarisserver/controller/PayuQrPayments.kt +++ b/src/main/kotlin/com/android/trisolarisserver/controller/PayuQrPayments.kt @@ -166,7 +166,7 @@ class PayuQrPayments( contentType = MediaType.APPLICATION_FORM_URLENCODED } 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 ?: "" record.responsePayload = responseBody @@ -196,6 +196,14 @@ class PayuQrPayments( 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 { val bytes = MessageDigest.getInstance("SHA-512").digest(input.toByteArray()) return bytes.joinToString("") { "%02x".format(it) } diff --git a/src/main/kotlin/com/android/trisolarisserver/controller/PayuSettingsController.kt b/src/main/kotlin/com/android/trisolarisserver/controller/PayuSettingsController.kt index 4c80532..e2e17e7 100644 --- a/src/main/kotlin/com/android/trisolarisserver/controller/PayuSettingsController.kt +++ b/src/main/kotlin/com/android/trisolarisserver/controller/PayuSettingsController.kt @@ -52,7 +52,12 @@ class PayuSettingsController( val key = request.merchantKey.trim().ifBlank { 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 updated = if (existing == null) { PayuSettings( @@ -61,6 +66,7 @@ class PayuSettingsController( salt32 = request.salt32?.trim()?.ifBlank { null }, salt256 = request.salt256?.trim()?.ifBlank { null }, baseUrl = baseUrl, + isTest = isTest, useSalt256 = request.useSalt256 ?: true, updatedAt = OffsetDateTime.now() ) @@ -69,6 +75,7 @@ class PayuSettingsController( if (request.salt32 != null) existing.salt32 = request.salt32.trim().ifBlank { null } if (request.salt256 != null) existing.salt256 = request.salt256.trim().ifBlank { null } existing.baseUrl = baseUrl + existing.isTest = isTest if (request.useSalt256 != null) existing.useSalt256 = request.useSalt256 existing.updatedAt = OffsetDateTime.now() existing @@ -82,7 +89,7 @@ private fun PayuSettings.toResponse(): PayuSettingsResponse { return PayuSettingsResponse( propertyId = propertyId, merchantKey = merchantKey, - baseUrl = baseUrl, + isTest = isTest, useSalt256 = useSalt256, hasSalt32 = !salt32.isNullOrBlank(), hasSalt256 = !salt256.isNullOrBlank() diff --git a/src/main/kotlin/com/android/trisolarisserver/controller/dto/PayuDtos.kt b/src/main/kotlin/com/android/trisolarisserver/controller/dto/PayuDtos.kt index b65f44f..9dbd913 100644 --- a/src/main/kotlin/com/android/trisolarisserver/controller/dto/PayuDtos.kt +++ b/src/main/kotlin/com/android/trisolarisserver/controller/dto/PayuDtos.kt @@ -6,14 +6,14 @@ data class PayuSettingsUpsertRequest( val merchantKey: String, val salt32: String? = null, val salt256: String? = null, - val baseUrl: String? = null, + val isTest: Boolean? = null, val useSalt256: Boolean? = null ) data class PayuSettingsResponse( val propertyId: UUID, val merchantKey: String, - val baseUrl: String, + val isTest: Boolean, val useSalt256: Boolean, val hasSalt32: Boolean, val hasSalt256: Boolean diff --git a/src/main/kotlin/com/android/trisolarisserver/models/payment/PayuSettings.kt b/src/main/kotlin/com/android/trisolarisserver/models/payment/PayuSettings.kt index 9aff7f1..5b4266f 100644 --- a/src/main/kotlin/com/android/trisolarisserver/models/payment/PayuSettings.kt +++ b/src/main/kotlin/com/android/trisolarisserver/models/payment/PayuSettings.kt @@ -40,6 +40,9 @@ class PayuSettings( @Column(name = "base_url", nullable = false) 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) var useSalt256: Boolean = true,