收藏
回答

为什么真是提示获取prepay_id失败?

帮忙看下云函数是不是写错了,我申请的是商户APIV2密钥,总是提示获取prepay_id失败,这个是签名错误了,应该怎么写呢?我的签名参数与微信官网的一样吗?


const cloud = require('wx-server-sdk')

cloud.init({ env: cloud.DYNAMIC_CURRENT_ENV })


exports.main = async (event, context) => {

  // 参数校验

  if (!event.orderId || !event.openid || event.amount === undefined) {

    throw new Error('缺少必要参数: orderId/openid/amount')

  }


  // 检查金额是否为有效数字

  if (isNaN(event.amount) || event.amount <= 0) {

    throw new Error('金额无效')

  }


  // 支付配置

  const payConfig = {

    appId: 'wxb5ec8e6472355555', // 你的小程序AppID

    mchId: '1715555555',         // 你的商户号

    key: 'KJLFJOW8378324jdfiweu84385955555' // API密钥

  }


  // 获取用户 IP 地址

  const wxContext = cloud.getWXContext()

  const clientIP = wxContext.CLIENTIP || '127.0.0.1' // 如果获取不到,使用默认值


  // 构造支付参数

  const paymentParams = {

    body: String(event.productName || '商品支付').substr(0, 128),

    out_trade_no: String(event.orderId),

    total_fee: parseInt(Number(event.amount) * 100), // 金额单位为分

    spbill_create_ip: clientIP, // 使用获取到的用户 IP

    trade_type: 'JSAPI',

    openid: String(event.openid),

    appid: payConfig.appId,

    mch_id: payConfig.mchId,

    nonce_str: Math.random().toString(36).substr(2, 32)

  }


  console.log('支付参数:', paymentParams) // 打印验证


  // 生成签名

  const sign = cloud.cloudPay.sign(paymentParams, payConfig.key)

  paymentParams.sign = sign // 将签名添加到支付参数中


  try {

    // 调用支付接口

    const result = await cloud.cloudPay.unifiedOrder({

      envId: cloud.DYNAMIC_CURRENT_ENV, // 确保传入正确的环境ID

      ...paymentParams

    })

    console.log('微信支付接口返回:', result)


    if (!result || !result.prepay_id) {

      throw new Error(result.err_code_des || '获取prepay_id失败')

    }


    // 生成前端参数

    const timestamp = Math.floor(Date.now() / 1000).toString()

    const paySign = cloud.cloudPay.sign({

      appId: payConfig.appId,

      timeStamp: timestamp,

      nonceStr: result.nonce_str,

      package: `prepay_id=${result.prepay_id}`,

      signType: 'MD5'

    }, payConfig.key)


    return {

      code: 200,

      data: {

        timeStamp: timestamp,

        nonceStr: result.nonce_str,

        package: `prepay_id=${result.prepay_id}`,

        signType: 'MD5',

        paySign: paySign

      }

    }

  } catch (err) {

    console.error('支付失败:', err)

    return {

      code: 500,

      message: '支付失败',

      error: err.message

    }

  }

}

回答关注问题邀请回答
收藏

3 个回答

登录 后发表内容