npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

@rnw-community/react-native-payments

v0.67.0

Published

React Native Payments

Downloads

13,274

Readme

ReactNative Payments

npm version npm downloads PRs Welcome

Accept Payments with Apple Pay and Android Pay using the Payment Request API.

Implementation of W3C Payment Request API(version 08 September 2022) for React Native.

Currently not all the features described for the browsers are supported by this lib. Please feel free to open a PR. See TODO

This library represents a significant improvement over the fantastic react-native-payments library, with the following enhancements:

  • Complete Rewrite: The library has undergone a comprehensive refactoring and is now fully written in TypeScript.
  • Native Type Support: We have introduced native types for both IOS and Android, ensuring full typing and detailed documentation.
  • Unified API: With the aim of simplifying usage, the library now offers a unified API for both IOS and Android. You will no longer need code-dependent logic when utilizing the library, thanks to unified interfaces/enums/types.
  • Enhanced Native Code: The IOS and JAVA native code has been thoroughly updated, refactored, and simplified. All deprecated code has been removed, ensuring better performance and stability.
  • Streamlined Gateway Support: While Stripe/Braintree built-in gateway support has been removed, we continue to support custom gateways. The removal of built-in gateway support enables us to focus on providing better integration for custom solutions, especially since Stripe and Braintree already have their dedicated libraries.
  • ReactNative's New Architecture: The library now supports Turbo Modules., ensuring compatibility with ReactNative's latest architecture.

These enhancements ensure that the library is more efficient, maintainable, and future-proof, offering a seamless payment integration experience for your applications.

Features

  • Streamlined. Say goodbye to complicated checkout forms.
  • Efficient. Accelerate checkouts for higher conversion rates.
  • Forward-looking. Utilize a W3C Standards API endorsed by major companies such as Google, Firefox, and more.
  • Versatile. Share payment code seamlessly across iOS, Android, and web applications.

Installation

  1. Install package @rnw-community/react-native-payments using your package manager.

ApplePay setup

#import <RCTAppDelegate.h>
#import <UIKit/UIKit.h>
#import <PassKit/PassKit.h> // Add this import

@interface AppDelegate : RCTAppDelegate

AndroidPay setup

