跳到主要内容

3.0.0

注意

该门户网站正在开发中。文档的完整版本请看这里.

实现示例

为了正确集成支付,建议您参阅示例应用程序:https://gitflic.ru/project/rustore/flutter-rustore-billing

支付条件

为了进行支付,必须遵守所有条件:

  1. 用户的设备上安装了RuStore应用程序。
  2. 用户在RuStore应用程序中已授权。
  3. 用户和应用程序不应在RuStore中被封锁。
  4. RuStore 控制台系统中为应用程序启用了购买功能。

服务在俄罗斯联邦以外有一些运作限制。

在项目中集成

要将支付包连接到项目,您需要执行以下命令:

flutter pub add flutter_rustore_billing

个命令将在 pubspec.yaml 文件中添加一个字符串。

dependencies: flutter_rustore_billing: ^3.0.0

为了通过第三方应用程序(如快速支付系统(SBP)或SberPay)正确进行支付,您需要正确实现 deeplink 的处理。为此,您需要在 AndroidManifest.xml 中指定带有您项目scheme的 intent-filter:

AndroidManifest.xml

<activity
android:name=".sample.MainActivity">
<intent-filter>

<action android:name="android.intent.action.MAIN"/>

<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
<intent-filter>

<action android:name="android.intent.action.VIEW"/>

<category android:name="android.intent.category.DEFAULT"/>

<category android:name="android.intent.category.BROWSABLE"/>

<data android:scheme="yourappscheme"/>
</intent-filter> </activity>

中"yourappscheme" - 您的deeplink方案,可以更改为其他方案。

这个方案应与 initialize() 方法中传递的方案匹配。

初始化

在调用库的方法之前,需要先进行其初始化。为了初始化,请调用 RustoreBillingClient.initialize() 方法:

RustoreBillingClient.initialize(
"123456" ,
"yourappscheme://iamback" ,
).then((value) {
print( "initialize success: $value" );
}, onError: (err) {
print( "initialize err: $err" );});

