1

我完全感到困惑。我有一个支付途径,允许人们通过贝宝或条纹支付。根据他们所在的位置,他们将以美元或英镑/欧元支付。

我有两个条带网关,一个用于美国,另一个用于英国/欧盟。

付款表格是“原样”的 Stripe Checkout 并放在前端。

大多数时候,我可以毫无问题地付款——在美国和英国之间切换没有任何问题。

但是,有时我会收到以下错误消息:

Debug: internal, implementation, error 
    TypeError: stripe is not a function

指向我的 stripe.js 文件中的行,我在其中使用密钥设置条带。我很困惑,因为它大部分时间都有效——而且是一种方法。

我刷新浏览器,似乎没问题,稍后再中断。

支付.js

    const stripeMethods = require("./../../utilities/stripe.js");
    const braintreeMethods = require("./../../utilities/braintree.js");

    module.exports = {
        method: ["POST"],
        path: "/pay/{task}",
        options: {
            // ... validations, removed
            async handler(request, h) {

                let cart = request.session.cart;
                let orderid = await request.getUniqueToken(8, 'order', 'orderid'); // generate order id
                let charge;

                switch (request.params.task) {
                    case "stripe":
                        charge = await stripeMethods.charge(request.payload.token, cart, orderid);
                        cart.paymentType = 'stripe';
                        break;
                    case "paypal":
                        charge = await braintreeMethods.charge(request.payload.token, cart, orderid);
                        cart.paymentType = 'paypal';
                        break;
                }
                // .... do a bunch of stuff with createOrder - removed
            }
        }
    };

stripe.js 包含以下内容:

 <!-- language: lang-js -->

let stripe = require('stripe');

const charge = async (token, cart, orderid) => {

    try {
        if (cart.total.currency === 'GBP' || cart.total.currency === 'EUR') {
            stripe = stripe('###########'); // secret for UK Stripe, hardwired in for testing
        } else {
            stripe = stripe('##########'); // secret for USA Stripe
        }
        let charge = await stripe.charges.create({
            amount: Math.trunc(cart.total.total), // truncates without rounding
            currency: cart.total.currency,
            source: token, // obtained with Stripe.js
            description: `....`
        });

而且,间歇性地,我收到以下错误... Stripe 不是函数。它似乎是随机发生的(当然,我知道这不是随机的。我还不能识别一种模式)。

Debug: internal, implementation, error 
    TypeError: stripe is not a function
    at Object.charge (.../utilities/stripe.js:8:18)
    at handler (.../web/routes/pay.js:51:50)
    at <anonymous>
    at process._tickCallback (internal/process/next_tick.js:160:7)

我在“onPostAuth”处理程序中运行一个方法来检测购物车的存在。

理论上,它应该只在没有购物车的情况下运行。因此,当客户首次登陆网站时,以及当客户结账时(购物车被擦除并重新初始化)

   if (request.session && !request.session.cart) {
        console.log('RUNNING WHEN PATH?', request.path)
        request.session.cart = cartMethods.cartSetup(); // if no cart - set one up
    }

我正在注销购物车报告为丢失的路径。它似乎在 css.map 文件被命中时运行..(购物车页面是一个 vue.js 应用程序 - 结帐只是一个 html 页面

我认为首先,我应该修改我的 onPostAuth 以忽略路径中带有 .map 的任何内容

** 编辑 **

继@karllekko 的评论之后——我在文件的开头要求我的英国和美国——并在我的方法中引用了这些变量。

let ukStripe = require('stripe'('sk_test_#######################');
let usStripe = require('stripe')('sk_test_#######################');

const charge = async (token, cart, orderid) => {
    try {
        let stripe;
        if (cart.total.currency === 'GBP' || cart.total.currency === 'EUR') {
            stripe = ukStripe;
        } else {
            stripe = usStripe;
        }

这是有效的 - 付款后付款没有失败。但是,它困扰着我……真的困扰着我。我不知道为什么这是有效的。范围应该不是问题……如果有人可以分享任何见解,那就太好了。我已经用谷歌搜索了 - 但没有找到任何关于原因的答案。

** 编辑 **

和我的朋友戴夫说话——现在非常明显……我在踢自己……

戴夫 [上午 9 点 52 分] 很明显,您stripe每次都 在重新分配stripe = stripe('###########')

抢 [上午 9 点 52 分] ....哦,废话....你是对的

戴夫 [上午 9 点 52 分] stripe = _return value of stripe()_

Dave [上午 9 点 52 分] 提示:永远不要使用let always use const that way,如果你不小心这样做了,你可以看到在哪里

rob [9:53 AM] :+1: const 指的是类型不是吗?

戴夫 [上午 9 点 53 分] 不

rob [9:53 AM] (除非它是一个字符串 - 然后是值)

戴夫 [上午 9 点 53 分] const如果该值是对象,则防止重新分配标识符,然后确保您可以更改对象内容,但是是的,字符串不能被修改原语与对象

----所以问题出在我身上。

4

0 回答 0