生成Paymob Accept支付令牌时出现JS 401循环错误求助
Paymob Accept支付令牌创建时401循环错误排查
代码中的核心问题
1. 无限递归调用引发循环请求
在secondStep函数中,获取订单ID后错误地递归调用了自身secondStep(),而非触发第三步thirdStep。这会导致:
- 重复发送创建订单的POST请求,触发Paymob的限流或认证校验机制,直接引发401错误
- 支付流程完全中断,
thirdStep永远不会被执行
2. 第三步未被正确触发
正确流程应该是secondStep获取订单ID后,将token和id作为参数传递给thirdStep,而非递归自身。
3. cardPayment函数作用域错误
cardPayment定义时未声明参数,但调用时传入了finalToken,函数内部无法访问该变量,会导致iframe URL拼接失败。
修正后的代码示例
const API = 'APK_KEY' async function firstStep() { let data = { "api_key": API } let request = await fetch('https://accept.paymob.com/api/auth/tokens', { method: 'post', headers: {'content-type' : 'application/json'}, body: JSON.stringify(data) }) let responseData = await request.json() let token = responseData.token await secondStep(token) } async function secondStep(token) { let data = { "auth_token": token, "delivery_needed": "false", "amount_cents": "100", "currency": "EGP", "items": [], } let request = await fetch('https://accept.paymob.com/api/ecommerce/orders', { method : 'POST', headers: {'content-type' : 'application/json'}, body: JSON.stringify(data) }) let responseData = await request.json() let id = responseData.id // 调用第三步,传递必要参数 await thirdStep(token, id) } async function thirdStep(token, id) { let data = { "auth_token": token, "amount_cents": "100", "expiration": 3600, "order_id": id, "billing_data": { "apartment": "803", "email": "claudette09@exa.com", "floor": "42", "first_name": "Clifford", "street": "Ethan Land", "building": "8028", "phone_number": "+86(8)9135210487", "shipping_method": "PKG", "postal_code": "01898", "city": "Jaskolskiburgh", "country": "CR", "last_name": "Nicolas", "state": "Utah" }, "currency": "EGP", "integration_id": 13034 } let request = await fetch('https://accept.paymob.com/api/acceptance/payment_keys', { method: 'post', headers: {'content-type' : 'application/json'}, body: JSON.stringify(data) }) let responseData = await request.json() let finalToken = responseData.token await cardPayment(finalToken) } async function cardPayment(finalToken) { // 接收参数并正确拼接URL let iframeURL = `https://accept.paymob.com/api/acceptance/iframes/18922?payment_token=${finalToken}` console.log(iframeURL) } // 启动支付流程 firstStep()
额外校验项
- 确认
API变量中的密钥是Paymob提供的有效密钥 - 检查
integration_id和iframe ID是否与你的Paymob集成配置完全匹配 - 所有异步操作添加
await,确保流程按顺序执行,避免因异步时序问题导致参数未就绪
内容的提问来源于stack exchange,提问作者Mustafa M. Youssef
相关产品推荐
相关产品推荐

