Почему заказ со статусом Refunded отображается как PURCHASED в системе платежей Google в приложении? - PullRequest
4 голосов
/ 05 августа 2020

Я использую Google In-app Billing Version 3 в своем Android приложении, я тестирую модуль заказа приложения на основе следующего кода.

В случае, если заказ пользователя был возвращен через Google Play, но когда я запускаю mBilling.initBillingClient(), я обнаруживаю, что purchase.purchaseState == Purchase.PurchaseState.PURCHASED в private fun processPurchases запущен.

Кажется, что заказ со статусом Refunded как PURCHASED успешно, как я могу это исправить?

FragmentBuy.kt

class FragmentBuy : Fragment() {
     ...
     override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        binding = DataBindingUtil.inflate(
            inflater, R.layout.layout_buy, container, false
        )
   
        val mBilling=Billing.getInstance(requireActivity(), getString(R.string.skuRegisterApp)) 
        mBilling.initBillingClient()
        ...       
    }

}

Billing.kt

class Billing private constructor (private val mContext: Context, private val purchaseItem :String)
    :PurchasesUpdatedListener, BillingClientStateListener   {

    private lateinit var playStoreBillingClient: BillingClient
    private val mapSkuDetails = mutableMapOf<String,SkuDetails>()

    fun initBillingClient() {
        playStoreBillingClient = BillingClient
            .newBuilder(mContext)
            .enablePendingPurchases() 
            .setListener(this)
            .build()

        if (!playStoreBillingClient.isReady) {
            playStoreBillingClient.startConnection(this)  //It will launach override fun onBillingSetupFinished()
        }
    }

    override fun onBillingSetupFinished(billingResult: BillingResult) {
        when (billingResult.responseCode) {
            BillingClient.BillingResponseCode.OK -> {                   
                queryAndProcessPurchasesAsync()
            }
                ...
        }
    }

    private fun queryAndProcessPurchasesAsync() {
        val purchasesResult = HashSet<Purchase>()
        var result = playStoreBillingClient.queryPurchases(BillingClient.SkuType.INAPP)
        result?.purchasesList?.apply { purchasesResult.addAll(this) }

        processPurchases(purchasesResult)
    }


    private fun processPurchases(purchasesResult: Set<Purchase>): Job {
        val validPurchases = HashSet<Purchase>(purchasesResult.size)
        purchasesResult.forEach { purchase ->
            if (purchase.purchaseState == Purchase.PurchaseState.PURCHASED) {
                if (purchase.sku.equals(purchaseItem)) {
                    if (isSignatureValid(purchase)) {
                        validPurchases.add(purchase)
                        setIsRegisteredAppAsTrue(mContext)  //It will be launched even if the status of the order is refunded.                           
                    }
                }
            }
            ...

        }
        acknowledgeNonConsumablePurchasesAsync(validPurchases.toList())

    }


    private fun acknowledgeNonConsumablePurchasesAsync(nonConsumables: List<Purchase>) {
        ...
    }


    override fun onPurchasesUpdated(billingResult: BillingResult, purchases: MutableList<Purchase>?) {
        when (billingResult.responseCode) {
            BillingClient.BillingResponseCode.OK -> {
                purchases?.apply { processPurchases(this.toSet()) }
            }
                ...
        }
    }

    fun purchaseProduct(activity: Activity) {
        val skuDetails = mapSkuDetails[purchaseItem]
        skuDetails?.let{
            val purchaseParams = BillingFlowParams.newBuilder().setSkuDetails(skuDetails).build()
            playStoreBillingClient.launchBillingFlow(activity, purchaseParams)
        }
    }

    companion object {
        private const val LOG_TAG = "BillingRepository"

        private var INSTANCE: Billing? = null
        fun getInstance(mContext: Context, purchaseItem: String): Billing =
            INSTANCE ?: synchronized(this) {
                INSTANCE ?: Billing(mContext, purchaseItem).also { INSTANCE = it }
            }
    }


}

1 Ответ

1 голос
/ 11 августа 2020

Вы также можете проверить Purchase.isAcknowledged () при покупке, чтобы вы все равно не добавляли его в validPurchases, если это проблема кеширования.

...