RxPay.kt 3.01 KB
Newer Older
1 2 3 4 5 6 7 8 9
package com.yidianling.ydl_pay.pay

import android.app.Activity
import android.content.Context
import com.alipay.sdk.app.PayTask
import com.tencent.mm.opensdk.constants.Build
import com.tencent.mm.opensdk.modelpay.PayReq
import com.tencent.mm.opensdk.openapi.WXAPIFactory
import com.ydl.ydlcommon.data.http.CustomThrowable
10
import com.ydl.ydlcommon.utils.log.AliYunLogConfig
11
import com.ydl.ydlcommon.utils.log.AliYunRichLogsHelper
yjiucheng committed
12
import com.yidianling.ydl_pay.common.bean.CommonWXPayBean
13
import com.yidianling.ydl_pay.common.bean.PayResult
14 15
import com.yidianling.ydl_pay.pay.bean.PayStatus
import com.yidianling.ydl_pay.pay.bean.WXPayEvent
16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
import de.greenrobot.event.EventBus
import io.reactivex.Emitter
import io.reactivex.Observable
import io.reactivex.schedulers.Schedulers

/**
 * author : Zhangwenchao
 * e-mail : zhangwch@yidianling.com
 * time   : 2018/04/18
 */
object RxPay {

    init {
        EventBus.getDefault().register(this)
    }

    private var emitter: Emitter<PayStatus>? = null

    // 微信支付
yjiucheng committed
35
    fun wxPay(context: Context, option: CommonWXPayBean.WXOption): Observable<PayStatus> {
36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
        return Observable.create<PayStatus> { e ->
            val api = WXAPIFactory.createWXAPI(context, null)
            if (api.wxAppSupportAPI < Build.PAY_SUPPORTED_SDK_INT) {
                e.onError(CustomThrowable("目前您的微信版本过低或未安装微信,需要安装微信才能使用"))
                e.onComplete()
            }
            emitter = e

            api.registerApp(option.appid)
            val request = PayReq()
            request.appId = option.appid
            request.partnerId = option.partnerid
            request.prepayId = option.prepayid
            request.packageValue = "Sign=WXPay"
            request.nonceStr = option.noncestr
            request.timeStamp = option.timestamp
            request.sign = option.sign
            api.sendReq(request)
        }.subscribeOn(Schedulers.io())
    }

    // 支付宝支付
    fun aliPay(activity: Activity, aliSign: String): Observable<PayStatus> {
        return Observable.create<PayStatus> {
            val alipay = PayTask(activity)
            val result = alipay.payV2(aliSign, true)
            val payResult = PayResult(result)
            when {
64 65 66

                "9000" == payResult.resultStatus -> {
                    it.onNext(PayStatus(true))
67
                    AliYunRichLogsHelper.getInstance().sendRichLog(AliYunLogConfig.PAY, "支付宝支付成功")
68 69 70 71

                }
                else -> {
                    it.onError(CustomThrowable(payResult.memo))
72 73
                    AliYunRichLogsHelper.getInstance()
                        .sendRichLog(AliYunLogConfig.PAY, "支付宝支付失败  memo:${payResult.memo}")
74 75

                }
76 77 78 79 80 81 82 83 84 85 86 87 88 89 90
            }
            it.onComplete()
        }

    }

    fun onEvent(event: WXPayEvent) {
        if (event.status.success) {
            emitter?.onNext(event.status)
        } else {
            emitter?.onError(Throwable("支付失败", null))
        }
        emitter?.onComplete()
    }
}