该仓库包含使用 原子插件 信息模型设计的终端内购买 API。您可以将 IAP 集成到您的应用程序中,并利用提供的所有功能:优雅的 API、本地和服务器端收据验证、安全的消耗品和非消耗品购买跟踪、本地产品缓存等。API 已经在许多语言中可用,并计划在未来添加更多。
目前实现了 3 个内购提供商,但新的可以轻松添加。
您可以通过贡献来帮助创建更多出色的插件。
原子插件提供了一个优雅且极简的 API,并从一开始就考虑了可移植性。通过设计避免了框架依赖,因此插件可以在任何平台上运行,并可以与任何应用程序框架或游戏引擎集成。
见 API 文档
查看 LDInAppService.h
标头文件,以了解类的完整功能。
见 InAppTest
以查看测试 API 提供的所有功能的完整项目。
LDInAppService 类提供了一个易于使用且安全的终端内购买 API。内置了本地和服务器端收据验证、消耗品和非消耗品购买跟踪以及本地产品缓存的支持。完成的购买使用 Apple 的密钥链服务进行保护,即使用户删除了应用程序,仍会记住这些购买。
您可以使用 CocoaPods。
pod 'LDInAppService'
LDInAppService * service = [[LDInAppService alloc] init];
[service addPurchaseObserver: self]; //optional delegate to observe purchases
[service start]; //start processing transactions
[service fetchProducts:@[@"productIds"] completion:^(NSArray *products, NSError *error) {
//fetch products from remote server
}];
service.products; //local cached products
[service purchase:productId quantity:2 completion:^(NSError *error) {
//purchase consumable or non consumable products
}];
[service consume:productId quantity:1]; //consume product
[service isPurchased:productId]; //check if a productId is purchased
[service stockOfProduct:productId]; //check available stock of consumable products
[service restorePurchases:^(NSError *error) {
//restore non-consumable purchases
}];
[service setValidationHandler:^(NSData *validationReceipt, NSString *productId, LDValidationCompletion completion) {
//custom server validation
completion(nil); //Call completion with nil error if validation succeeds
}];
[service setLudeiServerValidationHandler]; //validate using Ludei's Cloud server
查看API 文档
查看InAppTest
获取一个完整的项目(用于测试API提供的所有功能)。为了测试Android In-App,您需要在Android Studio中选择googlePlayRelelease或amazonRelease构建变体。您必须在MainActivity.java
中设置自定义的productId,并在build.gradle
中设置bundleId和versionCode。
您还需配置发布签名配置。将这些属性添加到您的全局gradle.properties文件中
STORE_FILE=/Users/user/.android/company.keystore
STORE_PASSWORD=xxxxx
KEY_ALIAS=xxxxxxx
KEY_PASSWORD=xxxxx
InAppService接口提供了简单易用且安全的在应用购买API。内置本地和服务器端收据验证、可消耗和非可消耗购买跟踪以及本地产品缓存的支持。单一API满足多个IAP提供者。
发行版本部署到Maven Central。您只需要在build.gradle中添加所需的依赖项
dependencies {
compile 'com.ludei.inapps.googleplay:1.0.0' //Google Play IAP Provider
compile 'com.ludei.inapps.amazon:1.0.0' //Amazon AppStore IAP Provider
}
//create the service instance using the desired provider
InAppService service = new GooglePlayInAppService(context);
//service = new AmazonInAppService(context);
service.fetchProducts(productIds, new InAppService.FetchCallback() {
public void onComplete(List<InAppProduct> products, InAppService.Error error) {
//fetch products from store
}
});
service.getProducts(); // Local cached products
service.purchase(productId, new InAppService.PurchaseCallback() {
public void onComplete(InAppPurchase purchase, InAppService.Error error) {
//purchase product
}
});
service.consume(productId, 1, new InAppService.ConsumeCallback() {
public void onComplete(int consumed, InAppService.Error error) {
//consume product
}
});
service.isPurchased(productId); //check if a product is purchased
service.stockOfProduct(productId); //check available stock of consumable products
service.restorePurchases(new InAppService.RestoreCallback() {
public void onComplete(InAppService.Error error) {
//Restore completed purchases
}
});
service.setValidationHandler(new InAppService.ValidationHandler() {
public void onValidate(String receipt, String productId, InAppService.ValidationCompletion completion) {
//custom server validation
}
});
service.setLudeiServerValidationHandler(); //Validate using Ludei's Cloud server
记得通知onActivityResult和onDestroy事件
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data)
{
boolean handled = service.onActivityResult(requestCode, resultCode, data);
if (!handled) {
super.onActivityResult(requestCode, resultCode, data);
}
}
@Override
public void onDestroy()
{
service.onDestroy();
super.onDestroy();
}
查看API 文档
要运行一个完整的项目(用于测试API提供的所有功能),请运行以下命令
gulp create-cordova
在test/cordova/InAppTest中创建了一个cordova项目
Cocoon.InApp类提供了一个跨平台、简单易用且安全的在应用购买API。内置本地和服务器端收据验证、可消耗和非可消耗购买跟踪以及本地产品缓存的支持。单一JavaScript API满足多个IAP提供者。
发行版本部署到Cordova插件注册表。您只需要使用Cordova CLI、CocoonJS CLI或Ludei的Cocoon Cloud Server安装所需的插件。
cordova plugin add com.ludei.inapps.ios.appstore;
cordova plugin add com.ludei.inapps.android.googleplay;
cordova plugin add con.ludei.inapps.android.amazon;
请在您的html项目中包含以下JavaScript文件
// Basic usage, register callbacks first
var service = Cocoon.InApp;
service.on("purchase", {
start: function(productId) {
console.log("purchase started " + productId);
},
error: function(productId, error) {
console.log("purchase failed " + productId + " error: " + JSON.stringify(error));
},
complete: function(purchase) {
console.log("purchase completed " + JSON.stringify(purchase));
}
});
// Service initialization
service.initialize({
autofinish: true
}, function(error){
}
);
service.fetchProducts(productIds, function(products, error){
//Fetch products from the server
});
service.getProducts(); //Local cached products
service.purchase(productId, 1, function(error) { // Optional sugar callback
//purchase product
});
service.consume(productId, 3, function(error) {
//consume product
});
service.isPurchased(productId); //check if a product is purchased
service.stockOfProduct(productId); //check available stock of consumable products
service.setValidationHandler(function(receipt, productId, completion){
... //Custom server validation code
completion(true); //call completion function with true param if validation succeeds
});
service.setLudeiServerValidationHandler(); //validate using Ludei's Cloud server
查看API 文档
查看InAppService.h
头文件获取类的完整功能概述。
查看InAppTest
获取一个完整项目(cocos2dx游戏)整合了C++ IAP API。
InAppService类提供了一个跨平台、简单易用且安全的在应用购买API。内置本地和服务器端收据验证、可消耗和非可消耗购买跟踪以及本地产品缓存的支持。单一C++ API满足多个IAP提供者。
您可以从发布页面下载预先构建的头部文件和静态库。
这些静态库提供了C++和原生平台(iOS、Android、WP等)之间的绑定。您可能需要向您的项目添加一些平台依赖库(例如jar文件或gradle依赖)。查看InAppTest
的示例,其中一个已经设置好的C++多平台项目。
在 Android 上没有一种便携且可靠的方法来获取当前Activity和生命周期事件,我们不希望依赖于特定的游戏引擎实用API。使用SafeJNI实用工具实现了C++和Java的桥接。Atomic Plugins利用这个类,同时将其用作通用Activity和生命周期事件的通知提供者。查看以下代码以设置atomic插件的活动,并通知Android生命周期事件。
@Override
public void onCreate(Bundle savedInstanceState) {
//set the activity for atomic plugins and load safejni.so
SafeJNI.INSTANCE.setActivity(this);
super.onCreate(savedInstanceState);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
//notify onActivityResult to atomic plugins
SafeJNI.INSTANCE.onActivityResult(requestCode, resultCode, data);
}
可选(但推荐)您可以使用setJavaToNativeDispatcher来配置异步回调 should be dispatched 在哪个线程。默认情况下,回调是在UI线程中分发的。例如,以下是Cocos2dx游戏引擎测试项目中的使用示例。
@Override
public Cocos2dxGLSurfaceView onCreateView() {
final Cocos2dxGLSurfaceView surfaceView = super.onCreateView();
SafeJNI.INSTANCE.setJavaToNativeDispatcher(new SafeJNI.JavaToNativeDispatcher() {
@Override
public void dispatch(Runnable runnable) {
surfaceView.queueEvent(runnable);
}
});
return surfaceView;
}
在build.gradle
中设置您的bundleId和versionCode。
您还需配置发布签名配置。将这些属性添加到您的全局gradle.properties文件中
STORE_FILE=/Users/user/.android/company.keystore
STORE_PASSWORD=xxxxx
KEY_ALIAS=xxxxxxx
KEY_PASSWORD=xxxxx
//Easy to use static method to instantiate a new service
//You can pass a specific InAppProvider if you have many providers linked in your app and you want to choose one of them at runtime
InAppService * service = InAppService::create();
service->addPurchaseObserver(observer); //optional purchase observer;
service->start(); //start processing transactions
service->fetchProducts(productIds, [=](const std::vector<InAppProduct> & products, const InAppService::Error & error){
if (error.empty()) {
//show error
return;
}
// fetch products from remote server
});
service->purchase(productId, [=](const InAppPurchase & purchase, const InAppService::Error & error){
//purchase product
});
service->consume(productId, 1, [=](int32_t consumed, const InAppService::Error & error){
//consume product
});
service->isPurchased(productId); //check if a productId is purchased
service->stockOfProduct(productId); //check available stock of consumable products
service->restorePurchases([=](const InAppService::Error & error){
//restore purchases
});
service->setValidationHandler([=](const string & receipt, const string & productId, const ValidationCompletion & completion){
//custom server validation code
completion(InAppService::Error()); //call completion with empty error if validation succeeds
});
service->setLudeiServerValidationHandler(); //validate using Ludei's Cloud server
//delete the service when you are done. You can wrap it into a Smart Pointer if you want.
delete service;
Mozilla公共许可证,版本2.0
版权所有(c)2015 Ludei
请参阅MPL 2.0许可证