当前位置: 首页 > 知识库问答 >
问题:

使用Stripe接受在线支付

班昱
2023-03-14

所以这是我第一次使用Stripe,我想做的就是这个。为了测试的目的,我为它创建了一个后端。但我遇到了一个问题,当我单击pay按钮时,控制台Uncapture(在promise中)IntegrationError中出现了这个错误:您必须提供一个Stripe元素或有效的令牌类型来创建令牌。。是什么导致了这个错误?

server.js


require("dotenv").config({ path: "./config.env" });
const express = require("express");
const app = express();
const bodyParser = require('body-parser')
const postCharge = require('./routes/stripe')
const router = express.Router()
const cors = require("cors")

app.use(express.json());
app.use(cors());


router.post('/stripe/charge', postCharge)
router.all('*', (_, res) =>
  res.json({ message: 'please make a POST request to /stripe/charge' })
)
app.use((_, res, next) => {
  res.header('Access-Control-Allow-Origin', '*')
  res.header(
    'Access-Control-Allow-Headers',
    'Origin, X-Requested-With, Content-Type, Accept'
  )
  next()
})
app.use(bodyParser.json())
app.use('/payment',router)

app.get('*', (_, res) => {
  res.sendFile(path.resolve(__dirname, '../audible/public/index.html'))


const PORT = process.env.PORT || 5000;

const server = app.listen(PORT, () =>
  console.log(`Sever running on port ${PORT}`)
);

stripe.js

const stripe = require('stripe')(process.env.STRIPE_SECRET_TEST)

async function postCharge(req, res) {
  try {
    const { amount, source, receipt_email } = req.body

    const charge = await stripe.charges.create({
      amount,
      currency: 'usd',
      source,
      receipt_email
    })

    if (!charge) throw new Error('charge unsuccessful')

    res.status(200).json({
      message: 'charge posted successfully',
      charge
    })
  } catch (error) {
    res.status(500).json({
      message: error.message
    })
  }
}

module.exports = postCharge

付款单

import React,{useContext, useState} from 'react'
import {CardElement, useStripe, useElements } from"@stripe/react-stripe-js"
import { CartContext } from '../../context/cart'
import axios from 'axios'
import {  useHistory } from "react-router-dom";


const CARD_OPTIONS={
    base: {
        color: '#303238',
        fontSize: '16px',
        fontFamily: '"Open Sans", sans-serif',
        fontSmoothing: 'antialiased',
        '::placeholder': {
          color: '#CFD7DF',
        },
      },
      invalid: {
        color: '#e5424d',
        ':focus': {
          color: '#303238',
        },
      },
}
const PaymentForm = () => {
  const { total} = useContext(CartContext)
  const stripe = useStripe();
  const [receiptUrl, setReceiptUrl] = useState('')
  const history = useHistory()
  const {clearCart} = useContext(CartContext)
  const elements = useElements()

  const handleSubmit = async event => {
    event.preventDefault()
    const cardElement = elements.getElement(CardElement);
    const { token } = await stripe.createToken()

    const order = await axios.post('http://localhost:5000/api/stripe/charge', {
      amount: 1000,
      source: token,
      card: cardElement,
      receipt_email: 'customer@example.com'
      
    })
    setReceiptUrl(order.data.charge.receipt_url)
  }
  if (receiptUrl){
    history.push('/');
    clearCart();
    return (
      <div className="success">       
        <h2>Payment Successful!</h2>
      </div>
    )
  }

    return (
        <>  
         <form onSubmit={handleSubmit}>
             <fieldset className='form_group'>
                <div className='formRow'>
                    <CardElement options={CARD_OPTIONS} />
                </div>
             </fieldset>
                <button type='submit' className=''>Pay</button>
                <h3>
                    order total : <span> ${total}</span>
                </h3>
         </form>
        </>
    )
  }  



export default PaymentForm

条形容器

import React from 'react'
import {loadStripe} from '@stripe/stripe-js'
import {Elements, } from '@stripe/react-stripe-js'
import PaymentForm from './PaymentForm'
const PUBLIC_KEY="pk_test_51IaINYEqJWuHZaMS8NbdFT8M7ssdvFXOqBO8gwn1MjQCJ9Mq5kYdraTFG4Y28i9xLtaWKJanVLLbjlrduQKHv00uJ0WbJnu"

const stripeTestPromise = loadStripe(PUBLIC_KEY)
const StripeContainer = () => {
    return (
        <Elements stripe={stripeTestPromise}>
            <PaymentForm   />
        </Elements>
    )
}
export default StripeContainer

共有1个答案

劳研
2023-03-14

与其使用令牌和费用进行新的集成,我建议使用更新的支付意图和支付方法API,遵循本指南接受支付。

看起来您还使用了不推荐使用的react-stripe-elements库(不推荐使用通知),该库已被@stripe/react-stripe-js库(github,docs)替换。

无论哪种情况,都需要确保使用提供程序初始化Stripe.js。使用如下所示的较新库(docs):

const stripePromise = loadStripe('pk_test_123');

const App = () => {
  return (
    <Elements stripe={stripePromise}>
      <MyCheckoutForm />
    </Elements>
  );
};

如果要使用旧库,提供程序的工作方式如下(旧文档):

import {StripeProvider} from 'react-stripe-elements';
import MyStoreCheckout from './MyStoreCheckout';

const App = () => {
  return (
    <StripeProvider apiKey="pk_test_12345">
      <MyStoreCheckout />
    </StripeProvider>
  );
};
 类似资料:
  • 有人能告诉我Stripe CLI应用程序的语法吗 只有代表另一个帐户(使用OAuth密钥、条带帐户头或目标参数)提出请求时,才能申请费用 我无法破译目标参数语法,例如 条带支付计划创建--金额2000--申请费金额500--客户客户测试用户--货币=欧元--支付方式pm_卡_visa--确认=真-d转账_数据[]=账户测试用户

  • 使用iOS SDK for Stripe,我们可以执行以下操作吗 创建客户配置文件,其中客户id可以发送并存储到后端 向客户配置文件添加、编辑、删除信用卡 卡可以从后端自动计费

  • 我可以使用Stripe API接收客户付款,但我希望它应该使用客户ID发送给其他客户。 我已经编写了接收付款的代码,但我希望付款应使用他的客户ID发送给其他客户。 它应该发送给其他客户,但我不知道要在这里添加哪些其他代码片段。

  • 我正在从Changes API迁移到PaymentIntent API。我成功地安装了代码。 但我很惊讶地看到,每次我加载页面条带时,都会在条带dashboad上创建一个显示“未完成”付款状态的付款意图,点击带有所有详细信息的付款按钮后,该状态变为“成功”状态。 PHP代码 正如您所知,这为我提供了在js脚本中使用的客户机_密钥。 JS代码 我只想在用户点击支付按钮时创建条带支付。与收费API相同

  • 我需要为我Java Android应用程序提供一个带区实现,但对于Java服务器,我不知道如何使用节点或php来实现服务器端,我在他们的文档上找到了一些东西: 如果你能指导我的话,我将不胜感激!欢迎任何教程或建议。我试着从GitHub复制,但是我看到了许多进口的红线,我迷路了。提前谢谢!

  • 我不清楚什么时候建立秩序,以下是我想到的两种方法: 第一种方法 用户输入订单详细信息并单击“下单”。 在数据库中创建带有布尔标志is_active的Order,并将orderId发送到UI。 用户将被重定向到带区支付页面。 用户输入卡的详细信息,我们将获得计费卡的条带令牌 将orderId发送到后端的令牌。 后端使用令牌向带区计费用户发送请求,如果计费成功,则将订单标记为活动,否则向用户报告失败。