如何使用React Native IAP在React Nation中确认应用内订阅



早上好,开发人员,在使用React Native IAP库接受我的应用程序中的订阅后,我一直在尝试为android确认付款,但似乎不起作用。

我在我的应用程序中使用上下文API,下面是我的代码:

import React, { createContext, useState,useEffect, useContext,  } from 'react';
import RNIap, {
InAppPurchase,
PurchaseError,
SubscriptionPurchase,
acknowledgePurchaseAndroid,
consumePurchaseAndroid,
finishTransaction,
finishTransactionIOS,
purchaseErrorListener,
purchaseUpdatedListener,
} from 'react-native-iap';
import { Alert, Platform, } from 'react-native'
import { Container, Header, Content, Toast, Button, Text } from 'native-base';
export const IApContext = createContext();
const itemSkus = Platform.select({
ios: [
'kriss.once.removeads',
'kriss.sub.removeads'
],
android: [
'com.sublegal.submonthly',
]
});
export const IApController = ({ children }) => {
const [products, setProducts] = useState([])
const [showads, setShowads] = useState(true);
const [wascalled, setWascalled] = useState(false);
const initIAp = async () => {
try {
await RNIap.initConnection();

purchaseUpdateSubscription = purchaseUpdatedListener(
async (purchase= SubscriptionPurchase) => {
console.log('purchase', purchase);

const receipt = purchase.transactionReceipt
? purchase.transactionReceipt
: purchase.originalJson;
console.log(receipt)

if (receipt) {
try {
acknowledgePurchaseAndroid(purchase.purchaseToken);
const ackResult =  acknowledgePurchaseAndroid(purchase.purchaseToken);
console.info('ackResult', ackResult);
RNIap.finishTransaction(purchase, true);
} catch (ackErr) {
console.warn('ackErr', ackErr);
}


}
},
);
} catch (err) {
console.warn(err.code, err.message);
}




try {
const products = await RNIap.getProducts(itemSkus);
if (Platform.OS === 'android') {
const subscription = await RNIap.getSubscriptions(itemSkus);
products.push(subscription[0])
}
console.log(products)
setProducts({products});
if (products) {
setWascalled(true)
} else {
setWascalled(false)
}
console.log(wascalled)

} catch (err) {
console.warn(err); // standardized err.code and err.message available
}
}

makeSubscription = async (sku) => {
try {
RNIap.requestSubscription(sku);
toggleAds(false)
purchaseUpdateSubscription = purchaseUpdatedListener(
async (purchase= SubscriptionPurchase) => {
console.log('purchase', purchase);

const receipt = purchase.transactionReceipt
? purchase.transactionReceipt
: purchase.originalJson;
console.log(receipt)

if (receipt) {
try {
acknowledgePurchaseAndroid(purchase.purchaseToken);
const ackResult = acknowledgePurchaseAndroid(purchase.purchaseToken);
console.info('ackResult', ackResult);
RNIap.finishTransaction(purchase, true);
} catch (ackErr) {
console.warn('ackErr', ackErr);
}

}
},
);


} catch (err) {
console.warn(err.code, err.message);
}
}

checkValidPurchase = async () => {
try {
const purchases = await RNIap.getAvailablePurchases();
purchases.forEach(async (purchase) => {
switch (purchase.productId) {
case 'com.sublegal.submonthly':
// await AsyncStorage.setItem('removeadsmonthly', JSON.stringify(res));
toggleAds(false)
console.warn('No 1 purchase is available');
break
//     case 'com.myproduct.blegal':
//   await AsyncStorage.setItem('removeadsmonthly', JSON.stringify(res));
//     toggleAds(false)
//      break
case 'com.kriss.remove_ads_monthly':
// await AsyncStorage.setItem('removeadsmonthly', JSON.stringify(res));
toggleAds(false)
break
case 'com.kriss.remove_ad_forever':
//   await AsyncStorage.setItem('removeadsmonthly', JSON.stringify(res));
toggleAds(false)
break
default: console.warn('you do not have any purchase');
}
})
} catch (err) {
console.warn(err);
}
}


const toggleAds = value => {
if (value === true) {
setShowads(true);
} else {
setShowads(false);
}
};
return (
<IApContext.Provider value={{
initIAp,

wascalled,
showads,
checkValidPurchase,
products,

makeSubscription,
}}>
{children}
</IApContext.Provider>
);
}

有了上面的代码,我可以订阅,但我的用户会在三天内得到退款,因为付款不被确认。关于如何解决这个问题,我真的需要帮助。该应用程序已在谷歌Play商店上架。

您的代码有几处不正确。您当前的代码是为确认耗材购买而设置的,对于订阅,参数略有不同。

  1. acknowledgePurchaseAndroid();需要一个对象而不是字符串。正确的格式是acknowledgePurchaseAndroid({token: purchase.purchaseToken});

  2. RNIap.finishTransaction(purchase, true);第二个值用于IAP是否为消耗品。订阅的正确格式应该是RNIap.finishTransaction(purchase, false);,或者如果你想让代码易于阅读,以便将来参考,如果你计划发送值而不是变量RNIap.finishTransaction({purchase:purchase, isConsumable: false}

最新更新