React components for FramePay.js
Supported: React 14 to 19.
This package is a wrapper for FramePay offering out-of-the-box support for Redux and other common React features.
-
framepay-react
-
Table of Contents
- FramePay documentation
- Demos
- Installation
-
Getting started
- The FramePay context (
FramePayProvider
) -
Setting up your payment form
- WARNING
- withFramePay (All props)
- withFramePayCardComponent (Card props)
- withFramePayBankComponent (Bank props)
- withFramePayApplePayComponent (Apple Pay props)
- withFramePaySamsungPayComponent (Samsung Pay props)
- withFramePayGooglePayComponent (Google Pay props)
- withFramePayPaypalComponent (Paypal props)
- With FramePay (
withFramePay
) HOC - Card elements (
withFramePayCardComponent
) HOC - Bank elements (
withFramePayBankComponent
) HOC
- The FramePay context (
- Advanced options
- Troubleshooting
- Developer instructions
-
Table of Contents
For more information on FramePay see its official documentation.
- Use with react-redux (CodeSandbox)
- Use with react-router (CodeSandbox)
- Examples from README file (CodeSandbox, React 14/15)
- Multiple Payment Methods (CodeSandbox)
- Multiple Payment Methods Short version (CodeSandbox)
- Separated fields for the payment card method (CodeSandbox)
- Other Payment Methods (CodeSandbox)
- TypeScript (CodeSandbox)
- More examples from the E2E tests
Install using Yarn:
yarn add @rebilly/framepay-react
Or using NPM:
npm install @rebilly/framepay-react --save
The example described in this readme can be found here (CodeSandbox)
FramePayProvider provides settings to the FramePay API. See Framepay.initialize for a list of all configuration options.
// index.js
import React from 'react';
import { render } from 'react-dom';
import { FramePayProvider } from '@rebilly/framepay-react';
import MyCardPageComponent from './MyCardPageComponent';
const App = () => {
return (
<FramePayProvider publishableKey="pk_sandbox_1234567890">
<MyCardPageComponent/>
</FramePayProvider>
);
};
render(<App/>, document.getElementById('root'));
Define configuration parameters as attributes on the provider tag.
publishableKey="pk_sandbox_1234567890"
Please, don't implementing the unmount functionality, use the examples.
The react lifecycle methods already implemented in the library.
- Framepay - FramePay's namespace
BankAccountNumberElement
BankAccountTypeElement
BankRoutingNumberElement
CardElement
CardCvvElement
CardExpiryElement
CardNumberElement
ApplePayElement
SamsungPayElement
GooglePayElement
PaypalElement
- Framepay
CardElement
CardCvvElement
CardExpiryElement
CardNumberElement
- Framepay
BankAccountNumberElement
BankAccountTypeElement
BankRoutingNumberElement
- Framepay
ApplePayElement
- Framepay
SamsungPayElement
- Framepay
GooglePayElement
- Framepay
PaypalElement
This simple FramePay HOC is used to provide the Framepay
API in your component. It is most commonly used in combination with multiple payment methods.
- Payment cards and ACH (CodeSandbox)
- Payment cards and ACH Short version (CodeSandbox)
- Alternative methods (Bitcoin) (CodeSandbox)
Wrapper for the payment card features.
// MyCardPageComponent.js
import React from 'react';
import { withFramePayCardComponent } from '@rebilly/framepay-react';
class MyCardPageComponent extends React.Component {
constructor(props) {
super(props);
this.formNode = null;
this.state = { firstName: '', lastName: '' };
this.onSubmit = this.onSubmit.bind(this);
}
onSubmit(e) {
e.preventDefault();
// @see https://www.rebilly.com/docs/dev-docs/framepay-global-reference/#framepay.createtoken
this.props.Framepay.createToken(
this.formNode,
{ billingAddress: { ...this.state } }
)
.then(data => alert(JSON.stringify(data, null, 2)))
.catch(err => alert(JSON.stringify(err, null, 2)));
}
render() {
return (<form
ref={node => this.formNode = node}
onSubmit={this.onSubmit}>
<div>
<input
type="text"
name="firstName"
placeholder="First Name"
defaultValue={this.state.firstName}
onChange={(e) => this.setState({ firstName: e.target.value })}/>
</div>
<br/>
<div>
<input
type="text"
name="lastName"
placeholder="Last Name"
defaultValue={this.state.lastName}
onChange={(e) => this.setState({ lastName: e.target.value })}/>
</div>
<br/>
<this.props.CardElement/>
<hr/>
<button>Make Payment</button>
</form>);
}
}
export default withFramePayCardComponent(MyCardPageComponent);
Wrapper for the ACH features.
import React from 'react';
import { withFramePayBankComponent } from '@rebilly/framepay-react';
class MyBankPageComponent extends React.Component {
constructor(props) {
super(props);
this.formNode = null;
this.state = { firstName: '', lastName: '' };
this.onSubmit = this.onSubmit.bind(this);
}
onSubmit(e) {
e.preventDefault();
// @see https://www.rebilly.com/docs/dev-docs/framepay-global-reference/#framepay.createtoken
this.props.Framepay.createToken(
this.formNode,
{ billingAddress: { ...this.state } }
)
.then(data => alert(JSON.stringify(data, null, 2)))
.catch(err => alert(JSON.stringify(err, null, 2)));
}
render() {
return (<form
ref={node => this.formNode = node}
onSubmit={this.onSubmit}>
<div>
<input
type="text"
name="firstName"
placeholder="First Name"
defaultValue={this.state.firstName}
onChange={(e) => this.setState({ firstName: e.target.value })}/>
</div>
<br/>
<div>
<input
type="text"
name="lastName"
placeholder="Last Name"
defaultValue={this.state.lastName}
onChange={(e) => this.setState({ lastName: e.target.value })}/>
</div>
<br/>
<this.props.BankElement/>
<hr/>
<button>Make Payment</button>
</form>);
}
}
export default withFramePayBankComponent(MyBankPageComponent);
The framepay-react package supports all the FramePay initialization settings. See Framepay.initialize for all customizations.
<FramePayProvider publishableKey="pk_sandbox_1234567890">
<MyCardPageComponent/>
</FramePayProvider>
The CSS file is hosted on Rebilly's CDN and is found at this URL: https://cdn.rebilly.com/framepay/v1/rebilly.css
See adding default element styles in FramePay's documentation for more details.
The createToken
method supports all FramePay arguments. See Framepay.createToken for more details.
The methods withFramePay
, withFramePayCardComponent
and withFramePayBankComponent
are higher-order-components. They can't be called directly from your render()
method, so assign the generated component to a variable in the global scope before use.
import * as React from 'react';
import {withFramePayCardComponent} from '@rebilly/framepay-react'
class SomeComponent extends React.Component {
render(){
return(<div>
{withFramePayCardComponent(MyCardComponent)}
</div>)
}
}
import * as React from 'react';
import {withFramePayCardComponent} from '@rebilly/framepay-react'
const MyCardElement = withFramePayCardComponent(MyCardComponent);
class SomeComponent extends React.Component {
render(){
return(<div>
<MyCardElement />
</div>)
}
}
In order to manually preview the examples, use serve:e2e
command. It builds the project and starts the local server on the port 8000.
Unit tests can be run using the test:unit
command.
- Ensure you are running the preview examples, otherwise all E2E tests will fail.
- Run one of the following commands:
-
test:e2e:pr
- runs a smaller subset of E2E tests tests headlessly. -
test:e2e:post-merge
- runs the complete set of E2E tests tests headlessly. -
test:e2e:open
- opens the cypress GUI, allowing you to interact with each test visually.
-