UNPKG

cafebazaar-purchase-validator

Version:

easily validate purchase in app billing of Cafebazaar API

116 lines (108 loc) 3.44 kB
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 };