云函数错误:
返回结果
{"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();
}
不要在社区等公开平台暴露私钥、密钥等敏感信息。请尽快到商户后台重置密钥,保证商户安全。
云调用用不到api v2key,返回的的payment里面就是调起支付用的参数