React Native library that implements PayPal Checkout flow using purely native code.
$ npm install react-native-paypal --save or $ yarn add react-native-paypal
- $ react-native link react-native-paypal. Check the result, if iOS and/or Android project files are unchanged, do the steps described in Manual installation.
- [Android] Add implementation "com.braintreepayments.api:braintree:3.+"andimplementation "com.braintreepayments.api:data-collector:3.+"inandroid/app/build.gradle.
- [iOS] Add pod 'Braintree', '~> 4'andpod 'Braintree/DataCollector'to your Podfile.
- [iOS] Run pod install
- [iOS] Register a URL scheme in Xcode (must always start with your Bundle Identifier and end in .payments- e.g.your.app.id.payments). See details here.
- [iOS] Edit your AppDelegate.mas follows:#import "RNPaypal.h" - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { [[RNPaypal sharedInstance] configure]; } // if you support only iOS 9+, add the following method - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options { return [[RNPaypal sharedInstance] application:application openURL:url options:options]; } // otherwise, if you support iOS 8, add the following method - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation { return [[RNPaypal sharedInstance] application:application openURL:url sourceApplication:sourceApplication annotation:annotation]; } 
At this point you should be able to build both Android and iOS.
If your application ID has underscores in it (e.g. com.example_app), an additional setup step is required. Otherwise, you can skip this section.
Inside ApplicationManifest.xml add a BraintreeBrowserSwitchActivity. Specify the android:scheme to be your application id without underscores and .braintree appended to it:
<activity android:name="com.braintreepayments.api.BraintreeBrowserSwitchActivity"
  android:launchMode="singleTask">
  <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="com.exampleapp.braintree" />
  </intent-filter>
</activity>- In XCode, in the project navigator, right click Libraries➜Add Files to [your project's name]
- Go to node_modules➜react-native-paypaland addRNPaypal.xcodeproj
- In XCode, in the project navigator, select your project. Add libRNPaypal.ato your project'sBuild Phases➜Link Binary With Libraries
- In XCode, in the project navigator, select your project. Add $(SRCROOT)/../node_modules/react-native-paypal/iosto your project'sBuild Settings➜Header Search Paths
- Open up android/app/src/main/java/[...]/MainApplication.java
- Add import com.smarkets.paypal.RNPaypalPackage;to the imports at the top of the file
- Add new RNPaypalPackage()to the list returned by thegetPackages()method
- Append the following lines to android/settings.gradle:include ':react-native-paypal' project(':react-native-paypal').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-paypal/android')
- Insert the following lines inside the dependencies block in android/app/build.gradle:implementation project(':react-native-paypal')
First you need to get a valid token from your server. Refer to this.
Then you can execute the following code, for example reacting to a button press.
import { requestOneTimePayment, requestBillingAgreement } from 'react-native-paypal'; 
// For one time payments
const {
	nonce,
	payerId,
	email,
	firstName,
	lastName,
	phone
} = await requestOneTimePayment(
  token,
  {
    amount: '5', // required
    // any PayPal supported currency (see here: https://developer.paypal.com/docs/integration/direct/rest/currency-codes/#paypal-account-payments)
    currency: 'GBP',
    // any PayPal supported locale (see here: https://braintree.github.io/braintree_ios/Classes/BTPayPalRequest.html#/c:objc(cs)BTPayPalRequest(py)localeCode)
    localeCode: 'en_GB', 
    shippingAddressRequired: false,
    userAction: 'commit', // display 'Pay Now' on the PayPal review page
    // one of 'authorize', 'sale', 'order'. defaults to 'authorize'. see details here: https://developer.paypal.com/docs/api/payments/v1/#payment-create-request-body
    intent: 'authorize', 
  }
);
// For vaulting paypal account see: https://developers.braintreepayments.com/guides/paypal/vault
const {
	nonce,
	payerId,
	email,
	firstName,
	lastName,
	phone
} = await requestBillingAgreement(
  token,
  {
    billingAgreementDescription: 'Your agreement description', // required
    // any PayPal supported currency (see here: https://developer.paypal.com/docs/integration/direct/rest/currency-codes/#paypal-account-payments)
    currency: 'GBP',
    // any PayPal supported locale (see here: https://braintree.github.io/braintree_ios/Classes/BTPayPalRequest.html#/c:objc(cs)BTPayPalRequest(py)localeCode)
    localeCode: 'en_GB',
  }
);
// For device data collection see: https://developers.braintreepayments.com/guides/advanced-fraud-management-tools/device-data-collection/
const { deviceData } = await requestDeviceData(token);Note that the client token should be served via a backend service but can be hardcoded:
- Go to https://www.braintreegateway.com or https://sandbox.braintreegateway.com/ and login or create an account
- Click the gear at the top and select to API
- You can find your token under Tokenization Keys. You will need to create one if none exists
For an overview of the braintree payment flow see https://developers.braintreepayments.com/start/overview
This library covers the client setup here: https://developers.braintreepayments.com/start/hello-client
It does NOT however cover the server portion here: https://developers.braintreepayments.com/start/hello-server
You will need the server portion in order to complete your transactions. See a simple example of this server in /exampleServer. The example app is pointed to this on default
- Check native code logs (in xCode for iOS or adb logcat *:Efor Android). These may give additional information about issues
- Try comparing your app implementation to the example app. It may help you find a step you missed. If you experience any issues with the example app or instructions missing from the Readme, please open an issue (or fix with a PR :))