cafebazaar-purchase-validator
Version:
easily validate purchase in app billing of Cafebazaar API
116 lines (108 loc) • 3.44 kB
text/typescript
import * as appHttp from "../components/app-http";
import { AppResponse, PurchaseResponse } from "../components/app-response";
import * as appStorage from "../components/app-storage";
import { InitialData, PurchaseValue } from "../components/app-types";
import { appLog } from "../utils/utils";
const init = (initialData: InitialData) => {
appStorage.saveInitialData(initialData);
};
const isNotConsumedPurchase = async (
purchase: PurchaseValue
): Promise<boolean> => {
return new Promise(async (resolve, reject) => {
if (!purchase.packageName.trim()) {
return reject("Package name is invalid.");
}
if (!purchase.productId.trim()) {
return reject("Product is not found.");
}
if (!purchase.purchaseToken.trim()) {
return reject("The requested purchase is not found!");
}
try {
const response = await getPurchase(purchase);
resolve(response.consumptionState == 1);
} catch (e) {
reject(e);
}
});
};
const getPurchase = async (
purchase: PurchaseValue
): Promise<PurchaseResponse> => {
return new Promise((resolve, reject) => {
tryToGetPurchase(purchase, {
onSuccess: (response: PurchaseResponse) => {
resolve(response);
},
onUnauthorized: () => {
updateAccessToken()
.then(() => {
tryToGetPurchase(purchase, {
onSuccess: (response: PurchaseResponse) => {
resolve(response);
},
onFailure: (error) => {
reject(error);
},
});
})
.catch((error) => {
reject(error);
});
},
onFailure: (error) => {
reject(error);
},
});
});
};
const tryToGetPurchase = (
purchaseValue: PurchaseValue,
appResponse: AppResponse<any>
): void => {
const url = `https://pardakht.cafebazaar.ir/devapi/v2/api/validate/${
purchaseValue.packageName
}/inapp/${purchaseValue.productId}/purchases/${
purchaseValue.purchaseToken
}?access_token=${appStorage.getAccessToken()}`;
appLog(`Try to validate purchase '${purchaseValue.productId}'...`);
appHttp.post<PurchaseResponse>(
{ url },
{
onSuccess: (response: PurchaseResponse) => {
appResponse.onSuccess(response);
},
onUnauthorized: () => {
appResponse.onUnauthorized?.();
},
onFailure: (error) => {
appResponse.onFailure(error);
},
}
);
};
const updateAccessToken = async (): Promise<void> => {
return new Promise(async (resolve, reject) => {
const initialData = appStorage.getInitialData();
const formData = new URLSearchParams();
formData.append("grant_type", "refresh_token");
formData.append("client_id", initialData.clientId);
formData.append("client_secret", initialData.clientSecret);
formData.append("refresh_token", initialData.refreshToken);
const url = "https://pardakht.cafebazaar.ir/devapi/v2/auth/token/";
appHttp.post<any>(
{ url, data: formData },
{
onSuccess: (response: any) => {
appStorage.updateAccessToken(response.access_token);
resolve();
},
onFailure: (error) => {
reject(error);
},
}
);
});
};
export { init, getPurchase, isNotConsumedPurchase };