使用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"; }
额外提示
accessToken变量未实现获取逻辑,你需要先通过PayPal的OAuth接口,用CLIENT_ID和CLIENT_SECRET获取访问令牌,才能发起支付请求。- 前端直接暴露
CLIENT_SECRET存在严重安全风险,建议将PayPal API请求逻辑移到后端处理,前端仅负责收集用户输入并调用后端接口。
内容的提问来源于stack exchange,提问作者Clement Klenam
相关产品推荐
相关产品推荐

