简体   繁体   中英

Stripe Payments & React Error

I try to integrate Stripe, but I always get the error:

Cannot read property 'setPublishableKey' of undefined

This is my code:

import React from 'react';
var ReactScriptLoaderMixin = require('react-script-loader').ReactScriptLoaderMixin;
var Stripe;
import $ from 'jquery';


var PaymentForm = React.createClass({
  mixins: [ ReactScriptLoaderMixin ],

    getInitialState: function() {
      return {
        stripeLoading: true,
        stripeLoadingError: false,
        submitDisabled: false,
        paymentError: null,
        paymentComplete: false,
        token: null
      };
    },


    getScriptURL: function() {
      return 'https://js.stripe.com/v2/';
    },

    onScriptLoaded: function() {
      if (!PaymentForm.getStripeToken) {
        // Put your publishable key here
        console.log(Stripe);
        Stripe.setPublishableKey('pk_test_BLABLA');
        this.setState({ stripeLoading: false, stripeLoadingError: false });
      }
    },

    onScriptError: function() {
      this.setState({ stripeLoading: false, stripeLoadingError: true });
    },

    onSubmit: function(event) {

      var self = this;



      event.preventDefault();
      this.setState({ submitDisabled: true, paymentError: null });
      // send form here
      Stripe.createToken(event.target, function(status, response) {
        if (response.error) {
          self.setState({ paymentError: response.error.message, submitDisabled: false });
        }
        else {
          var t = response.id;

          var OrderIds = Object.keys(self.props.orders.warenkorb);
          var total = OrderIds.reduce((sum, key) =>{
            var qty = self.props.orders.warenkorb[key]['qty']
            var size = self.props.orders.warenkorb[key]['size']
            var p1 = self.props.prices.artikel[size]['price']
            var p2 = p1 * qty
            return sum + p2
          },0);
          total = total * 100

          console.log(total);
          var orders = self.props.orders.warenkorb
          var data = { token: t, price: total, orders: orders}
          var dataS = JSON.stringify(data);
          var jqxhr = $.post('http://localhost:8080', dataS , function(res) {
            if (res === 'done'){
              self.setState({ paymentComplete: true, submitDisabled: false});
          }else{
            self.setState({ paymentError: res, submitDisabled: false });
          }
          });

        }
      });
    },

    render: function() {
      if (this.state.stripeLoading) {
        return <div>Loading</div>;
      }
      else if (this.state.stripeLoadingError) {
        return <div>Error</div>;
      }
      else if (this.state.paymentComplete) {
        return <div>Payment Complete!</div>;
      }
      else {
        return (<form onSubmit={this.onSubmit} >
          <span>{ this.state.paymentError }</span><br />
          <input type='text' data-stripe='name' placeholder='Name' /><br />
          <input type='text' data-stripe='number' placeholder='credit card number' /><br />
          <input type='text' data-stripe='exp-month' placeholder='expiration month' /><br />
          <input type='text' data-stripe='exp-year' placeholder='expiration year' /><br />
          <input type='text' data-stripe='cvc' placeholder='cvc' /><br />
          <input disabled={this.state.submitDisabled} type='submit' value='Purchase' />
        </form>);
      }
    }
});

export default PaymentForm;

