LDInAppService 1.0.3

LDInAppService 1.0.3

测试测试
语言语言 Obj-CObjective C
许可 自定义
发布最新发布2015年3月

Imanol Fernandez 维护。



  • Imanol Fernandez

内购原子插件

该仓库包含使用 原子插件 信息模型设计的终端内购买 API。您可以将 IAP 集成到您的应用程序中,并利用提供的所有功能:优雅的 API、本地和服务器端收据验证、安全的消耗品和非消耗品购买跟踪、本地产品缓存等。API 已经在许多语言中可用,并计划在未来添加更多。

目前实现了 3 个内购提供商,但新的可以轻松添加。

  • Apple AppStore (iOS/Mac)
  • GooglePlay
  • Amazon AppStore。

您可以通过贡献来帮助创建更多出色的插件。

关于原子插件

原子插件提供了一个优雅且极简的 API,并从一开始就考虑了可移植性。通过设计避免了框架依赖,因此插件可以在任何平台上运行,并可以与任何应用程序框架或游戏引擎集成。

提供的 API

iOS API

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

Android API

API 引用

查看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();
}

JavaScript API

API 引用

查看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文件

cocoon.js cocoon_inapps.js

示例

// 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

C++ API

API 引用

查看API 文档

查看InAppService.h头文件获取类的完整功能概述。

查看InAppTest获取一个完整项目(cocos2dx游戏)整合了C++ IAP API。

介绍

InAppService类提供了一个跨平台、简单易用且安全的在应用购买API。内置本地和服务器端收据验证、可消耗和非可消耗购买跟踪以及本地产品缓存的支持。单一C++ API满足多个IAP提供者。

设置您的项目

您可以从发布页面下载预先构建的头部文件和静态库。

这些静态库提供了C++和原生平台(iOS、Android、WP等)之间的绑定。您可能需要向您的项目添加一些平台依赖库(例如jar文件或gradle依赖)。查看InAppTest 的示例,其中一个已经设置好的C++多平台项目。

Android 需要特殊配置

在 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许可证