From 3dfeaf54bfc143191d5fe6a88917844ef986c553 Mon Sep 17 00:00:00 2001 From: renhaoting <370797079@qq.com> Date: Thu, 11 Dec 2025 15:24:31 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8F=90=E7=8E=B0=20init=20=E4=BB=A5=E5=8F=8A?= =?UTF-8?q?=20payout=20=E6=8E=A5=E5=8F=A3=E5=8F=82=E6=95=B0=20=E9=80=82?= =?UTF-8?q?=E9=85=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/gamedog/vididin/VidiConst.kt | 4 +- .../vididin/beans/resp/WithDrawRespData.kt | 3 +- .../features/withdraw/WithDrawActivity.kt | 95 +++++++++++++++++-- .../features/withdraw/WithdrawViewModel.kt | 43 ++++++++- app/src/main/res/values/strings.xml | 5 + .../ama/core/architecture/util/AndroidUtil.kt | 8 ++ .../com/ama/core/architecture/util/MD5Util.kt | 18 +++- .../com/ama/core/architecture/util/SpUtil.kt | 3 + 8 files changed, 163 insertions(+), 16 deletions(-) diff --git a/app/src/main/java/com/gamedog/vididin/VidiConst.kt b/app/src/main/java/com/gamedog/vididin/VidiConst.kt index e7d2623..fe0abb8 100644 --- a/app/src/main/java/com/gamedog/vididin/VidiConst.kt +++ b/app/src/main/java/com/gamedog/vididin/VidiConst.kt @@ -3,6 +3,8 @@ package com.gamedog.vididin object VidiConst { + + /** * Varous type for watching Ad */ @@ -56,7 +58,7 @@ object VidiConst { const val ZEROBUY_APPID: String = "com.vididin.real.money.game" const val DIAMOND_NUM_FOR_ONE_AD = 5 - + const val WITHDRAW_SMALL_NUM = 0.1F diff --git a/app/src/main/java/com/gamedog/vididin/beans/resp/WithDrawRespData.kt b/app/src/main/java/com/gamedog/vididin/beans/resp/WithDrawRespData.kt index d8542e2..a3eae75 100644 --- a/app/src/main/java/com/gamedog/vididin/beans/resp/WithDrawRespData.kt +++ b/app/src/main/java/com/gamedog/vididin/beans/resp/WithDrawRespData.kt @@ -24,7 +24,7 @@ data class PayInit(var data: PayInitReply? = null) : BaseReply() { open class PayInitReply ( var uuid: String? = null, - var items: MutableList? = null, + var items: List? = null, var days: Int = 0, var error: Int = 0, ) @@ -74,6 +74,7 @@ data class PayoutReply ( var id: String? = null, var record_no: String? = null, var error: Int = 0, + var hasCheckedResult: Boolean = false, ) diff --git a/app/src/main/java/com/gamedog/vididin/features/withdraw/WithDrawActivity.kt b/app/src/main/java/com/gamedog/vididin/features/withdraw/WithDrawActivity.kt index 851915e..503ad09 100644 --- a/app/src/main/java/com/gamedog/vididin/features/withdraw/WithDrawActivity.kt +++ b/app/src/main/java/com/gamedog/vididin/features/withdraw/WithDrawActivity.kt @@ -8,9 +8,13 @@ import androidx.lifecycle.Lifecycle import androidx.lifecycle.lifecycleScope import androidx.lifecycle.repeatOnLifecycle import com.ama.core.architecture.appBase.AppViewsEmptyViewModelActivity +import com.ama.core.architecture.util.AndroidUtil +import com.ama.core.architecture.util.SpUtil import com.ama.core.architecture.util.setOnClickBatch +import com.gamedog.vididin.VidiConst import com.vididin.real.money.game.R import com.gamedog.vididin.VididinEvents +import com.gamedog.vididin.beans.resp.PayoutReply import com.gamedog.vididin.core.login.login.AccountManager import com.gamedog.vididin.features.withdraw.dialogs.WithdrawBindBankDialog import com.gamedog.vididin.features.withdraw.dialogs.WithdrawInfoConfirmDialog @@ -133,15 +137,14 @@ class WithDrawActivity : AppViewsEmptyViewModelActivity(), OnTabSty VididinEvents.EVENT_AD_WATCHED_FOR_WITHDRAW -> { var withdrawNum: Float = (data.mData as Double).toFloat() - withdrawInit() - withdrawPayout() - withdrawCheck() + tryWithdraw(withdrawNum) } } }, VididinEvents.Event_Account_Cash_Changed, VididinEvents.EVENT_AD_WATCHED_FOR_WITHDRAW) } + override fun ViewBinding.initObservers() { //TODO("Not yet implemented") } @@ -150,8 +153,13 @@ class WithDrawActivity : AppViewsEmptyViewModelActivity(), OnTabSty //TODO("Not yet implemented") } + private fun tryWithdraw(withdrawNum: Float) { + withdrawInit(withdrawNum) + /*withdrawPayout() + withdrawCheck()*/ + } - private fun withdrawInit() { + private fun withdrawInit(withdrawNum: Float) { lifecycleScope.launch { repeatOnLifecycle(Lifecycle.State.STARTED) { viewModel.InitData.collect { result -> @@ -160,6 +168,28 @@ class WithDrawActivity : AppViewsEmptyViewModelActivity(), OnTabSty } is Result.Success -> { + val reqInitBean = result.data.data + + reqInitBean?.let { + if (it.error == 0 && !it.uuid.isNullOrEmpty() && !it.items.isNullOrEmpty()) { + val itemId = if (withdrawNum <= VidiConst.WITHDRAW_SMALL_NUM) 0 else 1 + val withDrawItem = it.items?.get(itemId)!! + if (withDrawItem.status == ACTIVE) { + withdrawPayout(it.uuid!!, withDrawItem.id, withdrawNum) + } else { + AndroidUtil.showToast(R.string.withdraw_fail_status_is_unavailable) + } + + } else { + var errorHint = R.string.withdraw_fail_init_fail + // 0成功,1失败,2签名验证失败,3客户端版本过低,4 ts长度错误 + when (it.error) { + 3-> R.string.withdraw_fail_version_toolow + } + AndroidUtil.showToast(errorHint) + } + } + } is Result.Error -> { } @@ -171,15 +201,39 @@ class WithDrawActivity : AppViewsEmptyViewModelActivity(), OnTabSty viewModel.withdrawInit() } - private fun withdrawPayout() { + private fun withdrawPayout(initUUID: String, payItemId: Int, payCashNum: Float) { lifecycleScope.launch { repeatOnLifecycle(Lifecycle.State.STARTED) { viewModel.PayoutResult.collect { result -> when (result) { is Result.Loading -> { - } is Result.Success -> { + var errHintRes = 0 + when (result.data?.data?.error) { + /* 错误码, + 0成功,1失败,2签名验证失败,3客户端版本过低,4uuid错误,5所在地国家或地区不在提现限制内,6提现金额不符对应的产品id,7提现产品id不对,8达到提现金额限制,9提现次数超过限制,10今日没有提现机会,11提现账号达到次数限制,12身份审核条件不满足,不能提现,13巴西提现参数 document_type 错误, + 14巴西提现参数 document_id 错误,15 巴西提现参数 AccountType 错误,16 巴西提现参数 Name 错误,17巴西提现参数 Account 和 DocumentId 不同,18巴西提现参数account_type为CPF时 对应的 account 错误,19巴西提现参数account_type为CNPJ时 对应的 account 错误,20巴西提现参数 account_type 错误, + 21巴西提现参数 document_type 错误,22巴西提现参数account_type为CPF时 对应的 document_id 错误,23巴西提现参数account_type为CNPJ时 对应的 document_id 错误,24 ts长度错误,25 没提0.1就提现其它的 + */ + 0 -> { + saveTransactionData(result.data.data!!) + startTimerForCheckPayoutResult(result.data.data!!) + } + 5-> { + errHintRes = R.string.withdraw_fail_region_restricit + } + 8-> { + errHintRes = R.string.withdraw_fail_amount_limit + } + 9-> { + errHintRes = R.string.withdraw_fail_amount_limit + } + } + + if (errHintRes > 0) { + AndroidUtil.showToast(errHintRes) + } } is Result.Error -> { } @@ -187,8 +241,7 @@ class WithDrawActivity : AppViewsEmptyViewModelActivity(), OnTabSty } } } - - viewModel.withdrawPayout() + viewModel.withdrawPayout(initUUID, payItemId, payCashNum) } private fun withdrawCheck() { @@ -200,6 +253,7 @@ class WithDrawActivity : AppViewsEmptyViewModelActivity(), OnTabSty } is Result.Success -> { + } is Result.Error -> { } @@ -211,8 +265,33 @@ class WithDrawActivity : AppViewsEmptyViewModelActivity(), OnTabSty viewModel.withdrawCheck() } + private fun saveTransactionData(data: PayoutReply) { + val historyList: MutableList = SpUtil.instance().getList(SpUtil.KEY_WITHDRAW_HISTORY_LIST) as MutableList + + historyList.forEachIndexed { index, reply -> + var hasExisted = false + if (reply.id == data.id) { + reply.record_no = data.record_no + reply.error = data.error + reply.hasCheckedResult = data.hasCheckedResult + hasExisted = true + } + + if (!hasExisted) { + historyList.add(data) + } + + SpUtil.instance().putList(SpUtil.KEY_WITHDRAW_HISTORY_LIST, historyList) + } + } + + private fun startTimerForCheckPayoutResult(data: PayoutReply) { + withdrawCheck() + } companion object { + const val ACTIVE = 1 + internal fun startActivity(activity: Activity) { activity.startActivity(Intent(activity.applicationContext, WithDrawActivity::class.java)) } diff --git a/app/src/main/java/com/gamedog/vididin/features/withdraw/WithdrawViewModel.kt b/app/src/main/java/com/gamedog/vididin/features/withdraw/WithdrawViewModel.kt index 90c3aee..246325b 100644 --- a/app/src/main/java/com/gamedog/vididin/features/withdraw/WithdrawViewModel.kt +++ b/app/src/main/java/com/gamedog/vididin/features/withdraw/WithdrawViewModel.kt @@ -13,6 +13,7 @@ import com.gamedog.vididin.beans.req.PayoutReq import com.gamedog.vididin.beans.resp.PayInit import com.gamedog.vididin.beans.resp.PayoutCheckData import com.gamedog.vididin.beans.resp.PayoutData +import com.gamedog.vididin.core.login.login.AccountManager import com.gamedog.vididin.netbase.NetworkUtil import com.gamedog.vididin.netbase.Result import kotlinx.coroutines.flow.MutableStateFlow @@ -43,10 +44,46 @@ class WithdrawViewModel : ViewModel() { } - fun withdrawPayout() { + fun withdrawPayout(initUUID: String, payItemId: Int, payCashNum: Float) { viewModelScope.launch { val requestParam = PayoutReq().applyInitFields().apply { - // TODO - + val bankAccount = "11032341882" //AccountManager.getAccount()?.bankInfo?.bankAccount + val accountType = "CPF" + + account = bankAccount + item_id = payItemId + amount = payCashNum.toString() + additional_remark = "communnyboneycashmoneyrewardfastrealgame" + uuid = initUUID + account_type = accountType + document_type = accountType + document_id = bankAccount + name = "CapyBucks" + clientName = "com.jaguar.pace.earn.cash.free.game" //AndroidUtil.getPackageId() + + + dataAdjust.gps_adid = "gaid" + dataAdjust.android_id = "androidid" + dataAdjust.adid = "adid" + dataAdjust.user_agent = "GetUerAgent" + dataAdjust.price = amount + dataAdjust.currency = "USD" + + dataShuShu.gps_gaid = "gaid" + dataShuShu.android_id = "androidid" + dataShuShu.adid = "adid" + dataShuShu.user_agent = "GetUerAgent" + dataShuShu.price = amount + dataShuShu.currency = "USD" + dataShuShu.payment_method = "Pix" + dataShuShu.payment_type = accountType + dataShuShu.payment_number = account + dataShuShu.iap_name = "100br" + dataShuShu.gamecoin_number = "100" + dataShuShu.gamecoin_type = "gold" + dataShuShu.ss_account_id = "GetSSAccountId" + dataShuShu.ss_distinct_id = "GetSSDistinctId" + dataShuShu.ss_super_properties = "GetSSSuper Properties" } _PayoutResult.value = Result.Loading @@ -77,7 +114,7 @@ class WithdrawViewModel : ViewModel() { version = AndroidUtil.getAppVersionInfo() ip = NetUtil.getLocalIpAddress() ts = (System.currentTimeMillis()/1000).toString() - val signOrigin = "${VidiConst.WITHDRAW_MD5KEY}platform=${platform}deviceid=${deviceid}version=${version}ip=${ip}ts={ts}" + val signOrigin = "${VidiConst.WITHDRAW_MD5KEY}platform=${platform}deviceid=${deviceid}version=${version}ip=${ip}ts=$ts" sign = MD5Util.md5ForWithDraw(signOrigin) } return this diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 99413a4..b9316a6 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -129,5 +129,10 @@ Junte-se a nós! Que pena\nvocê não foi o ganhador " Clique no link abaixo para entrar na nossa comunidade e conferir os ganhadores desta rodada!" + Withdraw init request failed + Your app version is too old, update you app try again. + Your account withdraw status is unavailable. + Regision restriction + Amount limit \ No newline at end of file diff --git a/core/architecture/src/main/java/com/ama/core/architecture/util/AndroidUtil.kt b/core/architecture/src/main/java/com/ama/core/architecture/util/AndroidUtil.kt index e83dd04..8725a15 100644 --- a/core/architecture/src/main/java/com/ama/core/architecture/util/AndroidUtil.kt +++ b/core/architecture/src/main/java/com/ama/core/architecture/util/AndroidUtil.kt @@ -99,6 +99,14 @@ class AndroidUtil private constructor() { } } + fun getPackageId(): String { + return try { + BaseApp.appContext().packageName + } catch (e: PackageManager.NameNotFoundException) { + "Failed to get app id: ${e.message}" + } + } + fun getThumbOfView(targetView: View): Bitmap? { diff --git a/core/architecture/src/main/java/com/ama/core/architecture/util/MD5Util.kt b/core/architecture/src/main/java/com/ama/core/architecture/util/MD5Util.kt index 4ab5874..017eea1 100644 --- a/core/architecture/src/main/java/com/ama/core/architecture/util/MD5Util.kt +++ b/core/architecture/src/main/java/com/ama/core/architecture/util/MD5Util.kt @@ -50,14 +50,26 @@ object MD5Util { + fun md5ForWithDraw(pOriginal: String): String { + val bytes = pOriginal.toByteArray(StandardCharsets.UTF_8) + val digest = MessageDigest.getInstance("MD5").digest(bytes) + return digest.joinToString("") { "%02x".format(it.toInt() and 0xFF) } + } + + + /** * MD5加密函数 * @param original 原始字符串 * @param charsetName 字符编码名称,默认为"UTF-8" * @return 返回32位小写的MD5哈希字符串 */ - fun md5ForWithDraw(input: String): String { - // 元宝 + fun md5ForWithDraw2(pOriginal: String): String { + val bytes = pOriginal.toByteArray(Charset.forName("UTF-8")) + val digest = MessageDigest.getInstance("MD5").digest(bytes) + return digest.joinToString("") {"%02".format(it.toInt() and 0xFF) } + + /*// 元宝 val bytes = input.toByteArray(charset("UTF-8")) // 按指定字符集转换为字节数组[6](@ref) val digest = MessageDigest.getInstance("MD5") // 获取MD5实例[6,7,8](@ref) val hashBytes = digest.digest(bytes) // 计算MD5哈希值[6,7,8](@ref) @@ -71,7 +83,7 @@ object MD5Util { } hexString.append(hex) } - return hexString.toString().lowercase() + return hexString.toString().lowercase()*/ /* // 百度 val md = MessageDigest.getInstance("MD5") diff --git a/core/architecture/src/main/java/com/ama/core/architecture/util/SpUtil.kt b/core/architecture/src/main/java/com/ama/core/architecture/util/SpUtil.kt index d8e9b33..b9c4b01 100644 --- a/core/architecture/src/main/java/com/ama/core/architecture/util/SpUtil.kt +++ b/core/architecture/src/main/java/com/ama/core/architecture/util/SpUtil.kt @@ -35,6 +35,9 @@ class SpUtil private constructor(spFileName: String) { const val KEY_ZEROBUY_HAS_NOTIFY_IDS = "KEY_ZEROBUY_HAS_NOTIFY_IDS" + const val KEY_WITHDRAW_HISTORY_LIST = "KEY_WITHDRAW_HISTORY_LIST" + + @Volatile