From 3cfab2c57b81c1b570ee292e9079f11143ee0ed9 Mon Sep 17 00:00:00 2001 From: klaus Date: Tue, 2 Dec 2025 15:12:07 +0900 Subject: [PATCH] =?UTF-8?q?=EC=BA=94=20=EA=B2=B0=EC=A0=9C=20=ED=99=94?= =?UTF-8?q?=EB=A9=B4=20=EB=AC=B8=EC=9E=90=EC=97=B4=20=EB=A6=AC=EC=86=8C?= =?UTF-8?q?=EC=8A=A4=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mypage/can/payment/CanPaymentActivity.kt | 42 +++++++++++++------ .../can/payment/CanPaymentTempActivity.kt | 19 +++++---- .../can/payment/CanPaymentTempViewModel.kt | 20 +++------ .../mypage/can/payment/CanPaymentViewModel.kt | 42 +++++++------------ .../main/res/layout/activity_can_payment.xml | 14 +++---- app/src/main/res/values-en/strings.xml | 15 +++++++ app/src/main/res/values-ja/strings.xml | 15 +++++++ app/src/main/res/values/strings.xml | 15 +++++++ 8 files changed, 113 insertions(+), 69 deletions(-) diff --git a/app/src/main/java/kr/co/vividnext/sodalive/mypage/can/payment/CanPaymentActivity.kt b/app/src/main/java/kr/co/vividnext/sodalive/mypage/can/payment/CanPaymentActivity.kt index a31aa72a..60fbb173 100644 --- a/app/src/main/java/kr/co/vividnext/sodalive/mypage/can/payment/CanPaymentActivity.kt +++ b/app/src/main/java/kr/co/vividnext/sodalive/mypage/can/payment/CanPaymentActivity.kt @@ -78,7 +78,7 @@ class CanPaymentActivity : BaseActivity( if (canResponse == null) { Toast.makeText( applicationContext, - "다시 시도해 주세요.\n계속 같은 문제가 발생할 경우 고객센터로 문의 주시기 바랍니다.", + getString(R.string.msg_can_payment_missing_data), Toast.LENGTH_LONG ).show() @@ -90,7 +90,7 @@ class CanPaymentActivity : BaseActivity( false ) - binding.toolbar.tvBack.text = "결제하기" + binding.toolbar.tvBack.text = getString(R.string.screen_can_payment_title) binding.toolbar.tvBack.setOnClickListener { finish() } binding.tvChargeCanTitle.text = canResponse!!.title @@ -109,7 +109,7 @@ class CanPaymentActivity : BaseActivity( if (viewModel.paymentMethodLiveData.value == null) { Toast.makeText( applicationContext, - "결제수단을 선택해 주세요.", + getString(R.string.msg_can_payment_method_required), Toast.LENGTH_LONG ).show() return@setOnClickListener @@ -118,7 +118,7 @@ class CanPaymentActivity : BaseActivity( if (!binding.tvAgree.isSelected) { Toast.makeText( applicationContext, - "결제 진행에 동의하셔야 결제가 가능합니다.", + getString(R.string.msg_can_payment_agree_required), Toast.LENGTH_LONG ).show() return@setOnClickListener @@ -188,7 +188,8 @@ class CanPaymentActivity : BaseActivity( startPayverse(response.payloadJson) }, onFailure = { - Toast.makeText(applicationContext, it, Toast.LENGTH_LONG).show() + val message = it ?: getString(R.string.common_error_unknown) + Toast.makeText(applicationContext, message, Toast.LENGTH_LONG).show() } ) } @@ -201,13 +202,18 @@ class CanPaymentActivity : BaseActivity( requestPayment(chargeId = it) }, onFailure = { - Toast.makeText(applicationContext, it, Toast.LENGTH_LONG).show() + val message = it ?: getString(R.string.common_error_unknown) + Toast.makeText(applicationContext, message, Toast.LENGTH_LONG).show() } ) } else -> { - Toast.makeText(applicationContext, "결제수단을 다시 선택해 주세요.", Toast.LENGTH_LONG).show() + Toast.makeText( + applicationContext, + getString(R.string.msg_can_payment_method_required), + Toast.LENGTH_LONG + ).show() } } } @@ -283,7 +289,11 @@ class CanPaymentActivity : BaseActivity( viewModel.verifyHecto( request, onSuccess = { - Toast.makeText(applicationContext, "캔이 충전되었습니다", Toast.LENGTH_LONG).show() + Toast.makeText( + applicationContext, + getString(R.string.msg_can_charge_success), + Toast.LENGTH_LONG + ).show() SharedPreferenceManager.can += (canResponse!!.rewardCan + canResponse!!.can) if (gotoPrevPage) { setResult(RESULT_OK) @@ -294,7 +304,8 @@ class CanPaymentActivity : BaseActivity( finish() }, onFailure = { - Toast.makeText(applicationContext, it, Toast.LENGTH_LONG).show() + val message = it ?: getString(R.string.common_error_unknown) + Toast.makeText(applicationContext, message, Toast.LENGTH_LONG).show() } ) } @@ -395,7 +406,7 @@ class CanPaymentActivity : BaseActivity( Logger.e(e.message ?: "payverse start error") Toast.makeText( applicationContext, - "결제 초기화에 실패했습니다.", + getString(R.string.msg_can_payment_init_failed), Toast.LENGTH_LONG ).show() binding.webviewPayverse.visibility = View.GONE @@ -436,7 +447,7 @@ class CanPaymentActivity : BaseActivity( ) { Toast.makeText( applicationContext, - "결제를 하지 못했습니다.\n다시 시도해 주세요", + getString(R.string.msg_can_payment_retry), Toast.LENGTH_LONG ).show() @@ -452,14 +463,19 @@ class CanPaymentActivity : BaseActivity( completePaymentSuccess() }, onFailure = { - Toast.makeText(applicationContext, it, Toast.LENGTH_LONG).show() + val message = it ?: getString(R.string.common_error_unknown) + Toast.makeText(applicationContext, message, Toast.LENGTH_LONG).show() binding.webviewPayverse.visibility = View.GONE } ) } private fun completePaymentSuccess() { - Toast.makeText(applicationContext, "캔이 충전되었습니다", Toast.LENGTH_LONG).show() + Toast.makeText( + applicationContext, + getString(R.string.msg_can_charge_success), + Toast.LENGTH_LONG + ).show() SharedPreferenceManager.can += (canResponse!!.rewardCan + canResponse!!.can) if (gotoPrevPage) { setResult(RESULT_OK) diff --git a/app/src/main/java/kr/co/vividnext/sodalive/mypage/can/payment/CanPaymentTempActivity.kt b/app/src/main/java/kr/co/vividnext/sodalive/mypage/can/payment/CanPaymentTempActivity.kt index 14666708..7a2ca2a9 100644 --- a/app/src/main/java/kr/co/vividnext/sodalive/mypage/can/payment/CanPaymentTempActivity.kt +++ b/app/src/main/java/kr/co/vividnext/sodalive/mypage/can/payment/CanPaymentTempActivity.kt @@ -56,23 +56,24 @@ class CanPaymentTempActivity : BaseActivity( if (title.isBlank() || can <= 0) { Toast.makeText( applicationContext, - "다시 시도해 주세요.\n계속 같은 문제가 발생할 경우 고객센터로 문의 주시기 바랍니다.", + getString(R.string.msg_can_payment_missing_data), Toast.LENGTH_LONG ).show() finish() } - binding.toolbar.tvBack.text = "결제하기" + binding.toolbar.tvBack.text = getString(R.string.screen_can_payment_title) binding.toolbar.tvBack.setOnClickListener { finish() } binding.ivCan.visibility = View.GONE binding.tvAlert.visibility = View.GONE binding.tvChargeCanTitle.text = title binding.tvPrice.text = (can * 110).moneyFormat() - binding.tvPaymentPrice.text = "${(can * 110).moneyFormat()}원".fontSpan( + val currencyUnit = getString(R.string.screen_can_payment_currency_unit) + binding.tvPaymentPrice.text = "${(can * 110).moneyFormat()}$currencyUnit".fontSpan( ResourcesCompat.getFont(applicationContext, R.font.gmarket_sans_light), - "원" + currencyUnit ) binding.tvAgree.setOnClickListener { @@ -83,7 +84,7 @@ class CanPaymentTempActivity : BaseActivity( if (viewModel.paymentMethodLiveData.value == null) { Toast.makeText( applicationContext, - "결제수단을 선택해 주세요.", + getString(R.string.msg_can_payment_method_required), Toast.LENGTH_LONG ).show() return@setOnClickListener @@ -92,7 +93,7 @@ class CanPaymentTempActivity : BaseActivity( if (!binding.tvAgree.isSelected) { Toast.makeText( applicationContext, - "결제 진행에 동의하셔야 결제가 가능합니다.", + getString(R.string.msg_can_payment_agree_required), Toast.LENGTH_LONG ).show() return@setOnClickListener @@ -138,7 +139,8 @@ class CanPaymentTempActivity : BaseActivity( requestPayment(chargeId = it) }, onFailure = { - Toast.makeText(applicationContext, it, Toast.LENGTH_LONG).show() + val message = it ?: getString(R.string.common_error_unknown) + Toast.makeText(applicationContext, message, Toast.LENGTH_LONG).show() } ) } @@ -206,7 +208,8 @@ class CanPaymentTempActivity : BaseActivity( finish() }, onFailure = { - Toast.makeText(applicationContext, it, Toast.LENGTH_LONG).show() + val message = it ?: getString(R.string.common_error_unknown) + Toast.makeText(applicationContext, message, Toast.LENGTH_LONG).show() } ) } diff --git a/app/src/main/java/kr/co/vividnext/sodalive/mypage/can/payment/CanPaymentTempViewModel.kt b/app/src/main/java/kr/co/vividnext/sodalive/mypage/can/payment/CanPaymentTempViewModel.kt index a03a00d7..2063f18d 100644 --- a/app/src/main/java/kr/co/vividnext/sodalive/mypage/can/payment/CanPaymentTempViewModel.kt +++ b/app/src/main/java/kr/co/vividnext/sodalive/mypage/can/payment/CanPaymentTempViewModel.kt @@ -22,7 +22,7 @@ class CanPaymentTempViewModel(private val repository: CanPaymentTempRepository) can: Int, paymentGateway: PaymentGateway, onSuccess: (Long) -> Unit, - onFailure: (String) -> Unit + onFailure: (String?) -> Unit ) { _isLoading.value = true val request = ChargeTempRequest(can, can * 110, paymentGateway) @@ -36,23 +36,19 @@ class CanPaymentTempViewModel(private val repository: CanPaymentTempRepository) if (it.success && it.data != null) { onSuccess(it.data.chargeId) } else { - if (it.message != null) { - onFailure(it.message) - } else { - onFailure("알 수 없는 오류가 발생했습니다. 다시 시도해 주세요.") - } + onFailure(it.message) } }, { _isLoading.value = false it.message?.let { message -> Logger.e(message) } - onFailure("알 수 없는 오류가 발생했습니다. 다시 시도해 주세요.") + onFailure(it.message) } ) ) } - fun verify(request: VerifyRequest, onSuccess: () -> Unit, onFailure: (String) -> Unit) { + fun verify(request: VerifyRequest, onSuccess: () -> Unit, onFailure: (String?) -> Unit) { _isLoading.value = true compositeDisposable.add( repository.verify( @@ -66,17 +62,13 @@ class CanPaymentTempViewModel(private val repository: CanPaymentTempRepository) if (it.success) { onSuccess() } else { - if (it.message != null) { - onFailure(it.message) - } else { - onFailure("알 수 없는 오류가 발생했습니다. 다시 시도해 주세요.") - } + onFailure(it.message) } }, { _isLoading.value = false it.message?.let { message -> Logger.e(message) } - onFailure("알 수 없는 오류가 발생했습니다. 다시 시도해 주세요.") + onFailure(it.message) } ) ) diff --git a/app/src/main/java/kr/co/vividnext/sodalive/mypage/can/payment/CanPaymentViewModel.kt b/app/src/main/java/kr/co/vividnext/sodalive/mypage/can/payment/CanPaymentViewModel.kt index ccecd2e8..120334ec 100644 --- a/app/src/main/java/kr/co/vividnext/sodalive/mypage/can/payment/CanPaymentViewModel.kt +++ b/app/src/main/java/kr/co/vividnext/sodalive/mypage/can/payment/CanPaymentViewModel.kt @@ -26,7 +26,7 @@ class CanPaymentViewModel(private val repository: CanRepository) : BaseViewModel canId: Long, paymentGateway: PaymentGateway, onSuccess: (Long) -> Unit, - onFailure: (String) -> Unit + onFailure: (String?) -> Unit ) { _isLoading.value = true val request = ChargeRequest(canId = canId, paymentGateway = paymentGateway) @@ -42,23 +42,19 @@ class CanPaymentViewModel(private val repository: CanRepository) : BaseViewModel if (it.success && it.data != null) { onSuccess(it.data.chargeId) } else { - if (it.message != null) { - onFailure(it.message) - } else { - onFailure("알 수 없는 오류가 발생했습니다. 다시 시도해 주세요.") - } + onFailure(it.message) } }, { _isLoading.value = false it.message?.let { message -> Logger.e(message) } - onFailure("알 수 없는 오류가 발생했습니다. 다시 시도해 주세요.") + onFailure(it.message) } ) ) } - fun verify(request: VerifyRequest, onSuccess: () -> Unit, onFailure: (String) -> Unit) { + fun verify(request: VerifyRequest, onSuccess: () -> Unit, onFailure: (String?) -> Unit) { _isLoading.value = true compositeDisposable.add( repository.verify( @@ -72,23 +68,19 @@ class CanPaymentViewModel(private val repository: CanRepository) : BaseViewModel if (it.success) { onSuccess() } else { - if (it.message != null) { - onFailure(it.message) - } else { - onFailure("알 수 없는 오류가 발생했습니다. 다시 시도해 주세요.") - } + onFailure(it.message) } }, { _isLoading.value = false it.message?.let { message -> Logger.e(message) } - onFailure("알 수 없는 오류가 발생했습니다. 다시 시도해 주세요.") + onFailure(it.message) } ) ) } - fun verifyHecto(request: VerifyRequest, onSuccess: () -> Unit, onFailure: (String) -> Unit) { + fun verifyHecto(request: VerifyRequest, onSuccess: () -> Unit, onFailure: (String?) -> Unit) { _isLoading.value = true compositeDisposable.add( repository.verifyHecto( @@ -102,17 +94,13 @@ class CanPaymentViewModel(private val repository: CanRepository) : BaseViewModel if (it.success) { onSuccess() } else { - if (it.message != null) { - onFailure(it.message) - } else { - onFailure("알 수 없는 오류가 발생했습니다. 다시 시도해 주세요.") - } + onFailure(it.message) } }, { _isLoading.value = false it.message?.let { message -> Logger.e(message) } - onFailure("알 수 없는 오류가 발생했습니다. 다시 시도해 주세요.") + onFailure(it.message) } ) ) @@ -125,7 +113,7 @@ class CanPaymentViewModel(private val repository: CanRepository) : BaseViewModel fun payverseChargeCan( canId: Long, onSuccess: (PayverseChargeResponse) -> Unit, - onFailure: (String) -> Unit + onFailure: (String?) -> Unit ) { _isLoading.value = true compositeDisposable.add( @@ -140,13 +128,13 @@ class CanPaymentViewModel(private val repository: CanRepository) : BaseViewModel if (it.success && it.data != null) { onSuccess(it.data) } else { - onFailure(it.message ?: "알 수 없는 오류가 발생했습니다. 다시 시도해 주세요.") + onFailure(it.message) } }, { _isLoading.value = false it.message?.let { m -> Logger.e(m) } - onFailure("알 수 없는 오류가 발생했습니다. 다시 시도해 주세요.") + onFailure(it.message) } ) ) @@ -156,7 +144,7 @@ class CanPaymentViewModel(private val repository: CanRepository) : BaseViewModel transactionId: String, orderId: String, onSuccess: () -> Unit, - onFailure: (String) -> Unit + onFailure: (String?) -> Unit ) { _isLoading.value = true compositeDisposable.add( @@ -172,13 +160,13 @@ class CanPaymentViewModel(private val repository: CanRepository) : BaseViewModel if (it.success) { onSuccess() } else { - onFailure(it.message ?: "알 수 없는 오류가 발생했습니다. 다시 시도해 주세요.") + onFailure(it.message) } }, { _isLoading.value = false it.message?.let { m -> Logger.e(m) } - onFailure("알 수 없는 오류가 발생했습니다. 다시 시도해 주세요.") + onFailure(it.message) } ) ) diff --git a/app/src/main/res/layout/activity_can_payment.xml b/app/src/main/res/layout/activity_can_payment.xml index 2d1520d2..60db382d 100644 --- a/app/src/main/res/layout/activity_can_payment.xml +++ b/app/src/main/res/layout/activity_can_payment.xml @@ -79,7 +79,7 @@ android:layout_marginHorizontal="13.3dp" android:layout_marginTop="26.7dp" android:fontFamily="@font/gmarket_sans_bold" - android:text="결제 수단 선택" + android:text="@string/screen_can_payment_select_method" android:textColor="@color/color_eeeeee" android:textSize="16.7sp" /> @@ -99,7 +99,7 @@ android:fontFamily="@font/gmarket_sans_medium" android:gravity="center" android:paddingVertical="16.7dp" - android:text="통합 결제" + android:text="@string/screen_can_payment_method_unified" android:textColor="@color/color_eeeeee" android:textSize="13.3sp" /> @@ -129,7 +129,7 @@ android:fontFamily="@font/gmarket_sans_medium" android:gravity="center" android:paddingVertical="16.7dp" - android:text="휴대폰 결제" + android:text="@string/screen_can_payment_method_phone" android:textColor="@color/color_eeeeee" android:textSize="13.3sp" /> @@ -144,7 +144,7 @@ android:drawablePadding="6.7dp" android:fontFamily="@font/gmarket_sans_medium" android:gravity="center" - android:text="구매조건 확인 및 결제 진행 동의" + android:text="@string/screen_can_payment_agree" android:textColor="@color/color_eeeeee" android:textSize="14.7sp" app:drawableStartCompat="@drawable/ic_select" /> @@ -156,7 +156,7 @@ android:layout_marginHorizontal="13.3dp" android:layout_marginTop="13.3dp" android:fontFamily="@font/gmarket_sans_medium" - android:text="- 충전된 캔의 유효기간은 충전 후 5년 입니다.\n- 결제 취소는 결제 후 7일 이내에만 할 수 있습니다.\n 단, 캔의 일부를 사용하면 결제 취소할 수 없습니다.\n- 광고성 이벤트 등 회사가 무료로 지급한 \n포인트는 환불되지 않습니다.\n- 자세한 내용은 보이스온 이용약관에서 확인할 수 있습니다." + android:text="@string/screen_can_payment_notice" android:textColor="@color/color_777777" android:textSize="12sp" /> @@ -195,7 +195,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:fontFamily="@font/gmarket_sans_medium" - android:text="결제금액" + android:text="@string/screen_can_payment_amount_label" android:textColor="@color/color_eeeeee" android:textSize="13.3sp" /> @@ -220,7 +220,7 @@ android:fontFamily="@font/gmarket_sans_bold" android:gravity="center" android:paddingVertical="16dp" - android:text="결제하기" + android:text="@string/screen_can_payment_pay" android:textColor="@color/color_1313bc" android:textSize="18.3sp" /> diff --git a/app/src/main/res/values-en/strings.xml b/app/src/main/res/values-en/strings.xml index 72e35f51..4fc69abb 100644 --- a/app/src/main/res/values-en/strings.xml +++ b/app/src/main/res/values-en/strings.xml @@ -382,6 +382,21 @@ In-app purchases are unavailable. Please try again. Cans charged. Purchase failed.\nPlease contact customer support. + + Pay + Select payment method + Unified payment + Mobile payment + I agree to the purchase terms and payment + - Charged cans expire 5 years after charging.\n- Payments can be cancelled within 7 days; cancellations are not allowed once any can is used.\n- Promotional cans provided for free are non-refundable.\n- See the VoiceOn Terms of Service for details. + Payment amount + Pay + KRW + Please try again.\nIf the issue persists, contact customer support. + Please select a payment method. + You must agree before proceeding with payment. + Payment failed.\nPlease try again. + Failed to start payment. Customer service VoiceOn Customer Service diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index cca0326a..4b88be5f 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -382,6 +382,21 @@ アプリ内決済を利用できません。もう一度お試しください。 CANをチャージしました。 購入に失敗しました。\nカスタマーセンターにお問い合わせください。 + + 決済する + 決済方法の選択 + 統合決済 + 携帯電話決済 + 購入条件を確認し、決済進行に同意 + - チャージしたCANの有効期限はチャージ後5年です。\n- 決済キャンセルは決済後7日以内のみ可能で、一部でも使用した場合はキャンセルできません。\n- 広告イベントなどで無料付与されたポイントは返金対象外です。\n- 詳細はVoiceOn利用規約をご確認ください。 + 決済金額 + 決済する + ウォン + 再度お試しください。\n問題が続く場合はカスタマーセンターにお問い合わせください。 + 決済方法を選択してください。 + 決済の進行に同意する必要があります。 + 決済に失敗しました。\nもう一度お試しください。 + 決済の開始に失敗しました。 カスタマーセンター VoiceOn カスタマーセンター diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index e3ffa679..6638c6e6 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -381,6 +381,21 @@ 인 앱 결제 이용이 불가능 합니다. 다시 시도해 주세요. 캔이 충전되었습니다 구매를 하지 못했습니다.\n고객센터로 문의해 주시기 바랍니다. + + 결제하기 + 결제 수단 선택 + 통합 결제 + 휴대폰 결제 + 구매조건 확인 및 결제 진행 동의 + - 충전된 캔의 유효기간은 충전 후 5년 입니다.\n- 결제 취소는 결제 후 7일 이내에만 할 수 있습니다.\n 단, 캔의 일부를 사용하면 결제 취소할 수 없습니다.\n- 광고성 이벤트 등 회사가 무료로 지급한 \n포인트는 환불되지 않습니다.\n- 자세한 내용은 보이스온 이용약관에서 확인할 수 있습니다. + 결제금액 + 결제하기 + + 다시 시도해 주세요.\n계속 같은 문제가 발생할 경우 고객센터로 문의 주시기 바랍니다. + 결제수단을 선택해 주세요. + 결제 진행에 동의하셔야 결제가 가능합니다. + 결제를 하지 못했습니다.\n다시 시도해 주세요. + 결제 초기화에 실패했습니다. 고객센터 보이스온 고객센터