package com.uiuios.aios.activity; import android.content.Intent; import android.util.Log; import android.view.View; import androidx.databinding.DataBindingUtil; import com.trello.rxlifecycle4.RxLifecycle; import com.trello.rxlifecycle4.android.ActivityEvent; import com.uiuios.aios.R; import com.uiuios.aios.base.BaseDataBindingActivity; import com.uiuios.aios.bean.BaseResponse; import com.uiuios.aios.bean.OrderBean; import com.uiuios.aios.bean.WxpayBean; import com.uiuios.aios.databinding.ActivityPayBinding; import com.uiuios.aios.network.NetInterfaceManager; import com.uiuios.aios.utils.BitmapUtils; import com.uiuios.aios.utils.ToastUtil; import java.util.concurrent.TimeUnit; import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers; import io.reactivex.rxjava3.annotations.NonNull; import io.reactivex.rxjava3.core.Observable; import io.reactivex.rxjava3.core.Observer; import io.reactivex.rxjava3.disposables.Disposable; import io.reactivex.rxjava3.functions.Consumer; import io.reactivex.rxjava3.schedulers.Schedulers; public class PayActivity extends BaseDataBindingActivity { private static final String TAG = PayActivity.class.getSimpleName(); private ActivityPayBinding mBinding; private OrderBean mOrderBean; @Override protected int getLayoutId() { return R.layout.activity_pay; } @Override protected boolean setNightMode() { return true; } @Override protected boolean setfitWindow() { return true; } /** * 初始化视图 */ @Override public void initView() { mBinding = DataBindingUtil.setContentView(this, getLayoutId()); mBinding.tvRefresh.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { getWechatPayQrcode(mOrderBean); } }); mBinding.ivExit.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { finish(); } }); } /** * 初始化数据 */ @Override public void initData() { Intent intent = getIntent(); if (intent == null) return; OrderBean orderBean = (OrderBean) intent.getSerializableExtra("OrderBean"); if (orderBean == null) return; mOrderBean = orderBean; getWechatPayQrcode(mOrderBean); } private Disposable mCountdownSubscribe; private void getWechatPayQrcode(OrderBean orderBean) { if (orderBean == null) return; NetInterfaceManager.getInstance() .getOrderPayObservable(orderBean.getOrder_sn(), orderBean.getOrder_id()) .compose(RxLifecycle.bindUntilEvent(getLifecycleSubject(), ActivityEvent.DESTROY)) .subscribe(new Observer>() { @Override public void onSubscribe(@NonNull Disposable d) { Log.e("getOrderPayObservable", "onSubscribe: "); } @Override public void onNext(@NonNull BaseResponse wxpayBeanBaseResponse) { Log.e("getOrderPayObservable", "onNext: " + wxpayBeanBaseResponse); if (wxpayBeanBaseResponse.code == 200) { WxpayBean wxpayBean = wxpayBeanBaseResponse.data; mBinding.setWxpayBean(wxpayBean); mBinding.tvOrderId.setText("订单编号:" + wxpayBean.getOrder_sn()); long expireTime = wxpayBean.getTime_expire(); mBinding.ivWxQrcode.setImageBitmap(BitmapUtils.createQRImage(wxpayBean.getCode_url(), 400, 400)); initCountdown(expireTime); checkOrder(wxpayBean); } } @Override public void onError(@NonNull Throwable e) { Log.e("getOrderPayObservable", "onError: " + e.getMessage()); } @Override public void onComplete() { Log.e("getOrderPayObservable", "onComplete: "); } }); } private void initCountdown(long second) { if (mCountdownSubscribe != null && !mCountdownSubscribe.isDisposed()) { mCountdownSubscribe.dispose(); } mCountdownSubscribe = Observable.interval(1, TimeUnit.SECONDS) .compose(RxLifecycle.bindUntilEvent(getLifecycleSubject(), ActivityEvent.DESTROY)) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Consumer() { @Override public void accept(Long aLong) throws Exception { long timestamp = System.currentTimeMillis() / 1000; Log.e("initCountdown", "accept: time_expire = " + second); Log.e("initCountdown", "accept: aLong = " + aLong); Log.e("initCountdown", "accept: timestamp = " + timestamp); if (timestamp >= second) { mBinding.ivWxQrcode.setImageDrawable(getDrawable(R.drawable.qrcode_expired)); if (mCountdownSubscribe != null && !mCountdownSubscribe.isDisposed()) { mCountdownSubscribe.dispose(); } } else { } } }); } private Disposable mCheckOrderSubscribe; private void checkOrder(WxpayBean wxpayBean) { if (mCheckOrderSubscribe != null && !mCheckOrderSubscribe.isDisposed()) { mCheckOrderSubscribe.dispose(); } mCheckOrderSubscribe = Observable.interval(5, TimeUnit.SECONDS) .compose(RxLifecycle.bindUntilEvent(getLifecycleSubject(), ActivityEvent.DESTROY)) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Consumer() { @Override public void accept(Long aLong) throws Exception { NetInterfaceManager.getInstance() .getOrderPayCheckObservable(wxpayBean.getOrder_sn(), wxpayBean.getOrder_id()) .compose(RxLifecycle.bindUntilEvent(getLifecycleSubject(), ActivityEvent.DESTROY)) .subscribe(new Observer() { @Override public void onSubscribe(@NonNull Disposable d) { Log.e("checkOrder", "onSubscribe: "); } @Override public void onNext(@NonNull BaseResponse baseResponse) { Log.e("checkOrder", "onNext: " + baseResponse); if (baseResponse.code == 200) { if (mCountdownSubscribe != null && !mCountdownSubscribe.isDisposed()) { mCountdownSubscribe.dispose(); } if (mCheckOrderSubscribe != null && !mCheckOrderSubscribe.isDisposed()) { mCheckOrderSubscribe.dispose(); } ToastUtil.show("支付成功"); finish(); } else { Log.e("checkOrder", "onNext: " + "支付失败"); } } @Override public void onError(@NonNull Throwable e) { Log.e("checkOrder", "onError: " + e.getMessage()); } @Override public void onComplete() { Log.e("checkOrder", "onComplete: "); } }); } }); } }