Я работаю над тем, чтобы интегрировать API полосы с моим интерфейсом реакции. У меня проблемы с тем, чтобы сделать его объектом для клиентов сейчас, так как я хочу, чтобы он выполнял регулярные платежи и управлял счетами. Я заставил это работать, используя метод поста токена из полосы. Я приложил код для этого ниже.
import React, { useState } from "react";
import { FormGroup, FormControl, ControlLabel } from "react-bootstrap";
// import AddressSection from './AddressSection';
import { CardElement, injectStripe } from "react-stripe-elements";
import LoaderButton from "./LoaderButton";
import { useFormFields } from "../libs/hooksLib";
import "./BillingForm.css";
function BillingForm({ isLoading, onSubmit, ...props }) {
const [fields, handleFieldChange] = useFormFields({
name: "",
address_line1: "",
address_city: "",
address_state: ""
});
const [isProcessing, setIsProcessing] = useState(false);
const [isCardComplete, setIsCardComplete] = useState(false);
isLoading = isProcessing || isLoading;
function validateForm() {
return (
fields.name !== "" &&
fields.address_line1 !== "" &&
fields.address_city !== "" &&
fields.address_state !== "" &&
isCardComplete
);
}
async function handleSubmitClick(event) {
event.preventDefault();
setIsProcessing(true);
const { token, error } = await props.stripe.createToken({ name: fields.name, address_line1: fields.address_line1, address_city: fields.address_city, address_state: fields.address_state });
setIsProcessing(false);
onSubmit({ token, error });
}
return (
<div>
<form className="BillingForm" onSubmit={handleSubmitClick}>
<div className="Add_card_details">
Add Payment Details
</div>
<FormGroup bsSize="large" controlId="name">
<ControlLabel>Cardholder's name</ControlLabel>
<FormControl
type="text"
value={fields.name}
onChange={handleFieldChange}
placeholder="Name on the card"
/>
</FormGroup>
<ControlLabel>Credit Card Info</ControlLabel>
<CardElement
className="card-field"
onChange={e => setIsCardComplete(e.complete)}
style={{
base: { fontSize: "18px", fontFamily: '"Open Sans", sans-serif' }
}}
/>
<FormGroup bsSize="large" controlId="address_line1">
<ControlLabel>Address Line</ControlLabel>
<FormControl
type="text"
value={fields.address_line1}
onChange={handleFieldChange}
placeholder="1614 Santa Monica Blvd"
/>
</FormGroup>
<FormGroup bsSize="large" controlId="address_city">
<ControlLabel>Address City</ControlLabel>
<FormControl
type="text"
value={fields.address_city}
onChange={handleFieldChange}
placeholder="Los Angeles"
/>
</FormGroup>
<FormGroup bsSize="large" controlId="address_state">
<ControlLabel>Address State</ControlLabel>
<FormControl
type="text"
value={fields.address_state}
onChange={handleFieldChange}
placeholder="CA"
/>
</FormGroup>
<LoaderButton
block
type="submit"
bsSize="large"
isLoading={isLoading}
disabled={!validateForm()}
>
Save
</LoaderButton>
</form>
</div>
);
}
export default injectStripe(BillingForm);
И
import React, { useState } from "react";
import { API } from "aws-amplify";
import { Elements, StripeProvider } from "react-stripe-elements";
import BillingForm from "../components/BillingForm";
import config from "../config";
import "./Settings.css";
export default function Settings(props) {
const [isLoading, setIsLoading] = useState(false);
function billUser(details) {
return ;
}
async function handleFormSubmit({ token, error }) {
if (error) {
alert(error);
return;
}
setIsLoading(true);
try {
await billUser({
source: token.id
});
alert("Your card has been charged successfully!");
props.history.push("/dashboard");
} catch (e) {
alert(e);
setIsLoading(false);
}
}
return (
<div className="Settings">
<StripeProvider apiKey={config.STRIPE_KEY}>
<Elements>
<BillingForm
isLoading={isLoading}
onSubmit={handleFormSubmit}
/>
</Elements>
</StripeProvider>
</div>
);
}
Я попытался изменить props.stripe.createToken на props.stripe.customers.create, и это выдает ошибку, которую невозможно создать .create невозможно называется. Если у кого-то есть какие-либо идеи, буду очень признателен.