NestJS npm package In-app purchase subscription Apple and Android
Description
- The library utilizes Apple Store v2 and Google API + Android Publisher v3 for authenticating orders through a NestJS server.
Required
Package dependencies
- googleapis : Because Google has to use a package for authentication, I'm compelled to use Google API's authentication.
- jsonwebtoken : JWT
Apple Config
- BUNDER_ID : string
- DOMANI_APPLESTORE : enum string
- ISSUER_ID : string
- KEY_IDENTIFIER :string
- PATH_PRIVATE_KEY_APPLE : string (*note : path file key example './src/private_key.p8')
Google Config
- PACKAGE_NAME : string
- PATH_PRIVATE_KEY_GOOGLE : string
Installation
- Install package :
npm i @haivinh/in-app
Using
Import module
- Import module :
import { InAppModule } from '@haivinh/in-app';
// .....
imports: [
// ....
InAppModule.CustomerOptionModule({
appleConfig: {
BUNDER_ID: process.env.BUNDER_ID,
DOMANI_APPLESTORE: 'https://api.storekit-sandbox.itunes.apple.com',
ISSUER_ID: process.env.ISSUER_ID,
KEY_IDENTIFIER: process.env.KEY_IDENTIFIER,
PATH_PRIVATE_KEY_APPLE: process.env.PATH_PRIVATE_KEY_APPLE ?? './src/private_key.p8',
},
gooleConfig: {
PACKAGE_NAME: process.env.PACKAGE_NAME,
PATH_PRIVATE_KEY_GOOGLE: process.env.PATH_PRIVATE_KEY_GOOGLE ?? './src/google_services.json',
},
}),
],
- Using services :
import {InAppService} from '@haivinh/in-app'
//.....
constructor(
private inAppService: InAppService,
) {}
....
const verifySubscriptionApple = await this.inAppService.verifyOrderAppleStore(transactionId); // transactionId in order user buy order applestore
const verifySubscriptionGoogle =await this.inAppService.verifyOrderGooglePlay(productId,purchaseToken) // productId,purchaseToken in order user buy order googleplay
Webhook
Apple
Required
- You need to set up an API to receive the results from the webhook and attach it on the Apple Store ( docs : https://developer.apple.com/documentation/appstoreservernotifications )
- Read event into docs : https://developer.apple.com/documentation/appstoreservernotifications/notificationtype
Using
- example
import {InAppService} from '@haivinh/in-app'
//.....
constructor(
private inAppService: InAppService,
) {}
//....
testinfunc(
data: WebHookDataIOS,
dataTransactionInfo: JWSTransactionDecodedPayload,
dataRenewalInfo: JWSRenewalInfo,
) {}
public async webhookApple(payload){
//...
await this.webhookkServerApple(
payload,
{
// event switch
CONSUMPTION_REQUEST: this.testinfunc, //Promise<void> | void || undefined;
DID_CHANGE_RENEWAL_PREF: this.testinfunc, //Promise<void> | void || undefined;
SUBSCRIBED: this.testinfunc,
....
},
'./src/LOG', // optional create folder src/LOG/IN_APP/IOS/
);
}
Required
- You need to set up an API to pub/sub Google
- Read event into docs : https://developer.android.com/google/play/billing/rtdn-reference?hl=vi
Using
- example
import {InAppService} from '@haivinh/in-app'
//.....
constructor(
private inAppService: InAppService,
) {}
//....
testinfunc(
data: WebHookDataGoogle,
dataOrder: SubscriptionAndroid,
) {}
public async webhookGoogle(payload){
//...
await this.webhookkServerGoogle(
payload,
{
// event switch
SUBSCRIPTION_CANCELED: this.testinfunc, //Promise<void> | void || undefined;
SUBSCRIPTION_PURCHASED: this.testinfunc, //Promise<void> | void || undefined;
SUBSCRIPTION_EXPIRED: this.testinfunc,
....
},
'./src/LOG', // optional create folder src/LOG/IN_APP/GOOGLE/
);
}
Change Log
See Changelog for more information.
Author
Hai Vinh haivinhinspirit@gmail.com
License
Licensed under the MIT License - see the LICENSE file for details.