收藏
回答

云支付为什么提示验证签名失败?

云函数错误:

返回结果

{"code":200,"data":{"appId":"wxb5ec8e6472355555","timeStamp":"1743928251","nonceStr":"rQ2NpeYvGcPrtiat","package":"prepay_id=wx061630515964043fddae0cc7abcdb50000","signType":"MD5","paySign":"8E90BBC5EC56B36160CBFEDA452EA9E6"}}

日志

START RequestId: d347f24d-3378-46c3-aa9a-2f900da977f3

Event RequestId: d347f24d-3378-46c3-aa9a-2f900da977f3

2025-04-06T08:30:51.094Z  支付参数: {

  body: '测试商品',

  out_trade_no: 'test_1743928250850',

  total_fee: 1,

  spbill_create_ip: '111.29.183.208',

  trade_type: 'JSAPI',

  openid: 'o5U8E7DPVev1_wvtb5GYbijsWTOA',

  appid: 'wxb5ec8e6472355555', 小程序开发的APPID

  mch_id: '1712588888', 申请的商户号

  nonce_str: 'f134d62560b1b5d5e109a7e1825daf0c',

  sign_type: 'MD5',

  function_name: 'paycs',

  env_id: 'ljj-6g7u5sv70c741468',

  sub_mch_id: '1712588888' 我没有子商户号,但有我的服务商1800099999小程序云开发 不知道这个能用得到不

}

2025-04-06T08:30:51.636Z  微信支付接口返回: {

  appid: 'wxd2d16a504f24775e', 为什么这里返回了一个和我的“wxb5ec8e6472355555” 不一样?

  sign: '01C59CCF3507E45C358AE6C1FB0CF2CA',

  payment: {

    appId: 'wxb5ec8e6472355555',

    timeStamp: '1743928251',

    nonceStr: 'rQ2NpeYvGcPrtiat',

    package: 'prepay_id=wx061630515964043fddae0cc7abcdb50000',

    signType: 'MD5',

    paySign: '1E70FA0D53D2B2AE3DF7A49A155267D9'

  },

  returnCode: 'SUCCESS',

  returnMsg: 'OK',

  mchId: '1800099999', 还返回了这个,这个不是我申请的商户号

  subAppid: 'wxb5ec8e6472355555',

  subMchId: '1712588888',这个是我申请的商户号

  nonceStr: 'rQ2NpeYvGcPrtiat',

  resultCode: 'SUCCESS',


  tradeType: 'JSAPI',


  prepayId: 'wx061630515964043fddae0cc7abcdb50000',


  errCode: 0,


  errMsg: 'cloudPay.unifiedOrder:ok'


}


Response RequestId: d347f24d-3378-46c3-aa9a-2f900da977f3 RetMsg: {"code":200,"data":{"appId":"wxb5ec8e6472355555","timeStamp":"1743928251","nonceStr":"rQ2NpeYvGcPrtiat","package":"prepay_id=wx061630515964043fddae0cc7abcdb50000","signType":"MD5","paySign":"8E90BBC5EC56B36160CBFEDA452EA9E6"}}

-----------------------------------------------

以下云函数

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

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

const crypto = require('crypto');


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

  // 配置参数(必须按实际值修改!)

  const config = {

    appid: 'wxb5ec8e6472355555',      // 商户AppID

    mch_id: '1712588888',             // 商户号

    key: 'KJLFJOW8378324jdfiweu8438598swwq', // 商户API密钥

  };


  // 参数校验

  const amount = Number(event.amount);

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

    return {

      code: 400,

      message: '参数错误: orderId/openid/amount必填且金额>0'

    };

  }


  // 构造支付参数(严格按照微信文档参数名大小写)

  const paymentParams = {

    body: event.productName || '测试商品',

    out_trade_no: event.orderId,

    total_fee: Math.round(amount * 100), // 金额单位为分

    spbill_create_ip: cloud.getWXContext().CLIENTIP || '127.0.0.1',

    trade_type: 'JSAPI',

    openid: event.openid,

    appid: config.appid,

    mch_id: config.mch_id,

    nonce_str: crypto.randomBytes(16).toString('hex'),

    sign_type: 'MD5',

    function_name:'paycs',

    env_id:'ljj-6g7u5sv70c9876666,

    sub_mch_id:config.mch_id

  };


  console.log('支付参数:', paymentParams);


  // 生成签名(注意:要用主商户的key!)

  paymentParams.sign = generateSign(paymentParams, config.key);


  try {

    // 调用支付接口

    const result = await cloud.cloudPay.unifiedOrder(paymentParams);


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


    // 检查 prepay_id 是否存在

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

      throw new Error(result.returnMsg || result.errCodeDes || '支付失败');

    }


    // 构造前端支付参数(特别注意字段名大小写)

    const paySignParams = {

      appId: config.appid,

      timeStamp: Math.floor(Date.now() / 1000).toString(),

      nonceStr: result.nonceStr,

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

      signType: 'MD5'

    };


    // 生成前端签名(要用主商户的key!)

    const paySign = generateSign({

      appid: config.appid,

      timestamp: paySignParams.timeStamp,

      noncestr: paySignParams.nonceStr,

      package: paySignParams.package,

      sign_type: 'MD5'

    }, config.key);


    return {

      code: 200,

      data: {

        ...paySignParams,

        paySign: paySign.toUpperCase() // 必须大写

      }

    };

  } catch (err) {

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

    return {

      code: 500,

      message: '支付失败',

      error: err.message

    };

  }

};


// MD5签名函数(严格按微信规范)

function generateSign(params, key) {

  const stringA = Object.keys(params)

    .filter(k => k !== 'sign' && params[k] !== undefined && params[k] !== '')

    .sort()

    .map(k => `${k}=${params[k]}`)

    .join('&');

  return crypto.createHash('md5')

    .update(stringA + '&key=' + key)

    .digest('hex')

    .toUpperCase();

}

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

2 个回答

  • 支付社区运营
    支付社区运营
    04-07

    不要在社区等公开平台暴露私钥、密钥等敏感信息。请尽快到商户后台重置密钥,保证商户安全。

    04-07
    有用
    回复
  • Memory (私信不回复)
    Memory (私信不回复)
    04-06

    云调用用不到api v2key,返回的的payment里面就是调起支付用的参数

    04-06
    有用 1
    回复
登录 后发表内容