From 1e39df6961d2551101b5a9b40dde721d19b93a52 Mon Sep 17 00:00:00 2001 From: wangyu Date: Thu, 5 Feb 2026 10:52:47 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=BE=AE=E4=BF=A1=E5=B0=8F?= =?UTF-8?q?=E7=A8=8B=E5=BA=8F=E6=94=AF=E4=BB=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 6 +- .../com/cheng/blzb/bean/VipGoodsEntity.kt | 2 + .../com/cheng/blzb/ui/dialog/BuySeatDialog.kt | 96 ++++++++++++++++--- .../ui/fragment/guide/vip/GuideVipFragment.kt | 58 +++++++++-- .../fragment/guide/vip/GuideVipViewModel.kt | 42 ++++++++ .../blzb/ui/fragment/mine/vip/VipFragment.kt | 60 +++++++++--- .../blzb/ui/fragment/mine/vip/VipViewModel.kt | 42 ++++++++ .../java/com/cheng/blzb/utils/pay/PayUtils.kt | 20 +++- .../com/example/base/dialog/LoadingDialog.kt | 9 +- .../example/base/livedata/DialogLiveEvent.kt | 3 +- .../example/base/viewmodel/BaseViewModel.kt | 4 +- 11 files changed, 297 insertions(+), 45 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 2fbe653..a0d1fca 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -20,8 +20,8 @@ android { applicationId "com.cheng.BoLe" minSdk 26 targetSdk 34 - versionCode 260 - versionName "2.6.0" + versionCode 270 + versionName "2.7.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" vectorDrawables { @@ -180,6 +180,8 @@ dependencies { implementation 'com.tencent.vasdolly:helper:3.0.4' //腾讯分包 implementation files('libs/humesdk-1.0.0.aar') //巨量分包 + implementation 'com.bytedance.ads:AppConvert:2.0.0' //巨量融合归因 + implementation 'com.getui:gysdk:3.1.7.0' //一键认证sdk implementation 'com.getui:gtsdk:3.3.8.0' // 推送sdk implementation 'com.getui:gtc:3.2.16.0' //个推公共库,如已接其他个推sdk则保留一个最高版本即可 diff --git a/app/src/main/java/com/cheng/blzb/bean/VipGoodsEntity.kt b/app/src/main/java/com/cheng/blzb/bean/VipGoodsEntity.kt index c38d3d1..10b5f7a 100644 --- a/app/src/main/java/com/cheng/blzb/bean/VipGoodsEntity.kt +++ b/app/src/main/java/com/cheng/blzb/bean/VipGoodsEntity.kt @@ -18,4 +18,6 @@ class VipGoodsEntity: Serializable { var member_limit: String = "" var member_price: String = "" var origin_member_price: String = "" + + var weixinMpOriId = "" } \ No newline at end of file diff --git a/app/src/main/java/com/cheng/blzb/ui/dialog/BuySeatDialog.kt b/app/src/main/java/com/cheng/blzb/ui/dialog/BuySeatDialog.kt index d0e16ed..bb9bcfe 100644 --- a/app/src/main/java/com/cheng/blzb/ui/dialog/BuySeatDialog.kt +++ b/app/src/main/java/com/cheng/blzb/ui/dialog/BuySeatDialog.kt @@ -6,11 +6,13 @@ import android.graphics.Color import android.graphics.drawable.ColorDrawable import android.os.Build import android.os.Bundle +import android.text.TextUtils import android.view.Gravity import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.core.content.ContextCompat +import androidx.core.view.isVisible import androidx.fragment.app.DialogFragment import androidx.lifecycle.lifecycleScope import com.cheng.blzb.R @@ -22,6 +24,7 @@ import com.cheng.blzb.databinding.DialogBuySeatBinding import com.cheng.blzb.event.PayStatusEnum import com.cheng.blzb.event.PayStatusEvent import com.cheng.blzb.event.PaySuccessEvent +import com.cheng.blzb.manager.DialogEnum import com.cheng.blzb.manager.EventReportManager import com.cheng.blzb.manager.LoginManager import com.cheng.blzb.manager.UserConfigManager @@ -41,6 +44,9 @@ import com.google.gson.JsonObject import com.tencent.mm.opensdk.openapi.IWXAPI import com.tencent.mm.opensdk.openapi.WXAPIFactory import io.reactivex.disposables.Disposable +import kotlinx.coroutines.Job +import kotlinx.coroutines.cancel +import kotlinx.coroutines.delay import kotlinx.coroutines.launch import okhttp3.RequestBody.Companion.toRequestBody import java.text.DecimalFormat @@ -60,6 +66,11 @@ class BuySeatDialog : DialogFragment() { private var payStatusDisposable: Disposable? = null + //是否显示订单支付结果查询提示 + private var showQueryTip = false + + var queryOrderJob: Job? = null + private var mOnBackListener: (() -> Unit)? = null //回调事件 private lateinit var binding: DialogBuySeatBinding @@ -73,10 +84,13 @@ class BuySeatDialog : DialogFragment() { windowParams?.gravity = Gravity.BOTTOM windowParams?.windowAnimations = R.style.dialog_bottom dialog?.window?.attributes = windowParams + + showQueryTipDialog() } override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { dialog?.window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT)) + isCancelable = false return super.onCreateView(inflater, container, savedInstanceState) } @@ -166,7 +180,11 @@ class BuySeatDialog : DialogFragment() { return@onClick } if (payType == 0) { - payCreateOrder("weixin") + if (!TextUtils.isEmpty(goodsEntity!!.weixinMpOriId)) { + payCreateOrder("combo") + } else { + payCreateOrder("weixin") + } } else if (payType == 1) { payCreateOrder("alipay") } @@ -182,13 +200,7 @@ class BuySeatDialog : DialogFragment() { payStatusDisposable = RxBus.defaultInstance.toObservable(PayStatusEvent::class.java).subscribe { when (it.payStatus) { PayStatusEnum.PAY_SUCCESS -> { - toast("支付成功") - EventReportManager.eventReport( - EventConstants.PAY_SUCCESS, - if (payType == 0) "weixin" else "alipay", - "{orderId:${orderEntity?.orderId}, meal:${Gson().toJson(goodsEntity)}}" - ) - RxBus.defaultInstance.post(PaySuccessEvent()) + getOrderInfo(orderEntity!!.orderId) } PayStatusEnum.PAY_CANCEL -> { @@ -221,7 +233,12 @@ class BuySeatDialog : DialogFragment() { if (response.status) { orderEntity = response.data if (this@BuySeatDialog.payType == 0) { - PayUtils.toWXPay(requireActivity(), response.data) + if (!TextUtils.isEmpty(goodsEntity?.weixinMpOriId)) { + PayUtils.toWXMPPay(requireActivity(), orderEntity!!.outTradeNo, goodsEntity!!.weixinMpOriId) + showQueryTip = true + } else { + PayUtils.toWXPay(requireActivity(), response.data) + } } else if (this@BuySeatDialog.payType == 1) { PayUtils.toAliPay(requireActivity(), response.data.payParam, "") } @@ -234,23 +251,63 @@ class BuySeatDialog : DialogFragment() { } } + private fun getOrderInfo(orderId: String) { + loadingDialog.show() + loadingDialog.setMessage("支付结果查询中") + cancelJob() + queryOrderJob = lifecycleScope.launch { + try { + repeat(10) { + val response = ApiFactory.apiService.getOrderInfo(orderId) + if (response.status) { + if (response.data.status == "2") { + toast("支付成功") + EventReportManager.eventReport( + EventConstants.PAY_SUCCESS, + if (payType == 0) "weixin" else "alipay", + "{orderId:${orderEntity?.orderId}, meal:${Gson().toJson(goodsEntity)}}" + ) + RxBus.defaultInstance.post(PaySuccessEvent()) + cancel() + } + delay(2000) + } else { + loadingDialog.dismiss() + toast(response.message, true) + cancel() + } + } + } catch (e: Exception) { + loadingDialog.dismiss() + L.d(e) + cancel() + } + } + } + + private fun cancelJob() { + queryOrderJob?.cancel() + queryOrderJob = null + } + private fun releasePayType() { val list = goodsEntity?.pay_type?.split(",")?.map { it.trim() }?.toList() - if (list?.find { it == "alipay" } != null) { + val globalPayType = UserConfigManager.getPayType() + if (list?.find { it == "alipay" } != null && globalPayType.find { it == "alipay" } != null) { binding.tvAliPay.visible() } else { binding.tvAliPay.gone() } - if (list?.find { it == "weixin" } != null) { + if (list?.find { it == "weixin" } != null && globalPayType.find { it == "weixin" } != null) { binding.tvWxPay.visible() } else { binding.tvWxPay.gone() } - if (goodsEntity?.pay_type!!.startsWith("weixin")) { + if (goodsEntity?.pay_type!!.startsWith("weixin") && binding.tvWxPay.isVisible) { payType = 0 } - if (goodsEntity?.pay_type!!.startsWith("alipay")) { + if (goodsEntity?.pay_type!!.startsWith("alipay") && binding.tvAliPay.isVisible) { payType = 1 } @@ -277,6 +334,19 @@ class BuySeatDialog : DialogFragment() { } } + private fun showQueryTipDialog() { + if (showQueryTip) { + val f = TipDialog.newInstance("温馨提示", "是否已完成支付", "未支付", "已支付", false) + f.setOnSelectListener { + if (it == DialogEnum.CLICK_OK) { + getOrderInfo(orderEntity!!.orderId) + } + } + f.show(childFragmentManager, TipDialog::class.java.simpleName) + showQueryTip = false + } + } + fun setOnSelectListener(listener: () -> Unit) { mOnBackListener = listener } diff --git a/app/src/main/java/com/cheng/blzb/ui/fragment/guide/vip/GuideVipFragment.kt b/app/src/main/java/com/cheng/blzb/ui/fragment/guide/vip/GuideVipFragment.kt index c2bb1a7..bacaa65 100644 --- a/app/src/main/java/com/cheng/blzb/ui/fragment/guide/vip/GuideVipFragment.kt +++ b/app/src/main/java/com/cheng/blzb/ui/fragment/guide/vip/GuideVipFragment.kt @@ -27,6 +27,8 @@ import com.cheng.blzb.common.EventConstants import com.cheng.blzb.databinding.FragmentGuideVipBinding import com.cheng.blzb.event.PayStatusEnum import com.cheng.blzb.event.PayStatusEvent +import com.cheng.blzb.event.PaySuccessEvent +import com.cheng.blzb.manager.DialogEnum import com.cheng.blzb.manager.EventReportManager import com.cheng.blzb.manager.LoginManager import com.cheng.blzb.manager.UserConfigManager @@ -34,6 +36,7 @@ import com.cheng.blzb.ui.activity.MainActivity import com.cheng.blzb.ui.activity.PublicActivity import com.cheng.blzb.ui.dialog.GuideSaleDialog import com.cheng.blzb.ui.dialog.PayTipDialog +import com.cheng.blzb.ui.dialog.TipDialog import com.cheng.blzb.ui.fragment.mine.order.cert.CertificateFragment import com.cheng.blzb.utils.DateUtils import com.cheng.blzb.utils.UrlHelper @@ -81,6 +84,8 @@ class GuideVipFragment: BaseFragment private lateinit var api: IWXAPI private var isAgree = false + //是否显示订单支付结果查询提示 + private var showQueryTip = false private var totalPrice = 0f private var lastGoodsPrice = 0f @@ -222,7 +227,11 @@ class GuideVipFragment: BaseFragment f.setOnSelectListener { binding.cbAgree.isChecked = true if (payType == 0) { - mViewModel.payCreateOrder(goodsEntity!!.goods_id, "weixin") + if (!TextUtils.isEmpty(goodsEntity!!.weixinMpOriId)) { + mViewModel.payCreateOrder(goodsEntity!!.goods_id, "combo") + } else { + mViewModel.payCreateOrder(goodsEntity!!.goods_id, "weixin") + } } else if (payType == 1) { mViewModel.payCreateOrder(goodsEntity!!.goods_id, "alipay") } else if (payType == 2) { @@ -232,7 +241,11 @@ class GuideVipFragment: BaseFragment f.show(childFragmentManager, PayTipDialog::class.java.simpleName) } else { if (payType == 0) { - mViewModel.payCreateOrder(goodsEntity!!.goods_id, "weixin") + if (!TextUtils.isEmpty(goodsEntity!!.weixinMpOriId)) { + mViewModel.payCreateOrder(goodsEntity!!.goods_id, "combo") + } else { + mViewModel.payCreateOrder(goodsEntity!!.goods_id, "weixin") + } } else if (payType == 1) { mViewModel.payCreateOrder(goodsEntity!!.goods_id, "alipay") } else if (payType == 2) { @@ -268,7 +281,12 @@ class GuideVipFragment: BaseFragment mViewModel.createOrderLiveData.observe(this) { orderEntity = it if (payType == 0) { - PayUtils.toWXPay(requireActivity(), it) + if (!TextUtils.isEmpty(goodsEntity?.weixinMpOriId)) { + PayUtils.toWXMPPay(requireActivity(), it.outTradeNo, goodsEntity!!.weixinMpOriId) + showQueryTip = true + } else { + PayUtils.toWXPay(requireActivity(), it) + } } else if (payType == 1) { PayUtils.toAliPay(requireActivity(), it.payParam, "") } else { @@ -276,6 +294,18 @@ class GuideVipFragment: BaseFragment } } + mViewModel.orderInfoLiveData.observe(this) { + if (it.status == "2") { + toast("支付成功") + EventReportManager.eventReport( + EventConstants.PAY_SUCCESS, + if (payType == 0) "weixin" else "alipay", + "{isGuide: true, orderId:${orderEntity?.orderId}, meal:${Gson().toJson(goodsEntity)}}" + ) + requireActivity().startActivity() + } + } + mViewModel.payTipsLiveData.observe(this) { userTipsList.addAll(it) userTipsAdapter.notifyDataSetChanged() @@ -289,13 +319,7 @@ class GuideVipFragment: BaseFragment val payStatusDisposable = RxBus.defaultInstance.toObservable(PayStatusEvent::class.java).subscribe { when (it.payStatus) { PayStatusEnum.PAY_SUCCESS -> { - toast("支付成功") - EventReportManager.eventReport( - EventConstants.PAY_SUCCESS, - if (payType == 0) "weixin" else "alipay", - "{isGuide: true, orderId:${orderEntity?.orderId}, meal:${Gson().toJson(goodsEntity)}}" - ) - requireActivity().startActivity() + mViewModel.getOrderInfo(orderEntity!!.orderId) } PayStatusEnum.PAY_CANCEL -> { @@ -312,6 +336,19 @@ class GuideVipFragment: BaseFragment addDisposable(payStatusDisposable) } + private fun showQueryTipDialog() { + if (showQueryTip) { + val f = TipDialog.newInstance("温馨提示", "是否已完成支付", "未支付", "已支付", false) + f.setOnSelectListener { + if (it == DialogEnum.CLICK_OK) { + mViewModel.getOrderInfo(orderEntity!!.orderId) + } + } + f.show(childFragmentManager, TipDialog::class.java.simpleName) + showQueryTip = false + } + } + private fun setData() { totalInfo = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { arguments?.getSerializable("total", GuideTotalBidEntity::class.java) @@ -704,6 +741,7 @@ class GuideVipFragment: BaseFragment override fun onStart() { startScroll() + showQueryTipDialog() super.onStart() } diff --git a/app/src/main/java/com/cheng/blzb/ui/fragment/guide/vip/GuideVipViewModel.kt b/app/src/main/java/com/cheng/blzb/ui/fragment/guide/vip/GuideVipViewModel.kt index 9108c67..c81fed2 100644 --- a/app/src/main/java/com/cheng/blzb/ui/fragment/guide/vip/GuideVipViewModel.kt +++ b/app/src/main/java/com/cheng/blzb/ui/fragment/guide/vip/GuideVipViewModel.kt @@ -2,6 +2,7 @@ package com.cheng.blzb.ui.fragment.guide.vip import androidx.lifecycle.MutableLiveData import com.cheng.blzb.bean.GuideUpdateEntity +import com.cheng.blzb.bean.OrderEntity import com.cheng.blzb.bean.OrderPayEntity import com.cheng.blzb.bean.VipGoodsEntity import com.cheng.blzb.net.ApiFactory @@ -9,11 +10,17 @@ import com.example.base.extensions.toast import com.example.base.utils.L import com.example.base.viewmodel.BaseViewModel import com.google.gson.JsonObject +import kotlinx.coroutines.Job +import kotlinx.coroutines.cancel +import kotlinx.coroutines.delay import okhttp3.RequestBody.Companion.toRequestBody class GuideVipViewModel: BaseViewModel() { + var queryOrderJob: Job? = null + val goodsListLiveData = MutableLiveData>() val createOrderLiveData = MutableLiveData() + val orderInfoLiveData = MutableLiveData() val payTipsLiveData = MutableLiveData>() val updateLiveData = MutableLiveData>() @@ -52,6 +59,31 @@ class GuideVipViewModel: BaseViewModel() { }) } + fun getOrderInfo(orderId: String) { + setMessage("支付结果查询中", true) + cancelJob() + queryOrderJob = launchOnUiTryCatch({ + repeat(10) { + val response = ApiFactory.apiService.getOrderInfo(orderId) + if (response.status) { + orderInfoLiveData.postValue(response.data) + if (response.data.status == "2") { + cancel() + } + delay(2000) + } else { + dismissDialog() + toast(response.message, true) + cancel() + } + } + }, { + dismissDialog() + L.d(it) + cancel() + }) + } + fun getPayUserTips() { launchOnUiTryCatch({ val response = ApiFactory.apiService.getPayUserTips() @@ -75,4 +107,14 @@ class GuideVipViewModel: BaseViewModel() { L.d(it) }) } + + private fun cancelJob() { + queryOrderJob?.cancel() + queryOrderJob = null + } + + override fun onCleared() { + super.onCleared() + cancelJob() + } } \ No newline at end of file diff --git a/app/src/main/java/com/cheng/blzb/ui/fragment/mine/vip/VipFragment.kt b/app/src/main/java/com/cheng/blzb/ui/fragment/mine/vip/VipFragment.kt index c6d3b64..724d9fa 100644 --- a/app/src/main/java/com/cheng/blzb/ui/fragment/mine/vip/VipFragment.kt +++ b/app/src/main/java/com/cheng/blzb/ui/fragment/mine/vip/VipFragment.kt @@ -21,11 +21,13 @@ import com.cheng.blzb.databinding.FragmentVipBinding import com.cheng.blzb.event.PayStatusEnum import com.cheng.blzb.event.PayStatusEvent import com.cheng.blzb.event.PaySuccessEvent +import com.cheng.blzb.manager.DialogEnum import com.cheng.blzb.manager.EventReportManager import com.cheng.blzb.manager.LoginManager import com.cheng.blzb.manager.UserConfigManager import com.cheng.blzb.ui.activity.PublicActivity import com.cheng.blzb.ui.dialog.PayTipDialog +import com.cheng.blzb.ui.dialog.TipDialog import com.cheng.blzb.ui.fragment.mine.order.cert.CertificateFragment import com.cheng.blzb.utils.DateUtils import com.cheng.blzb.utils.UrlHelper @@ -61,9 +63,10 @@ class VipFragment : BaseFragment() { private lateinit var api: IWXAPI private var isAgree = false + //是否显示订单支付结果查询提示 + private var showQueryTip = false private var payType = 0 //0微信支付 1支付宝支付 private var totalPrice = 0f - private var lastGoodsPrice = 0f private var seatPrice = 0f @@ -216,7 +219,11 @@ class VipFragment : BaseFragment() { f.setOnSelectListener { binding.cbAgree.isChecked = true if (payType == 0) { - mViewModel.payCreateOrder(goodsEntity!!.goods_id, "weixin", origin, "${seatCount - seatCountLimit}") + if (!TextUtils.isEmpty(goodsEntity!!.weixinMpOriId)) { + mViewModel.payCreateOrder(goodsEntity!!.goods_id, "combo", origin, "${seatCount - seatCountLimit}") + } else { + mViewModel.payCreateOrder(goodsEntity!!.goods_id, "weixin", origin, "${seatCount - seatCountLimit}") + } } else if (payType == 1) { mViewModel.payCreateOrder(goodsEntity!!.goods_id, "alipay", origin, "${seatCount - seatCountLimit}") } else if (payType == 2) { @@ -226,7 +233,11 @@ class VipFragment : BaseFragment() { f.show(childFragmentManager, PayTipDialog::class.java.simpleName) } else { if (payType == 0) { - mViewModel.payCreateOrder(goodsEntity!!.goods_id, "weixin", origin, "${seatCount - seatCountLimit}") + if (!TextUtils.isEmpty(goodsEntity!!.weixinMpOriId)) { + mViewModel.payCreateOrder(goodsEntity!!.goods_id, "combo", origin, "${seatCount - seatCountLimit}") + } else { + mViewModel.payCreateOrder(goodsEntity!!.goods_id, "weixin", origin, "${seatCount - seatCountLimit}") + } } else if (payType == 1) { mViewModel.payCreateOrder(goodsEntity!!.goods_id, "alipay", origin, "${seatCount - seatCountLimit}") } else if (payType == 2) { @@ -306,7 +317,12 @@ class VipFragment : BaseFragment() { mViewModel.createOrderLiveData.observe(this) { orderEntity = it if (payType == 0) { - PayUtils.toWXPay(requireActivity(), it) + if (!TextUtils.isEmpty(goodsEntity?.weixinMpOriId)) { + PayUtils.toWXMPPay(requireActivity(), it.outTradeNo, goodsEntity!!.weixinMpOriId) + showQueryTip = true + } else { + PayUtils.toWXPay(requireActivity(), it) + } } else if (payType == 1) { PayUtils.toAliPay(requireActivity(), it.payParam, "") } else { @@ -314,6 +330,19 @@ class VipFragment : BaseFragment() { } } + mViewModel.orderInfoLiveData.observe(this) { + if (it.status == "2") { + toast("支付成功") + EventReportManager.eventReport( + EventConstants.PAY_SUCCESS, + if (payType == 0) "weixin" else "alipay", + "{orderId:${orderEntity?.orderId}, meal:${Gson().toJson(goodsEntity)}}" + ) + RxBus.defaultInstance.post(PaySuccessEvent()) + requireActivity().finish() + } + } + mViewModel.payTipsLiveData.observe(this) { userTipsList.addAll(it) userTipsAdapter.notifyDataSetChanged() @@ -323,14 +352,7 @@ class VipFragment : BaseFragment() { val payStatusDisposable = RxBus.defaultInstance.toObservable(PayStatusEvent::class.java).subscribe { when (it.payStatus) { PayStatusEnum.PAY_SUCCESS -> { - toast("支付成功") - EventReportManager.eventReport( - EventConstants.PAY_SUCCESS, - if (payType == 0) "weixin" else "alipay", - "{orderId:${orderEntity?.orderId}, meal:${Gson().toJson(goodsEntity)}}" - ) - RxBus.defaultInstance.post(PaySuccessEvent()) - requireActivity().finish() + mViewModel.getOrderInfo(orderEntity!!.orderId) } PayStatusEnum.PAY_CANCEL -> { @@ -347,6 +369,19 @@ class VipFragment : BaseFragment() { addDisposable(payStatusDisposable) } + private fun showQueryTipDialog() { + if (showQueryTip) { + val f = TipDialog.newInstance("温馨提示", "是否已完成支付", "未支付", "已支付", false) + f.setOnSelectListener { + if (it == DialogEnum.CLICK_OK) { + mViewModel.getOrderInfo(orderEntity!!.orderId) + } + } + f.show(childFragmentManager, TipDialog::class.java.simpleName) + showQueryTip = false + } + } + private fun checkPayType() { if (payType == 0) { val start1 = ContextCompat.getDrawable(requireContext(), R.mipmap.ic_wx_pay) @@ -601,6 +636,7 @@ class VipFragment : BaseFragment() { override fun onStart() { startScroll() + showQueryTipDialog() super.onStart() } diff --git a/app/src/main/java/com/cheng/blzb/ui/fragment/mine/vip/VipViewModel.kt b/app/src/main/java/com/cheng/blzb/ui/fragment/mine/vip/VipViewModel.kt index 5e5d975..020dbee 100644 --- a/app/src/main/java/com/cheng/blzb/ui/fragment/mine/vip/VipViewModel.kt +++ b/app/src/main/java/com/cheng/blzb/ui/fragment/mine/vip/VipViewModel.kt @@ -3,6 +3,7 @@ package com.cheng.blzb.ui.fragment.mine.vip import androidx.lifecycle.MutableLiveData import com.cheng.blzb.bean.CorpEntity import com.cheng.blzb.bean.CouponEntity +import com.cheng.blzb.bean.OrderEntity import com.cheng.blzb.bean.OrderPayEntity import com.cheng.blzb.bean.UserEntity import com.cheng.blzb.bean.VipGoodsEntity @@ -12,13 +13,19 @@ import com.example.base.utils.L import com.example.base.viewmodel.BaseViewModel import com.google.gson.JsonObject import com.ylqh.cube.bean.CouponActivityEntity +import kotlinx.coroutines.Job +import kotlinx.coroutines.cancel +import kotlinx.coroutines.delay import okhttp3.RequestBody.Companion.toRequestBody class VipViewModel : BaseViewModel() { + var queryOrderJob: Job? = null + val userInfoLiveData = MutableLiveData() val goodsListLiveData = MutableLiveData>() val corpInfoLiveData = MutableLiveData() val createOrderLiveData = MutableLiveData() + val orderInfoLiveData = MutableLiveData() val payTipsLiveData = MutableLiveData>() val couponListLiveData = MutableLiveData>() val couponActivityLiveData = MutableLiveData>() @@ -97,6 +104,31 @@ class VipViewModel : BaseViewModel() { }) } + fun getOrderInfo(orderId: String) { + setMessage("支付结果查询中", true) + cancelJob() + queryOrderJob = launchOnUiTryCatch({ + repeat(10) { + val response = ApiFactory.apiService.getOrderInfo(orderId) + if (response.status) { + orderInfoLiveData.postValue(response.data) + if (response.data.status == "2") { + cancel() + } + delay(2000) + } else { + dismissDialog() + toast(response.message, true) + cancel() + } + } + }, { + dismissDialog() + L.d(it) + cancel() + }) + } + fun getPayUserTips() { launchOnUiTryCatch({ val response = ApiFactory.apiService.getPayUserTips() @@ -151,4 +183,14 @@ class VipViewModel : BaseViewModel() { L.d(it) }) } + + private fun cancelJob() { + queryOrderJob?.cancel() + queryOrderJob = null + } + + override fun onCleared() { + super.onCleared() + cancelJob() + } } \ No newline at end of file diff --git a/app/src/main/java/com/cheng/blzb/utils/pay/PayUtils.kt b/app/src/main/java/com/cheng/blzb/utils/pay/PayUtils.kt index 671517d..6a9a5c0 100644 --- a/app/src/main/java/com/cheng/blzb/utils/pay/PayUtils.kt +++ b/app/src/main/java/com/cheng/blzb/utils/pay/PayUtils.kt @@ -11,6 +11,7 @@ import com.cheng.blzb.common.Constants import com.example.base.common.RxBus import com.example.base.extensions.toast import com.example.base.utils.L +import com.tencent.mm.opensdk.modelbiz.WXLaunchMiniProgram import com.tencent.mm.opensdk.modelpay.PayReq import com.tencent.mm.opensdk.openapi.WXAPIFactory @@ -41,6 +42,22 @@ object PayUtils { api.sendReq(request) } + /** + * 微信小程序支付 + */ + fun toWXMPPay(mActivity: Activity, outTradeNo: String, mpAppId: String) { + try { + val api = WXAPIFactory.createWXAPI(mActivity, Constants.WechatAppId) + val req = WXLaunchMiniProgram.Req() + req.userName = mpAppId // 填小程序原始id + req.path = "pages/index/index?outTradeNo=$outTradeNo" + req.miniprogramType = WXLaunchMiniProgram.Req.MINIPTOGRAM_TYPE_RELEASE + api.sendReq(req) + } catch (e: Exception) { + toast("跳转支付失败,请检查是否安装最新版微信") + } + } + /** * 支付宝 */ @@ -90,19 +107,16 @@ object PayUtils { when { TextUtils.equals(resultStatus, "9000") -> { // 该笔订单是否真实支付成功,需要依赖服务端的异步通知。 - toast("支付成功") RxBus.defaultInstance.post(com.cheng.blzb.event.PayStatusEvent(com.cheng.blzb.event.PayStatusEnum.PAY_SUCCESS)) } TextUtils.equals(resultStatus, "6001") -> { // 该笔订单是否真实支付成功,需要依赖服务端的异步通知。 - toast("支付取消") RxBus.defaultInstance.post(com.cheng.blzb.event.PayStatusEvent(com.cheng.blzb.event.PayStatusEnum.PAY_CANCEL)) } else -> { // 该笔订单真实的支付结果,需要依赖服务端的异步通知。 - toast("支付失败") L.d("resultStatus=${resultStatus}") RxBus.defaultInstance.post(com.cheng.blzb.event.PayStatusEvent(com.cheng.blzb.event.PayStatusEnum.PAY_ERROR, resultInfo)) } diff --git a/base/src/main/java/com/example/base/dialog/LoadingDialog.kt b/base/src/main/java/com/example/base/dialog/LoadingDialog.kt index 6289f49..9948c00 100644 --- a/base/src/main/java/com/example/base/dialog/LoadingDialog.kt +++ b/base/src/main/java/com/example/base/dialog/LoadingDialog.kt @@ -3,6 +3,7 @@ package com.example.base.dialog import android.content.Context import android.graphics.Color import android.graphics.drawable.ColorDrawable +import android.text.TextUtils import android.view.Gravity import android.view.View import android.view.Window @@ -57,7 +58,11 @@ class LoadingDialog(context: Context?) : AppCompatDialog(context!!) { fun setMessage(msg: String) { val textView = findViewById(R.id.tvMessage) - textView?.visibility = View.VISIBLE - textView?.text = msg + if (!TextUtils.isEmpty(msg)) { + textView?.visibility = View.VISIBLE + textView?.text = msg + } else { + textView?.visibility = View.GONE + } } } \ No newline at end of file diff --git a/base/src/main/java/com/example/base/livedata/DialogLiveEvent.kt b/base/src/main/java/com/example/base/livedata/DialogLiveEvent.kt index fdb89e3..991522b 100644 --- a/base/src/main/java/com/example/base/livedata/DialogLiveEvent.kt +++ b/base/src/main/java/com/example/base/livedata/DialogLiveEvent.kt @@ -18,9 +18,10 @@ class DialogLiveEvent : SingleLiveEvent() { value = bean } - fun setValue(isShow: Boolean, msg: String) { + fun setValue(isShow: Boolean, msg: String, cancelable: Boolean = false) { bean.isShow = isShow bean.msg = msg + bean.cancelable = cancelable value = bean } } \ No newline at end of file diff --git a/base/src/main/java/com/example/base/viewmodel/BaseViewModel.kt b/base/src/main/java/com/example/base/viewmodel/BaseViewModel.kt index 3001002..90e3acc 100644 --- a/base/src/main/java/com/example/base/viewmodel/BaseViewModel.kt +++ b/base/src/main/java/com/example/base/viewmodel/BaseViewModel.kt @@ -47,8 +47,8 @@ abstract class BaseViewModel : ViewModel() { showDialogLiveEvent.setValue(true, cancelable) } - fun setMessage(msg: String) { - showDialogLiveEvent.setValue(true, msg) + fun setMessage(msg: String, cancelable: Boolean = false) { + showDialogLiveEvent.setValue(true, msg, cancelable) } fun dismissDialog() {