react-native-in-app-utils, 在应用程序支付中,一个用于处理的本机包装器

分享于 

10分钟阅读

GitHub

  繁體 雙語
A react-native wrapper for handling in-app payments
  • 源代码名称:react-native-in-app-utils
  • 源代码网址:http://www.github.com/chirag04/react-native-in-app-utils
  • react-native-in-app-utils源代码文档
  • react-native-in-app-utils源代码下载
  • Git URL:
    git://www.github.com/chirag04/react-native-in-app-utils.git
    Git Clone代码到本地:
    git clone http://www.github.com/chirag04/react-native-in-app-utils
    Subversion代码到本地:
    $ svn co --depth empty http://www.github.com/chirag04/react-native-in-app-utils
    Checked out revision 1.
    $ cd repo
    $ svn up trunk
    
    react-native-in-app-utils

    一种在应用程序购买中处理的本地包装器。

    更改
    • 由于 rn 0.40 +的重大中断,在安装npm时使用这里lib的v5.x。
    注释
    • 你需要一个苹果开发者帐户来在应用程序购买中使用。

    • 你必须首先在 itunes Connect 中设置你的应用程序。 在这个教程中遵循步骤 1 -13的步骤,以获得简单的解释。

    • 你必须在实际设备上测试你的应用程序,在应用程序购买中,在模拟器上总是失败。

    将它添加到你的项目中

    具有本机cli的1.Install react-native install react-native-in-app-utils

    • 现在只要你想在响应代码中使用它,你就必须执行以下操作: var InAppUtils = require('NativeModules').InAppUtils; 或者 ES6:
    
    import { NativeModules } from 'react-native'
    
    
    const { InAppUtils } = NativeModules
    
    
    
    

    API

    装入产品

    你必须首先加载产品,以获得正确的国际化 NAME 和正确的货币价格。

    var products = [
     'com.xyz.abc',
    ];InAppUtils.loadProducts(products, (error, products) => {
     //update store here.});

    响应:的产品对象的array,具有以下字段:

    字段类型说明
    标识符字符串产品标识符
    价格号码作为一个数字的价格
    剩余货币字符串货币符号,换句话说,"$"或者 sek""
    currencyCode字符串货币代码,"sek"的换句话说,"usd""
    priceString字符串本地化的价格字符串,换句话说,"$1,234.00""
    国家国家国家字符串价格,换句话说,"gb"或者"的国家代码"
    可下载布尔型购买是否可以下载
    描述字符串描述字符串
    标题字符串标题字符串

    如果你没有得到产品,那么你可能会发现 itunes Connect 或者Xcode中的某些东西没有正确配置。 看看这个 StackOverflow答案确定什么是 issue(s)。

    检查是否允许付款

    InAppUtils.canMakePayments((canMakePayments) => {
     if(!canMakePayments) {
     Alert.alert('Not Allowed', 'This device is not allowed to make purchases. Please check restrictions on device');
     }
    })

    注意:由于国家限制或者家长控制/限制设置在设备上,canMakePayments可能 return false。

    购买产品

    var productIdentifier ='com.xyz.abc';InAppUtils.purchaseProduct(productIdentifier, (error, response) => {
     // NOTE for v3.0: User can cancel the payment which will be available as error object here.if(response &&response.productIdentifier) {
     Alert.alert('Purchase Successful', 'Your Transaction ID is '+response.transactionIdentifier);
     //unlock store here. }
    });

    注意:在调用 purchaseProduct 之前调用 loadProducts,否则返回 invalid_product。 如果你正在调用它们,你需要在 loadProducts 回调中调用 purchaseProduct,以确保它有机会完成调用。

    注意:在调用 purchaseProduct 之前调用 canMakePurchases 以确保用户能够进行购买。 通常通知用户他们不允许从他们的帐户购买,以及他们可以做什么,而不是一个隐含的错误信息。

    备注:purchaseProductForUser(productIdentifier, username, callback) 也可用 https://stackoverflow.com/questions/29255568/is-there-any-way-to-know-purchase-made-by-which-itunes-account-ios/29280858#29280858

    响应: 一个具有以下字段的事务对象:

    字段类型说明
    originalTransactionDate号码原始事务日期( 从历元开始)
    originalTransactionIdentifier字符串原始事务标识符
    交易日期号码事务处理日期( 从历元开始)
    transactionIdentifier字符串事务标识符
    productIdentifier字符串产品标识符
    transactionReceipt字符串作为base64编码字符串的事务回执

    注意:originalTransactionDateoriginalTransactionIdentifier 仅适用于以前已经取消或者过期的订阅。

    还原付款

    InAppUtils.restorePurchases((error, response) => {
     if(error) {
     Alert.alert('itunes Error', 'Could not connect to itunes store.');
     } else {
     Alert.alert('Restore Successful', 'Successfully restores all your purchases.');
     if (response.length===0) {
     Alert.alert('No Purchases', "We didn't find any purchases to restore.");
     return;
     }
     response.forEach((purchase) => {
     if (purchase.productIdentifier==='com.xyz.abc') {
     // Handle purchased product. }
     });
     }
    });

    备注:restorePurchasesForUser(username, callback) 也可用 https://stackoverflow.com/questions/29255568/is-there-any-way-to-know-purchase-made-by-which-itunes-account-ios/29280858#29280858

    响应:的事务对象的array,具有以下字段:

    字段类型说明
    originalTransactionDate号码原始事务日期( 从历元开始)
    originalTransactionIdentifier字符串原始事务标识符
    交易日期号码事务处理日期( 从历元开始)
    transactionIdentifier字符串事务标识符
    productIdentifier字符串产品标识符
    transactionReceipt字符串作为base64编码字符串的事务回执

    电子邮件收据

    iTunes收据与用户的iTunes帐户相关联,无需任何产品参考即可检索。

    InAppUtils.receiptData((error, receiptData)=> {
     if(error) {
     Alert.alert('itunes Error', 'Receipt not found.');
     } else {
     //send to validation server }
    });

    响应:将收据作为base64编码字符串。

    可以进行付款

    检查是否启用了应用程序购买/禁用。

    InAppUtils.canMakePayments((enabled) => {
     if(enabled) {
     Alert.alert('IAP enabled');
     } else {
     Alert.alert('IAP disabled');
     }
    });

    响应: 启用的布尔标志。

    测试

    在购买应用程序时,你必须在实际的设备上运行应用程序。 如果模拟器无法连接到iTunes存储,则使用iOS模拟器将始终失败。 但是,你可以执行某些任务,比如使用 loadProducts 而不需要在实际的设备上运行。

    在 itunes Connect 中设置一个测试帐户("沙箱测试器")。 见这里的官方文档

    在实际的iOS设备上运行你的应用程序。 为此,首先在本地网络服务器上运行响应本地服务器,而不是本地服务器。 然后通过USB和将你的iDevice连接到你的Mac上,在最上面的栏中从可用设备和模拟器列表中选择它。 ( 在生成和停止按钮旁边)

    打开应用程序,并与你的沙箱测试人员Apple帐户购买一些东西 !

    月订阅

    你可以使用 iap-receipt-validator 软件包检查收据是否仍然有效

    import iapReceiptValidator from'iap-receipt-validator';constpassword ='b212549818ff42ecb65aa45c';// Shared Secret from iTunes connectconstproduction = false;// use sandbox or production url for validationconstvalidateReceipt =iapReceiptValidator(password, production);asyncvalidate(receiptData) { try {
     constvalidationData = awaitvalidateReceipt(receiptData);// check if Auto-Renewable Subscription is still valid// validationData['latest_receipt_info'][0].expires_date> today } catch(err) {
     console.log(err.valid, err.error, err.message)
     }
    }

    这在两个React的本机和后端服务器,你应该设置一个日常运行的检查是否仍有效。

    免费试用期间

    没有与这里库相关的设置。 如果你想为in-app-purchase设置免费试用期,你必须在 itunes Connect/free/你的in-app-purchase> 免费试用期间设置它( 比如,你可以从下拉菜单中找到的)

    我们现在知道的流量似乎是( 自动更新案例):

    • 首先,无论是否设置了免费试用期,用户都必须'购买'。
    • 如果应用程序配置为具有免费试用期,则用户可以在该免费试用期内使用该应用程序,而无需收费。
    • 当免费试用期结束时,苹果系统将开始自动购买用户,因这里用户可以继续使用。

    WRAP  换行  react  NAT  Native  React Native