Głównym problemem, który prawdopodobnie masz, jest ładowanie skryptu w React.
Jednym ze sposobów jest załadowanie skryptu kasowania tylko wtedy, gdy jest to potrzebne (zakładając, że jest jakaś forma spa), a następnie po prostu wywołaj go bezpośrednio. Jest to podobne do "niestandardowej" wersji na stronie dokumentacji: https://stripe.com/docs/checkout#integration-custom
Jeśli już ładujesz plik checkout.js (na przykład przed swoim "app.js"), to poniżej można nieco uprościć, nie ręcznie ładowanie w skrypcie.
import React from 'react';
export default class Cards extends React.Component {
constructor(props:Object) {
super(props);
this.state = {
loading: true,
stripeLoading: true,
};
}
loadStripe(onload:Function) {
if(! window.StripeCheckout) {
const script = document.createElement('script');
script.onload = function() {
console.info("Stripe script loaded");
onload();
};
script.src = 'https://checkout.stripe.com/checkout.js';
document.head.appendChild(script);
} else {
onload();
}
}
componentDidMount() {
this.loadStripe(() => {
this.stripehandler = window.StripeCheckout.configure({
key: 'pk_test_xxxxxxxxxxxxxxxxxxxxxxxx',
image: 'https://stripe.com/img/documentation/checkout/marketplace.png',
locale: 'auto',
token: (token) => {
this.setState({ loading: true });
axios.post('/your-server-side-code', {
stripeToken: token.id,
});
}
});
this.setState({
stripeLoading: false
});
});
}
componentWillUnmount() {
if(this.stripehandler) {
this.stripehandler.close();
}
}
onStripeUpdate(e:Object) {
this.stripehandler.open({
name: 'test',
description: 'widget',
panelLabel: 'Update Credit Card',
allowRememberMe: false,
});
e.preventDefault();
}
render() {
const { stripeLoading, loading } = this.state;
return (
<div>
{(loading || stripeLoading)
? <p>loading..</p>
: <button onClick={this.onStripeUpdate}>Add CC</button>
}
</div>
);
}
}
Wykorzystanie 'react' obsługiwanych wtyczek jak https://www.npmjs.com/package/react-stripe-checkout –