Than I tried this, same mistake: (Here I https://js.stripe.com/v2/ in the main.html before)

import React from 'react';
import Payment from 'payment';
import { Row, Col, FormGroup, ControlLabel, Button, Alert } from 'react-bootstrap';
var Stripe;


export class PaymentForm2 extends React.Component {
  constructor(props) {
    super(props);

    this.state = {
      number: null,
      exp_month: null,
      exp_year: null,
      cvc: null,
      token: null,
    };

    this.setCardType = this.setCardType.bind(this);
    this.handleSubmit = this.handleSubmit.bind(this);
    this.resetCard = this.resetCard.bind(this);
  }

  resetCard() {
    this.setState({ number: null, exp_month: null, exp_year: null, cvc: null, token: null });
  }

  handleSubmit(event) {
    event.preventDefault();
    this.resetCard();

    const { refs } = this;
    const number = refs.number.value;
    const expiration = refs.expiration.value.split('/');
    const exp_month = parseInt(expiration[0], 10);
    const exp_year = parseInt(expiration[1], 10);
    const cvc = refs.cvc.value;
    const card = { number, exp_month, exp_year, cvc };

    Stripe.setPublishableKey('pk_test_blabla');
    Stripe.createToken(card, function(status, response) {
      if (response.error) {
        console.log('response.error')
      }
      else {
        console.log('bla')
      } 
     }



  setCardType(event) {
    const type = Payment.fns.cardType(event.target.value);
    const cards = document.querySelectorAll('[data-brand]');

    [].forEach.call(cards, (element) => {
      if (element.getAttribute('data-brand') === type) {
        element.classList.add('active');
      } else {
        element.classList.remove('active');
      }
    });
  }

  renderCardList() {
    return (<ul className="credit-card-list clearfix">
      <li><i data-brand="visa" className="fa fa-cc-visa"></i></li>
      <li><i data-brand="amex" className="fa fa-cc-amex"></i></li>
      <li><i data-brand="mastercard" className="fa fa-cc-mastercard"></i></li>
      <li><i data-brand="jcb" className="fa fa-cc-jcb"></i></li>
      <li><i data-brand="discover" className="fa fa-cc-discover"></i></li>
      <li><i data-brand="dinersclub" className="fa fa-cc-diners-club"></i></li>
    </ul>);
  }

  renderCardForm() {
    return (<form className="CardForm" onSubmit={ this.handleSubmit }>
      <Row>
        <Col xs={ 12 }>
          <FormGroup>
            <ControlLabel>Card Number</ControlLabel>
            <input
              onKeyUp={ this.setCardType }
              className="form-control"
              type="text"
              ref="number"
              placeholder="Card Number"
            />
          </FormGroup>
        </Col>
      </Row>
      <Row>
        <Col xs={ 6 } sm={ 5 }>
          <FormGroup>
            <ControlLabel>Expiration</ControlLabel>
            <input
              className="form-control text-center"
              type="text"
              ref="expiration"
              placeholder="MM/YYYY"
            />
          </FormGroup>
        </Col>
        <Col xs={ 6 } sm={ 4 } smOffset={ 3 }>
          <FormGroup>
            <ControlLabel>CVC</ControlLabel>
            <input
              className="form-control text-center"
              type="text"
              ref="cvc"
              placeholder="CVC"
            />
          </FormGroup>
        </Col>
      </Row>
      <Button type="submit" bsStyle="success" block>Generate Token</Button>
    </form>);
  }

  renderCard() {
    const { number, exp_month, exp_year, cvc, token } = this.state;
    return number ? (<Alert bsStyle="info">
      <h5>{ number }</h5>
      <p className="exp-cvc">
        <span>{ exp_month }/{ exp_year }</span>
        <span>{ cvc }</span>
      </p>
      <em>{ token }</em>
    </Alert>) : '';
  }

  componentDidMount() {
    const { number, expiration, cvc } = this.refs;
    Payment.formatCardNumber(number);
    Payment.formatCardExpiry(expiration);
    Payment.formatCardCVC(cvc);
  }

  render() {
    return (<div className="CreditCard">
      { this.renderCardList() }
      { this.renderCardForm() }
      { this.renderCard() }
    </div>);
  }
}

export default PaymentForm2;

PaymentForm2.propTypes = {};

Also this doesn't work.

Please help.

var Stripe; it doesn't look like you are actually importing the Stripe object into your component you are only declaring it as an undefined variable. If the Stripe object is available on window then remove var Stripe; that way you don't overwrite it.

1) remove the redundant var Stripe;

2) It should be window.Stripe.setPublishableKey('pk_test_BLABLA'); (Note the leading window. )

Same goes for Stripe.createToke

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM