跳到主要内容

3.1.0

注意

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

实现示例

为了正确集成支付,建议您参阅位于 example 文件夹中的示例应用程序:

https://gitflic.ru/project/rustore/react-native-rustore-billing-sdk/file?file=example

支付条件

为了进行支付,必须遵守以下条件:

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

在项目中集成

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

// HTTPSnpm  install git+https: //git \@gitflic.ru:rustore /react-native-rustore-billing-sdk .git// SSHnpm  install git+ ssh : //git \@gitflic.ru:rustore /react-native-rustore-billing-sdk .git

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

\< 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 方案,可以更改为其他方案。

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

初始化

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

try {  \`\`RustoreBillingClient.initialize({    \`\`consoleApplicationId:  \'appId\' ,    \`\`deeplinkScheme:  \'scheme\' ,  \`\`});  \`\`\`console.log(initialize success: \${result});\`\`\<br\>} catch(err) {\<br\>  \`console.log(\`initialize err: \${err}\`);}
  • consoleApplicationId - 来自RuStore开发者控制台的应用程序代码(例如:https://console.rustore.ru/apps/123456)。
  • deeplinkScheme - 用于通过第三方应用程序支付后返回您的应用程序的deeplink方案 (例如通过 SberPay 或快速支付系统(SBP))。SDK 会为这个方案生成它自己的宿主。

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

检查支付功能的可用性

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

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

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

try {  \`\`const isAvailable = await RustoreBillingClient.checkPurchasesAvailability();  \`\`\`console.log(available success \${isAvailable});\`\`\<br\>} catch(err) {\<br\>  \`console.log(\`available error \${err}\`);} 

获取产品列表

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

try {  \`\`const products = await RustoreBillingClient.getProducts(productIds);  \`\`for (const product of products) {    \`\`console.log(product?.productId);  \`\`}}  catch (err) {  \`\`\`console.log(products err: \${err});\`\`\<br\>}\`
  • productIds - 产品标识符列表。

方法返回一个产品列表 Product[]。以下是产品模型的描述:

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

阅结构Subscription:

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

阅周期结构SubscriptionPeriod:

interface SubscriptionPeriod {    \`\`years: number;    \`\`months: number;    \`\`days: number;}
  • years - 年数。
  • months - 月数。
  • days - 天数。

获取购买列表

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

try {  \`\`const purchases = await RustoreBillingClient.getPurchases();  \`\`for (const purchase of purchases) {    \`\`console.log(purchase?.purchaseId);  \`\`}}  catch (err) {  \`\`\`console.log(purchase err: \${err});\`\`\<br\>}\`

方法返回一个购买列表 `Purchase[]`。以下是购买模型的描述:

interface Purchase {    \`\`purchaseId?: string;  \`\`productId: string;  \`\`productType?: ProductType;  \`\`invoiceId?: string;  \`\`description?: string;  \`\`language?: string;  \`\`purchaseTime?: string;  \`\`orderId?: string;  \`\`amountLabel?: string;  \`\`amount?: number;  \`\`currency?: string;  \`\`quantity?: number;  \`\`purchaseState?: PurchaseState;  \`\`developerPayload?: string;  \`\`subscriptionToken?: string;}
  • purchaseId - 购买标识符。

  • productId - 产品标识符。

  • productType - 产品类型。

  • invoiceId - 账单标识符。

  • description - 购买描述。

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

  • purchaseTime - 购买时间(RFC 3339 格式)。

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

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

  • amount - 以最小货币单位表示的价格。

  • currency - ISO 4217 货币代码。

  • quantity - 产品数量。

  • purchaseState购买状态。

    • 购买状态的可能值:

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

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

获取特定购买

要获取特定购买,需使用 RustoreBillingClient.getPurchaseInfo(purchaseId) 方法:

try {  \`\`const purchase = await RustoreBillingClient.getPurchaseInfo( \'purchaseId\' );  \`\`console.log(purchase?.purchaseId);}  catch (err) {  \`\`\`console.log(purchase err: \${err});\`\`\<br\>}\`
  • purchaseId - 购买标识符。

方法返回 Purchase,如上所描述。

购买产品

要调用购买产品,请使用 RustoreBillingClient.purchaseProduct({...}) 方法:

try {  \`\`const response = await RustoreBillingClient.purchaseProduct({    \`\`productId:  \'productId\' ,    \`\`orderId:  \'orderId\' ,    \`\`quantity: 0,    \`\`developerPayload:  \'developerPayload\'  \`\`});  \`\`\`console.log(purchase success: \${response});\`\`\<br\>} catch(err) {\<br\>  \`console.log(\`purchase err: \${err}\`);}
  • productId - 产品标识符。
  • orderId - 订单标识符,在AnyApp端创建(可选。如果未指定,则会自动生成)。
  • quantity - 产品数量(可选)。
  • developerPayload - AnyApp 开发者的附加信息(可选)。

买的结果可能是以下几种接口之一:SuccessPayment、CancelledPayment 或 FailurePayment:

enum PaymentResult {  \`\`SUCCESS =  \'SUCCESS\' ,  \`\`CANCELLED =  \'CANCELLED\' ,  \`\`FAILURE =  \'FAILURE\' ,}interface SuccessPaymentResult {  \`\`orderId?: string;  \`\`purchaseId: string;  \`\`productId: string;  \`\`invoiceId: string;  \`\`subscriptionToken?: string;}interface SuccessPayment {  \`\`type: PaymentResult.SUCCESS;  \`\`result: SuccessPaymentResult;}interface CancelledPaymentResult {  \`\`purchaseId: string;}interface CancelledPayment {  \`\`type: PaymentResult.CANCELLED;  \`\`result: CancelledPaymentResult;}interface FailurePaymentResult {  \`\`purchaseId?: string;  \`\`invoiceId?: string;  \`\`orderId?: string;  \`\`quantity?: number;  \`\`productId?: string;  \`\`errorCode?: number;}interface FailurePayment {  \`\`type: PaymentResult.FAILURE;  \`\`result: FailurePaymentResult;}
  • SuccessPayment - 成功完成数字产品购买的结果。
  • FailurePayment - 购买数字产品时错误的结果。
  • CancelledPayment - 数字产品购买被取消的结果。

购买确认

RuStore 包含以下类型的产品:

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

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

您可以使用 RustoreBillingClient.confirmPurchase({...}) 方法来消耗购买:

try {  \`\`const isConfirmed = await RustoreBillingClient.confirmPurchase({    \`\`purchaseId:  \'purchaseId\' ,    \`\`developerPayload:  \'developerPayload\'  \`\`})  \`\`\`console.log(confirm success: \${isConfirmed});\`\`\<br\>} catch(err) {\<br\>  \`console.log(\`confirm err: \${err}\`);}
  • purchaseId - 购买标识符。
  • developerPayload - 开发者指定的字符串,包含附加信息。

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

取消购买

要取消购买,您可以使用 RustoreBillingClient.deletePurchase(purchaseId) 方法:

try {  \`\`const isDeleted = await RustoreBillingClient.deletePurchase(purchaseId)  \`\`\`console.log( \`delete\`success: \${isDeleted});\`\`\<br\>} catch(err) {\<br\>  \`console.log(\` delete err: \${err}\`);}
  • purchaseId - 购买标识符。

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

如果您有与删除购买相关的逻辑,请使用此方法。购买将在20分钟后自动取消,或者在同一客户端进行重复购买时取消。

购买消耗和取消的流程

未完成的支付处理应由 AnyApp 的开发者执行。

如果出现以下情况,应使用取消购买方法(deletePurchase):

  1. 获取购买列表方法(getPurchases)返回了具有以下状态的购买:

    1. PurchaseState.CREATED.

| 2. PurchaseState.INVOICE_CREATED.

. 购买方法 (purchaseProduct) 返回 PaymentResult.Cancelled。 3. 购买方法 (purchaseProduct) 返回 PaymentResult.Failure。

果获取购买列表的方法 (getPurchases) 返回了类型为 CONSUMABLE 且状态为 PurchaseState.PAID 的购买,则需要使用产品消耗方法 (confirmPurchase)。