You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用PayPal API支付时出现isValidCVC未定义错误求助

解决PayPal支付代码中isValidCVC is not defined报错问题

问题根源

你代码里调用了isValidCVC、isValidBillAmount和getCardType三个验证/工具函数,但只实现了isValidExpiryDate,缺失另外三个函数的定义,导致控制台抛出未引用错误。

修复后的完整代码

补充缺失的三个函数,同时修正一处CLIENT_ID的语法错误,完整代码如下:

// Set up PayPal API credentials
const CLIENT_ID = ""; // 修正原代码多出来的单引号
const CLIENT_SECRET = "";
const PAYPAL_API_URL = "https://api.sandbox.paypal.com/v1/payments/payment";

// Get form fields
const expiryDateField = document.getElementById("expiry-date");
const cvcField = document.getElementById("cvc");
const billAmountField = document.getElementById("bill-amount");

// Set up event listener for pay button
document.getElementById("pay-button").addEventListener("click", function () {
    const cardNumber = document.getElementById("card-number").value;

    // Validate card details
    if (cardNumber === null || cardNumber.trim() === "") {
        alert("Please enter a valid credit card number.");
        return false;
    }

    const expiryDate = expiryDateField.value;
    if (!isValidExpiryDate(expiryDate)) {
        alert("Please enter a valid expiration date (MM/YY).");
        return;
    }

    const cvc = cvcField.value;
    if (!isValidCVC(cvc)) {
        alert("Please enter a valid CVV/CVC code.");
        return;
    }

    const billAmount = billAmountField.value;
    if (!isValidBillAmount(billAmount)) {
        alert("Please enter a valid monthly bill amount.");
        return;
    }

    // Create payment payload
    const payload = {
        intent: "sale",
        payer: {
            payment_method: "credit_card",
            funding_instruments: [{
                credit_card: {
                    number: cardNumber,
                    type: getCardType(cardNumber),
                    expire_month: parseInt(expiryDate.split("/")[0]),
                    expire_year: parseInt("20" + expiryDate.split("/")[1]),
                    cvv2: cvc
                }
            }]
        },
        transactions: [{
            amount: {
                total: parseFloat(billAmount) * 1.03,
                currency: "USD",
                details: {
                    subtotal: billAmount,
                    tax: parseFloat(billAmount) * 0.03
                }
            },
            description: "Monthly bill payment"
        }]
    };

    // Send payment request to PayPal API
    const xhr = new XMLHttpRequest();
    xhr.onreadystatechange = function () {
        if (xhr.readyState === 4) {
            if (xhr.status === 201) {
                const response = JSON.parse(xhr.responseText);
                alert("Payment processed successfully! Payment ID: " + response.id);
            } else {
                console.log(xhr.responseText); // Log the error response
                alert("Error processing payment. Please try again later.");
            }
        }
    };
    xhr.open("POST", PAYPAL_API_URL);
    xhr.setRequestHeader("Content-Type", "application/json");
    xhr.setRequestHeader("Authorization", "Bearer " + accessToken); // 注意:accessToken需提前通过PayPal OAuth接口获取
    xhr.send(JSON.stringify(payload));
});

function isValidExpiryDate(expiryDate) {
    // Check that expiry date is in the format "MM/YY"
    if (!/^\d{2}\/\d{2}$/.test(expiryDate)) {
        return false;
    }

    // Parse month and year from expiry date string
    const month = parseInt(expiryDate.split("/")[0]);
    const year = parseInt(expiryDate.split("/")[1]);

    // Check that month and year are valid
    const currentDate = new Date();
    const currentYear = currentDate.getFullYear() % 100; // Get last two digits of current year
    if (year < currentYear || year > currentYear + 10 || month < 1 || month > 12) {
        return false;
    }

    // Check if expiry date is in the past
    if (year === currentYear && month < currentDate.getMonth() + 1) {
        return false;
    }

    return true;
}

// 新增:CVC/CVV验证函数,支持3-4位数字(适配Visa/Mastercard的3位、运通的4位)
function isValidCVC(cvc) {
    return /^\d{3,4}$/.test(cvc.trim());
}

// 新增:账单金额验证函数,支持正数、最多两位小数
function isValidBillAmount(amount) {
    const num = parseFloat(amount);
    return !isNaN(num) && num > 0 && /^\d+(\.\d{1,2})?$/.test(amount.trim());
}

// 新增:卡类型判断函数,识别常见卡种
function getCardType(cardNumber) {
    const trimmedNum = cardNumber.replace(/\s/g, '');
    if (/^4/.test(trimmedNum)) return "visa";
    if (/^(5[1-5]|222[1-9]|22[3-9]|2[3-6]|27[01]|2720)/.test(trimmedNum)) return "mastercard";
    if (/^3[47]/.test(trimmedNum)) return "amex";
    if (/^3(0[0-5]|6[0-9]|8[0-9])/.test(trimmedNum)) return "diners_club";
    return "unknown";
}

额外提示

  1. accessToken变量未实现获取逻辑,你需要先通过PayPal的OAuth接口,用CLIENT_ID和CLIENT_SECRET获取访问令牌,才能发起支付请求。
  2. 前端直接暴露CLIENT_SECRET存在严重安全风险,建议将PayPal API请求逻辑移到后端处理,前端仅负责收集用户输入并调用后端接口。

内容的提问来源于stack exchange,提问作者Clement Klenam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 21:57:57