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

电商系统对接iyzipay支付API无法存储返回的响应数据如何解决

问题原因

这是典型的JavaScript异步执行时序问题:iyzipay.payment.create是异步回调风格的API,你传入的回调函数会在支付请求的网络响应返回后才被执行,而JavaScript主线程不会阻塞等待异步任务完成,会优先执行所有同步代码。所以你在回调外直接打印returnedData时,回调还未触发、赋值操作还没执行,拿到的自然是初始的空对象;setTimeout延迟1秒后打印能拿到值,只是刚好撞上了网络请求返回的时间,完全不可靠,正式环境绝对不能用这种写法。

解决方案

方案1:后续逻辑移入回调函数

所有需要用到支付返回结果的操作,都直接放到回调内部执行,保证拿到响应结果后再运行对应逻辑:

iyzipay.payment.create(paymentRequest, function (err, result) {
  if (err) {
    return next(new CustomError("Ödeme başarısız.", 500))
  } 
  // 所有需要用到返回结果的逻辑都写在这里,比如存储数据、返回响应等
  console.log(result)
})

方案2:封装为Promise配合async/await(更推荐)

如果项目逻辑比较复杂,嵌套回调容易产生回调地狱,可以把回调风格的接口封装为Promise,用同步写法处理异步逻辑:

// 先封装Promise适配层
const createPayment = (paymentRequest) => {
  return new Promise((resolve, reject) => {
    iyzipay.payment.create(paymentRequest, function (err, result) {
      if (err) {
        return reject(new CustomError("Ödeme başarısız.", 500))
      } 
      resolve(result)
    })
  })
}

// 调用时放在async函数中使用await
async function processPayment() {
  try {
    const returnedData = await createPayment(paymentRequest)
    // 这里可以正常拿到返回结果,后续逻辑直接写在这里即可
    console.log(returnedData)
  } catch (err) {
    next(err)
  }
}

// 触发支付流程
processPayment()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 12:15:03