123456 - 来自RuStore开发者控制台的应用程序代码(例如:https://console.rustore.ru/apps/123456)。

  • yourappscheme://iamback - 用于通过第三方应用程序支付后返回您的应用程序的deeplink方案 (例如通过 SberPay 或快速支付系统(SBP))。SDK 会为这个方案生成它自己的宿主。

要的是,传递给 deeplinkScheme 的 deeplink 方案必须与 AndroidManifest.xml 中"[处理] deeplink"部分指定的方案匹配。

检查支付功能的可用性

为了检查支付的可用性,需要满足以下条件:

  1. 用户的设备上必须安装 RuStore。
  2. RuStore 必须支持支付功能。
  3. 用户必须在 RuStore 中获得授权。
  4. 用户和应用程序不应在RuStore中被封锁。
  5. 应用程序必须在 RuStore 控制台系统中启用购买功能。

果所有条件都满足,RustoreBillingClient.available() 方法将返回 true 值。

RustoreBillingClient.available().then((value) { 
print("available success $value");
}, onError: (err) {
print("available err: $err");
});

获取产品列表

为了获取产品,您需要使用 RustoreBillingClient.products(ids) 方法。

RustoreBillingClient.products(ids).then((response) {
for ( final product in response.products) {
print(product?.productId);
}
}, onError: (err) {
print("products err: $err");
});
  • ids: List\<String?\> - 产品标识符列表。

方法返回ProductsResponse:

class ProductsResponse {
int code;
String? errorMessage;
String? errorDescription;
String? traceId;
List<Product?> products;
List<DigitalShopGeneralError?> errors;
}
  • code - 响应代码;
  • errorMessage - 错误消息;
  • errorDescription - 错误描述;
  • traceId - 错误标识符;
  • errors - 错误列表;
  • products - 产品列表。

igitalShopGeneralError 错误的结构:

class DigitalShopGeneralError {
String? name;
int ? code;
String? description
}
  • name - 错误名称;
  • code - 错误代码;
  • description - 错误描述。

品结构Product:

class Product {
String productId;
String? productType;
String productStatus;
String? priceLabel;
int ? price;
String? currency;
String? language;
String? title;
String? description;
String? imageUrl;
String? promoImageUrl;
Subscription? subscription;
}
  • productId - 产品标识符;
  • productType - 产品类型;
  • productStatus - 产品状态;
  • priceLable - 格式化的产品价格,包括[language]语言的货币符号;
  • price - 以最小单位(戈比)表示的价格;
  • currency - ISO 4217货币代码;
  • language - 使用 BCP 47 编码指定的语言;
  • title - 产品名称,以[language]语言表示;
  • description - 产品描述,以[language]语言表示;
  • imageUrl - 图片链接;
  • promoImageUrl - 促销图片链接;
  • subscription - 订阅描述,仅对于类型为 subscription 的产品返回。

阅结构Subscription:

class Subscription {
SubscriptionPeriod? subscriptionPeriod;
SubscriptionPeriod? freeTrialPeriod;
SubscriptionPeriod? gracePeriod;
String? introductoryPrice;
String? introductoryPriceAmount;
SubscriptionPeriod? introductoryPricePeriod;
}
  • subscriptionPeriod - 订阅周期;
  • freeTrialPeriod - 订阅试用期;
  • gracePeriod - 订阅宽限期;
  • introductoryPrice - 格式化的介绍性订阅价格,包括product:language语言的货币符号;
  • introductoryPriceAmount - 以货币最小单位(戈比)表示的介绍性价格;
  • introductoryPricePeriod - 介绍性价格计算周期。

阅周期结构SubscriptionPeriod:

class SubscriptionPeriod {
int years;
int months;
int days;
}
  • years - 年数;
  • months - 月数;
  • days - 天数。

获取购买列表

要获取购买列表,请使用RustoreBillingClient.purchases()方法:

RustoreBillingClient.purchase(id).then((response) {
print("purchase success: $response");
}, onError: (err) {
print("purchase err: $err");
});

方法返回PurchasesResponse:

class PaymentResult {
SuccessInvoice? successInvoice;
InvalidInvoice? invalidInvoice;
SuccessPurchase? successPurchase;
InvalidPurchase? invalidPurchase;
}
  • code - 响应代码;
  • errorMessage - 错误消息;
  • errorDescription - 错误描述;
  • traceId - 错误标识符;
  • errors - 错误列表;
  • purchases - 购买列表。

DigitalShopGeneralError 错误的结构:

class DigitalShopGeneralError {
String? name;
int ? code;
String? description
}
  • name - 错误名称;
  • code - 错误代码;
  • description - 错误描述。

买结构Purchase:

class Purchase {
String? purchaseId;
String? productId;
String? description;
String? language;
String? purchaseTime;
String? orderId;
String? amountLabel;
int ? amount;
String? currency;
int ? quantity;
String? purchaseState;
String? developerPayload;
}
  • purchaseId - 购买标识符;

  • productId - 产品标识符;

  • description - 购买描述;

  • language - 使用 BCP 47 编码指定的语言;

  • purchaseTime - 购买时间;

  • orderId - 应用程序生成的唯一支付标识符(uuid);

  • amountLable - 格式化的购买价格,包括[language]语言的货币符号;

  • amount - 以货币最小单位(戈比)表示的价格;

  • currency - ISO 4217货币代码;

  • quantity - 产品数量;

  • purchaseState - 购买状态:

    • 购买状态的可能值:

      • CREATED - 已创建;
      • INVOICE_CREATED - 已创建,等待支付;
      • CONFIRMED - 已确认;
      • PAID - 已支付;
      • CANCELLED - 购买已取消;
      • CONSUMED - 已确认购买消耗;
      • CLOSED - 订阅已取消。
  • developerPayload - 开发者指定的字符串,包含关于订单的附加信息;

  • invoiceId - 账单标识符;

  • subscriptionToken - 用于在服务器端验证购买的令牌。

购买产品

要调用购买产品,请使用 RustoreBillingClient.purchase(id) 方法:

RustoreBillingClient.confirm(id).then((response) {
print( "confirm success: $response" );
}, onError: (err) {
print( "confirm err: $err" );
});
  • id - 产品标识符。

买结果的结构PaymentResult:

class PaymentResult {
SuccessInvoice? successInvoice;
InvalidInvoice? invalidInvoice;
SuccessPurchase? successPurchase;
InvalidPurchase? invalidPurchase;
}

SuccessInvoice结构:

class SuccessInvoice {
String invoiceId;
String finishCode;
}

InvalidInvoice 结构:

class InvalidInvoice {
String? invoiceId;
}

SuccessPurchase 结构:

class SuccessPurchase {
String finishCode;
String? orderId;
String purchaseId;
String productId;
}

InvalidPurchase 结构:

class InvalidPurchase {
String? purchaseId;
String? invoiceId;
String? orderId;
int? quantity;
String? productId;
int? errorCode;
}
  • SuccessInvoice - 支付以结果结束;
  • InvalidInvoice - 支付结束时没有指定发票。可能是因为启动了带有错误发票的支付(例如,空字符串);
  • SuccessPurchase - 成功完成数字产品购买的结果;
  • InvalidPurchase - 在支付数字产品时支付结束后出现错误。

能的状态,finishCode可能包括:

  • SUCCESSFUL_PAYMENT - 成功支付;
  • CLOSED_BY_USER - 由用户取消;
  • UNHANDLED_FORM_ERROR - 未知错误;
  • PAYMENT_TIMEOUT - 支付超时错误;
  • DECLINED_BY_SERVER - 由服务器拒绝;
  • RESULT_UNKNOWN - 未知支付状态。

购买消耗(确认)

RuStore 应用程序包含以下类型的产品:

  • CONSUMABLE - 消耗的(可以多次购买,例如应用中的水晶);
  • NON_CONSUMABLE - 非消耗的(只能购买一次,例如禁用应用程序中的广告);
  • SUBSCRIPTION - 订阅(可以购买一段时间,例如流媒体服务的订阅)。

有处于 PurchaseState.PAID 状态的 CONSUMABLE 类型产品需要消耗。

您可以使用 RustoreBillingClient.confirm(id) 方法来消耗购买:

RustoreBillingClient.purchases().then((response) {
for ( final product in response.purchases) {
print(product?.purchaseId);
}
}, onError: (err) {
print( "purchases err: $err" );
});
  • id - 购买标识符。

方法返回ConfirmPurchaseResponse:

class PurchasesResponse {
int code;
String? errorMessage;
String? errorDescription;
String? traceId;
List<Purchase?> purchases;
List<DigitalShopGeneralError?> errors;
}
  • code - 响应代码;
  • errorMessage - 用户的错误消息;
  • errorDescription - 错误消息的详细解释;
  • traceId - 错误消息标识符;
  • errors - 错误列表。

DigitalShopGeneralError 错误的结构:

class DigitalShopGeneralError {
String? name;
int ? code;
String? description;
}
  • name - 错误属性名称;
  • code - 错误代码;
  • description - 错误描述。