dependencies {
    // The version of react-native is set by the React Native Gradle Plugin
    implementation("com.facebook.react:react-android")

    implementation 'com.google.android.gms:play-services-wallet:19.2.0'

Usage

Detailed guide should be found at:

The PaymentRequest class is designed to facilitate the integration of payment processing into your React Native application. It leverages TypeScript for robust typing and ensures seamless payment experiences across both iOS and Android platforms. Below is a comprehensive guide on how to use the PaymentRequest class effectively:

1. Importing the class

import {PaymentRequest} from '@rnw-community/react-native-payments';

2. Creating an Instance

import { PaymentMethodNameEnum, SupportedNetworkEnum } from "@rnw-community/react-native-payments/src";

const methodData = [
    // ApplePay example
    {
        supportedMethods: PaymentMethodNameEnum.ApplePay,
        data: {
            merchantIdentifier: 'merchant.com.your-app.namespace',
            supportedNetworks: [SupportedNetworkEnum.Visa, SupportedNetworkEnum.MasterCard],
            countryCode: 'US',
            currencyCode: 'USD',
            requestBilling: true,
            requestEmail: true,
            requestShipping: true
        }
    },
    // AndroidPay
    {
        supportedMethods: PaymentMethodNameEnum.AndroidPay,
        data: {
            supportedNetworks: [SupportedNetworkEnum.Visa, SupportedNetworkEnum.MasterCard],
            environment: EnvironmentEnum.Test,
            countryCode: 'DE',
            currencyCode: 'EUR',
            requestBilling: true,
            requestEmail: true,
            requestShipping: true,
            gatewayConfig: {
                gateway: 'example',
                gatewayMerchantId: 'exampleGatewayMerchantId',
            },
        }
    }
];

const paymentDetails = {
    // Provide payment details such as total amount, currency, and other relevant information
};

const paymentRequest = new PaymentRequest(methodData, paymentDetails);

Note: The methodData parameter is an array of PaymentMethodData objects that represent the supported payment methods in your application. Each PaymentMethodData object should have a supportedMethods property specifying the type of payment method (e.g., PaymentMethodNameEnum.AndroidPay or PaymentMethodNameEnum.ApplePay) and a data property containing the corresponding platform-specific data.

2.1 Additional methodData.data options

Depending on the platform and payment method, you can provide additional data to the methodData.data property:

  • environment: This property represents the Android environment for the payment.
  • requestBilling: An optional boolean field that, when present and set to true, indicates that the PaymentResponse will include the billing address of the payer.
  • requestEmail: An optional boolean field that, when present and set to true, indicates that the PaymentResponse will include the email address of the payer.
  • requestShipping: An optional boolean field that, when present and set to true, indicates that the PaymentResponse will include the shipping address of the payer.

3. Checking Payment Capability

Before displaying the payment sheet to the user, you can check if the current device supports the payment methods specified:

const isPaymentPossible = await paymentRequest.canMakePayment();

This method returns a boolean value indicating whether the device supports the specified payment methods.

The PaymentRequest class automatically handles platform-specific payment data based on the provided methodData.

4. Displaying the Payment Sheet

Once you have verified the device's capability, you can proceed to display the payment sheet for the user to complete the transaction:

try {
    const paymentResponse = await paymentRequest.show();
    // Handle the payment response here
} catch (error) {
    // Handle errors or user cancellation
}

// or Promise style
const paymentResponse = paymentRequest.show().then(...).catch(...);

The paymentRequest.show() method returns a promise that resolves with a PaymentResponse object representing the user's payment response.

5. Processing the PaymentResponse

To send all the relevant payment information to the backend (BE) for further processing and validation, you need to extract the required data from the PaymentResponseDetailsInterface object. The PaymentResponseDetailsInterface provides various properties that encompass essential details about the payment, including the payment method used, the payer's information, and transaction-related information.

const paymentResponse = paymentRequest.show().then((paymentResponse) => {
    // This field will have all Android payment token info AndroidPaymentMethodToken
    paymentResponse.androidPayToken;
    // This field will have all IOS payment token info IosPKToken
    paymentResponse.applePayToken;
    // Aditionally if was requested, shipping, billing and payer info would be available
    paymentResponse.billingAddress;
    paymentResponse.payerEmail;
    paymentResponse.payerName;
    paymentResponse.payerPhone;
    paymentResponse.shippingAddress;
    // Send data to your BE
    // Close paymnet sheet
}).catch(...);

The PaymentResponseDetailsInterface includes the following additional properties:

  • billingAddress: This property represents user billing details PaymentResponseAddressInterface and available if was requested in the PaymentRequest.
  • shippingAddress: This property represents user shipping details PaymentResponseAddressInterface and available if was requested in the PaymentRequest.
  • payerEmail: This property represents user email and available if was requested in the PaymentRequest.
  • payerPhone: This property represents user phone and available if was requested in the PaymentRequest.
  • androidPayToken: This property represents PaymentToken information returned by AndroidPay, this should be sent to your payment provider.
  • applePayToken: This property represents PaymentToken information returned by ApplePay, this should be sent to your payment provider.

6. Closing the Payment Sheet

Once the payment process is successfully completed, it's essential to close the payment sheet by calling the PaymentResponse.complete() method. This method takes a parameter from the PaymentComplete enum to indicate the outcome of the payment and hide the payment sheet accordingly.

paymentResponse.complete(PaymentComplete.Success) // OR PaymentComplete.Fail

This will have no affect in the Android platform due to AndroidPay implementation.

7. Aborting the Payment

The PaymentRequset.abort() method in the Payment Request API allows developers to programmatically cancel an ongoing payment request or dismiss the payment sheet when it is in an interactive state. This method is used to handle scenarios where the user decides to cancel the payment process or when specific conditions require the payment request to be aborted.

This will have no affect in the Android platform due to AndroidPay implementation.

Example

You can find working example in the App component of the react-native-payments-example package.

TODO

Docs

  • [ ] Add gifs to the docs showing payment sheets appearing on IOS and Android.
  • [ ] Provide migration guide from react-native-payments.

Native

  • [ ] Investigate and implement shipping options.
  • [ ] Investigate and implement coupons support.
  • [ ] Rewrite IOS to swift?
  • [ ] Rewrite Android to Kotlin?
  • [ ] Can we avoid modifying AppDelegate.h with importing PassKit?

W3C spec:

Other

  • [ ] Add unit tests
  • [ ] Refactor utils
  • [ ] Add web support
  • [ ] Merge react-native-payments-example into this package, and setup it properly
  • [ ] CI/CD:
    • [ ] check/setup pull request
    • [ ] check/setup push to master and release to NPM
    • [ ] add e2e via maestro for IOS
    • [ ] add e2e via maestro for Android

License

This library is licensed under The MIT License.