react-stripe-elements 错误:您必须提供条纹元素或有效的令牌类型才能创建令牌

Sac*_*ria 7 javascript stripe-payments reactjs stripe.js react-stripe-elements

我正在使用 react-stripe-elements 创建一个用于支付的令牌。但是,根据文档,当卡片形式包含在 Elements 组件中时,它应该自动选择要标记化的条纹元素。

但是,在这种情况下,我们会遇到错误

You must provide a Stripe Element or a valid token type to create a Token.
Run Code Online (Sandbox Code Playgroud)

这是代码:

import React from 'react';
import {CardCVCElement, CardExpiryElement, CardNumberElement, PostalCodeElement, StripeProvider, Elements} from 'react-stripe-elements';

class CheckoutForm extends React.Component {
  constructor(props) {
    super(props);
    this.handleSubmit = this.handleSubmit.bind(this);
  }

  handleSubmit(ev) {
    ev.preventDefault();

    this.props.stripe.createToken({email: 'test@test.com'}).then(({token }) => {console.log('Received Stripe token:', token)});
  }

  render() {
    return (
      <form onSubmit={this.handleSubmit}>
        <label>
          Card details
          <CardNumberElement />
          <CardExpiryElement />
          <CardCVCElement />
          <PostalCodeElement />
        </label>
        <button>Confirm order</button>
      </form>
    );
  }
}


class App extends React.Component {
  constructor() {
    super();
    this.state = { stripe: null };
  }

  componentDidMount() {
    this.setState({ stripe: window.Stripe('test_key') });
  }

  render() {
    return (
      <StripeProvider stripe={this.state.stripe}>
        <Elements>
          <CheckoutForm stripe={this.state.stripe} />
        </Elements>
      </StripeProvider>
    );
  }
}

export default App;
Run Code Online (Sandbox Code Playgroud)

根据文档,以下内容应该是正确的:

“在 的上下文中Elements,对 createToken 的调用知道要标记哪个元素,因为该组中只有一个元素。”

然而,情况似乎并非如此。我也尝试过使用单一的“卡片元素”,但没有发现任何成功。

Sac*_*ria 4

事实证明我从未设法使用react-stripe-elements 解决这个问题。我最终使用了标准 JS 版本(来自 stripe 文档)。这是我当前的工作解决方案:

import React from 'react';

class CheckoutForm extends React.Component {
  constructor(props) {
    super(props);
    this.handleSubmit = this.handleSubmit.bind(this);

    this.state = {
      elements: null,
      card: null
    };
  }

  componentWillReceiveProps() {
    this.setState({ elements: this.props.stripe.elements() }, () => {
      this.setState({ card: this.state.elements.create('card') }, () => {
        this.state.card.mount('#card-element');
      });
    });
  }

  handleSubmit(ev) {
    ev.preventDefault();
    this.props.stripe.createToken(this.state.card).then((token) => {
      console.log('Received Stripe token:', token);
    });
  }

  render() {
    return (
      <form onSubmit={this.handleSubmit}>
        <div className="row">
          <label >
            Credit or debit card
          </label>
          <div id="card-element"/>
          <div id="card-errors" role="alert"/>
        </div>
        <button>Submit Payment</button>
      </form>
    );
  }
}

class App extends React.Component {
  constructor() {
    super();
    this.state = {stripe: window.Stripe('test_key')};
  }

  render() {
    return (
      <CheckoutForm stripe={this.state.stripe}/>
    );
  }
}

export default App;
Run Code Online (Sandbox Code Playgroud)