Good morning Developers, I have been trying to Acknowledge payments for android after using React Native IAP library to accept subscriptions in my app put it seems not to be working.
I am using context API in my app and below is my code:
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>
);
}
With the above code i can make subscriptions but my users get refunded in three days because payments are not acknowledge. I really need help on how to solve this problem. The app is already up on google playstore.