React Native Stripe binding for iOS/Andriod platforms
- Xcode 8+
- iOS 10+
- CocoaPods 1.1.1+
- SDK 17+
This package is now built for React Native 0.40 or greater! If you need to support React Native < 0.40, you should install this package @1.4.0.
Run npm install --save tipsi-stripe to add the package to your app's dependencies.
Run react-native link tipsi-stripe so your project is linked against your Xcode project and all CocoaPods dependencies are installed.
- Setup your
Podfilelike the included example/ios/Podfile then runpod install. - Open your project in Xcode workspace.
- Drag the following folder into your project:
node_modules/tipsi-stripe/ios/TPSStripe/
- Open your project in Xcode, right click on Libraries and click
Add Files to "Your Project Name". - Look under
node_modules/tipsi-stripe/iosand addTPSStripe.xcodeproj. - Add
libTPSStripe.atoBuild Phases->Link Binary With Libraries. - Click on
TPSStripe.xcodeprojin Libraries and go the Build Settings tab. Double click the text to the right ofHeader Search Pathsand verify that it has$(SRCROOT)/../../react-native/Reactas well as${SRCROOT}/../../../ios/Pods/Headers/Public- if they aren't, then add them. This is so Xcode is able to find the headers that theTPSStripesource files are referring to by pointing to the header files installed within thereact-nativenode_modulesdirectory. - Whenever you want to use it within React code now you can:
import stripe from 'tipsi-stripe'
Run react-native link tipsi-stripe so your project is linked against your Android project
In your android/app/build.gradle add:
...
dependencies {
...
compile project(':tipsi-stripe')
}In your android/settings.gradle add:
...
include ':tipsi-stripe'
project(':tipsi-stripe').projectDir = new File(rootProject.projectDir, '../node_modules/tipsi-stripe/android')In your android/build.gradle add:
...
allprojects {
repositories {
...
maven { url "https://jitpack.io" }
}
}Ensure that you have Google Play Services installed:
For Genymotion you can follow these instructions.
For a physical device you need to search on Google for 'Google Play Services'. There will be a link that takes you to the Play Store and from there you will see a button to update it (do not search within the Play Store).
Let's require tipsi-stripe module:
import stripe from 'tipsi-stripe'And initialize it with your Stripe credentials that you can get from dashboard. If you want to use Apple Pay you must provide your Merchant ID.
stripe.init({
publishableKey: 'PUBLISHABLE_KEY',
merchantId: 'MERCHANT_ID', // Optional
})A token object returned from submitting payment details (via paymentRequestWithApplePay, paymentRequestWithCardForm and createTokenWithCard) to the Stripe API.
An object with the following keys:
tokenIdString - The value of the token. You can store this value on your server and use it to make charges and customers.createdNumber - When the token was created.livemodeNumber - Whether or not this token was created in livemode. Will be1if you used yourLive Publishable Key, and0if you used yourTest Publishable Key.cardObject - The credit card details object that were used to create the token.extraObject (iOS only)- An additional information that method can provide.
An object with the following keys:
cardIdString - The Stripe ID for the card.brandString - The card’s brand. Can be one of:JCB|American Express|Visa|Discover|Diners Club|MasterCard|Unknown.fundingString (iOS only) - The card’s funding. Can be one of:debit|credit|prepaid|unknown.last4String - The last 4 digits of the card.dynamicLast4String (iOS only) - For cards made withApple Pay, this refers to the last 4 digits of theDevice Account Numberfor the tokenized card.expMonthNumber - The card’s expiration month. 1-indexed (i.e. 1 == January)expYearNumber - The card’s expiration year.countryString - Two-letter ISO code representing the issuing country of the card.currencyString - This is only applicable when tokenizing debit cards to issue payouts to managed accounts. The card can then be used as a transfer destination for funds in this currency.nameString - The cardholder’s name.addressLine1String - The cardholder’s first address line.addressLine2String - The cardholder’s second address line.addressCityString - The cardholder’s city.addressStateString - The cardholder’s state.addressCountryString - The cardholder’s country.addressZipString - The cardholder’s zip code.
{
tokenId: 'tok_19GCAQI5NuVQgnjeKNE32K0p',
created: 1479236426,
livemode: 0,
card: {
cardId: 'card_19GCAQI5NuVQgnjeRZizG4U3',
brand: 'Visa',
funding: 'credit',
last4: '4242',
expMonth: 4,
expYear: 2024,
country: 'US',
name: 'Eugene Grissom',
addressLine1: 'Green Street',
addressLine2: '3380',
addressCity: 'Nashville',
addressState: 'Tennessee',
addressCountry: 'US',
addressZip: '37211'
}
}Indicates whether or not the device supports Apple Pay. Returns a Boolean value.
Launch the Apple Pay view to to accept payment.
An array of object with the following keys:
labelString - A short, localized description of the item.amountString - The summary item’s amount.
NOTE: The final item should represent your company; it'll be prepended with the word "Pay" (i.e. "Pay Tipsi, Inc $50")
An object with the following keys:
requiredBillingAddressFieldsString - A bit field of billing address fields that you need in order to process the transaction. Can be one of:all|name|email|phone|postal_addressor not specify to disable.requiredShippingAddressFieldsString - A bit field of shipping address fields that you need in order to process the transaction. Can be one of:all|name|email|phone|postal_addressor not specify to disable.shippingMethodsArray - An array ofshippingMethodobjects that describe the supported shipping methods.
An object with the following keys:
idString - A unique identifier for the shipping method, used by the app.labelString - A short, localized description of the shipping method.detailString - A user-readable description of the shipping method.amountString - The shipping method’s amount.
After requiredBillingAddressFields you should complete the operation by calling completeApplePayRequest or cancel if an error occurred.
Token's extra field
An object with the following keys:
shippingMethodObject - SelectedshippingMethodobject.billingContactObject - The user's billingcontactobject.shippingContactObject - The user's shippingcontactobject.
An object with the following keys:
nameString - The contact’s name.phoneNumberString - The contact’s phone number.emailAddressString - The contact’s email address.streetString - The street name in a postal address.cityString - The city name in a postal address.stateString - The state name in a postal address.countryString - The country name in a postal address.ISOCountryCodeString - The ISO country code for the country in a postal address.postalCodeString - The postal code in a postal address.supplementarySubLocalityString - The contact’s sublocality.
const items = [{
label: 'Whisky',
amount: '50.00',
}, {
label: 'Tipsi, Inc'
amount: '50.00',
}]
const shippingMethods = [{
id: 'fedex',
label: 'FedEX',
detail: 'Test @ 10',
amount: '10.00',
}]
const options = {
requiredBillingAddressFields: 'all',
requiredShippingAddressFields: 'all',
shippingMethods,
}
const token = await stripe.paymentRequestWithApplePay(items, options)
// Client specific code
// api.sendTokenToBackend(token)
// You should complete the operation by calling
stripe.completeApplePayRequest()
// Or cancel if an error occurred
// stripe.cancelApplePayRequest()(Under active development)
Indicates whether or not the device supports Android Pay. Returns a Boolean value.
Launch the Android Pay view to to accept payment.
An object with the following keys:
priceString - Price of the item.currencyString - Three-letter ISO currency code representing the currency paid out to the bank account.
const options = {
price: '80.00',
currency: 'USD',
line_items: [{
currency_code: 'USD',
description: 'Whisky',
total_price: '50.00',
unit_price: '50.00',
quantity: '1',
}, {
currency_code: 'USD',
description: 'Vine',
total_price: '30.00',
unit_price: '30.00',
quantity: '1',
}],
}
const token = await stripe.paymentRequestWithAndroidPay(options)
// Client specific code
// api.sendTokenToBackend(token)Launch Add Card view to to accept payment.
An object with the following keys:
requiredBillingAddressFieldsString - The billing address fields the user must fill out when prompted for their payment details. Can be one of:full|zipor not specify to disable.smsAutofillDisabledBool - When entering their payment information, users who have a saved card with Stripe will be prompted to autofill it by entering an SMS code. Set this property totrueto disable this feature.themeObject - Can be used to visually style Stripe-provided UI.
An object with the following keys:
primaryBackgroundColorString - The primary background color of the theme.secondaryBackgroundColorString - The secondary background color of this theme.primaryForegroundColorString - The primary foreground color of this theme. This will be used as the text color for any important labels in a view with this theme (such as the text color for a text field that the user needs to fill out).secondaryForegroundColorString - The secondary foreground color of this theme. This will be used as the text color for any supplementary labels in a view with this theme (such as the placeholder color for a text field that the user needs to fill out).accentColorString - The accent color of this theme - it will be used for any buttons and other elements on a view that are important to highlight.errorColorString - The error color of this theme - it will be used for rendering any error messages or view.
const options = {
smsAutofillDisabled: true,
requiredBillingAddressFields: 'full',
}
const token = await stripe.paymentRequestWithCardForm(options)
// Client specific code
// api.sendTokenToBackend(token)Creates token based on passed card params.
An object with the following keys:
numberString (Required) - The card’s number.expMonthNumber (Required) - The card’s expiration month.expYearNumber (Required) - The card’s expiration year.cvcString (Required) - The card’s security code, found on the back.nameString - The cardholder’s name.addressLine1String - The first line of the billing address.addressLine2String - The second line of the billing address.addressCityString - City of the billing address.addressStateString - State of the billing address.addressZipString - Zip code of the billing address.addressCountryString - Country for the billing address.brandString (Android only) - Brand of this card. Can be one of:JCB|American Express|Visa|Discover|Diners Club|MasterCard|Unknown.last4String (Android only) - last 4 digits of the card.fingerprintString (Android only) - The card fingerprint.fundingString (Android only) - The funding type of the card. Can be one of:debit|credit|prepaid|unknown.countryString (Android only) - ISO country code of the card itself.currencyString - Three-letter ISO currency code representing the currency paid out to the bank account. This is only applicable when tokenizing debit cards to issue payouts to managed accounts. You should not set it otherwise. The card can then be used as a transfer destination for funds in this currency.
const params = {
//mandatory
number: '4242424242424242',
expMonth: 11,
expYear: 17,
cvc: '223',
//optional
name: 'Test User',
currency: 'usd',
addressLine1: '123 Test Street',
addressLine2: 'Apt. 5',
addressCity: 'Test City',
addressState: 'Test State',
addressCountry: 'Test Country',
addressZip: '55555',
}
const token = await stripe.createTokenWithCard(params)
// Client specific code
// api.sendTokenToBackend(token)A text field component specialized for collecting credit/debit card information. It manages multiple text fields under the hood to collect this information. It’s designed to fit on a single line.
stylesObject - Accepts allViewstyles, also supportcolorparam.cursorColorString (IOS only) - The cursor color for the field.textErrorColorString (IOS only) - The text color to be used when the user has entered invalid information, such as an invalid card number.placeholderColorString (IOS only)- The text placeholder color used in each child field.numberPlaceholderString - The placeholder for the card number field.expirationPlaceholderString - The placeholder for the expiration field.cvcPlaceholderString - The placeholder for the cvc field.disabledBool(IOS only) - Enable/disable selecting or editing the field. Useful when submitting card details to Stripe.enabledBool (Android only) - Enable/disable selecting or editing the field. Useful when submitting card details to Stripe.onChangeFunc - This function will be called each input change.onValueChangeFunc - This function will be called each input change, it takes two argumants:validBool - Whether or not the form currently contains a valid card number, expiration date, and CVC.paramsObject - Contains entered card params:number,expMonth,expYearandcvc.
To set inital params you can use <instance>.setParams(params) method which is available via ref.
For example, if you’re using another library to scan your user’s credit card with a camera, you can assemble that data into an object and set this property to that object to prefill the fields you’ve collected.
You can also access to valid and params info via <instance>.valid and <instance>.params respectively.
import React, { Component } from 'react'
import { StyleSheet } from 'react-native'
import { PaymentCardTextField } from 'tipsi-stripe'
const styles = StyleSheet.create({
field: {
width: 300,
color: '#449aeb',
borderColor: '#000',
borderWidth: 1,
borderRadius: 5,
}
})
class FieldExample extends Component {
handleFieldParamsChange = (valid, params) => {
console.log(`
Valid: ${valid}
Number: ${params.number || '-'}
Month: ${params.expMonth || '-'}
Year: ${params.expYear || '-'}
CVC: ${params.cvc || '-'}
`)
}
render() {
return (
<PaymentCardTextField
style={styles.field}
cursorColor={...}
textErrorColor={...}
placeholderColor={...}
numberPlaceholder={...}
expirationPlaceholder={...}
cvcPlaceholder={...},
disabled={false},
onParamsChange={this.handleFieldParamsChange}
/>
)
}
}To run example app e2e tests for all platforms you can use npm run ci command. Before run this command you need to specify PUBLISHABLE_KEY and MERCHANT_ID environment variables:
PUBLISHABLE_KEY=<...> MERCHANT_ID=<...> npm run ci- Go to example folder
cd example - Install CocoaPods dependencies (iOS only)
pod install --project-directory=ios - Install npm dependencies
npm install - Configure project before build
PUBLISHABLE_KEY=<...> MERCHANT_ID=<...> npm run configure - Build project:
npm run build:ios- for iOSnpm run build:android- for Androidnpm run build- for both iOS and Android
- Open Appium in other tab
npm run appium - Run tests:
npm run test:ios- for iOSnpm run test:android- for Androidnpm run test- for both iOS and Android
You might encounter the following error while trying to run tests:
An unknown server-side error occurred while processing the command. Original error: Command \'/bin/bash Scripts/bootstrap.sh -d\' exited with code 1
You can fix it by installing Carthage:
brew install carthage- Using higher than ours version of Google Play Services in your project might encourage an error:
NoClassDefFoundError: com.google.android.gms.wallet.MaskedWalletRequest
We have fixed this issue, but if you somehow facing this bug again - please, create an issue or a pull request and we will take another look.
To see more of the tipsi-stripe in action, you can check out the source in example folder.
tipsi-stripe is available under the MIT license. See the LICENSE file for more info.