各位朋友好,请问有哪位遇到类似于我下面的问题?

我最近在调试从小程序端访问LeanCloud云引擎端定义的函数。主要参考例程是【在微信小程序与小游戏中使用 LeanCloud】中提到的小程序端与Leancloud服务端。我的MAC开发环境如下:

小程序端:
微信开发者工具,版本是目前最新的,即V1.02.1812271
LeanCloud javascript-sdk是v3.11.0中的av-weapp-min.js
服务端:
WebStorm 2.17.2
Node.js 6.x
Express 4.12.3

小程序端相关代码

注意到,官方示例中,为了简化,其在小程序端进行支付时支付金额只是从界面上提示了一下「打赏0.01元],其实这个钱数与小程序端毫无关系。服务端在实现预支付时也是硬性指定了这个钱数。
但是,实际开发中,应当是小程序端根据当前用户操作计算需要付费的总金额,然后在调用云函数时,把这个数据作为参数,传递到云函数中。我的稍经修改后的代码如下所示:

//去结算
toBuy() {
wx.showToast({
title: '正在创建订单',
icon: 'loading',
duration: 10000,
mask: true
})
/**
* 调用商户服务端定义的方法(这个方法部署在leanengine上)
* then中的是成功回调后的代码;catch中是异步处理代码
* 当前参数:传递价格总值
*/
var paramsJson = {
totalPrice: this.data.totalMoney
};

Cloud.run('order',paramsJson).then((data) => {

console.log("****typeof data: ", typeof data);
console.log('data: ',data);

data.success = () => {
wx.showToast({
title: '支付成功',
icon: 'success',
duration: 1500,
});
}
data.fail = ({ errMsg }) => this.setData({ error: errMsg });
/**
* 真正唤醒支付!
*/
wx.requestPayment(data);

}).catch(error => {
this.setData({ error: error.message });//wxml中自动显示相应信息,见模拟器下部
wx.hideToast();
})
}

上述代码直接在官方文件pay.js基础上稍作修改,即传递了一个总价这个参数,其他的基本没有变。

LeanCloud服务端相关代码

这主要体现在文件cloud.js中:

AV.Cloud.define('order', (request) => {
    const user = request.currentUser;
//……
/**
 * 注意:大部分字段值都是在本服务端硬编码方式给出的,但是价格来自于小程序端
 * 实际中,许多值应来自于小程序客户端(通过request封装!)
 * @type {Order}
 */
const order = new Order();
order.tradeId = uuid().replace(/-/g, '');
order.status = 'INIT';
order.user = request.currentUser;
order.productDescription = '基于LeanCloud后端小程序支付测试';

//________________________________________
//以分为单位
//0.01*100=1
order.amount = parseInt(request.params.totalPrice*100);

order.ip = request.meta.remoteAddress;
if (!(order.ip && /^(?:[0-9]{1,3}\.){3}[0-9]{1,3}$/.test(order.ip))) {
    order.ip = '127.0.0.1';
}
order.tradeType = 'JSAPI';
//……
order.place().then(() => {
    console.log(`预订单创建成功:订单号 [${order.tradeId}] prepayId [${order.prepayId}]`);
const payload = {
    appId: process.env.WEIXIN_APPID,
    timeStamp: String(Math.floor(Date.now() / 1000)),
    package: `prepay_id=${order.prepayId}`,
    signType: 'MD5',
    nonceStr: String(Math.random())
}
/**
 * 调起数据签名,需要五个字段参与签名(区分大小写):appId,nonceStr,package,signType,timeStamp
 * 参考:https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter=7_3&index=1
 */
payload.paySign = wxpay.sign(payload);
return new Promise( (resolve, reject) => {
    resolve(payload);
});
}).catch(error => {
        console.error('+++error:',error);
        throw new AV.Cloud.Error(JSON.stringify(error));
    });
});

问题

通过上述方式定义的云函数order,在通过上述小程序端代码调用时,出现控制台显示如下错误:
****typeof data:undefined
data:undefined
如果把上述方式云函数order定义方式改为老版本V时代的有两个参数request和response方式,同时把上面的返回有关代码:

return new Promise( (resolve, reject) => {
resolve(payload);
});
修改为:
response.success(payload);

则在小程序端支付完全正常。当然,相应的小程序控制台显示也正常:

data:{appId: “wx7504b31…...da", timeStamp: "1547764113", package: "prepay_id=wx18062833451749f8be08e2a326…...", signType: "MD5", nonceStr: "0.4654511579631775", …}

特此请求有关高手:
是不是我哪些地方还领悟不到位?在此先致谢了!

作为我个人的补充。此前我搜索了官方好多文档,并搜索了论坛中有关内容,主要使用的搜索关键词是“response.success”。
从中,找到的一些参考中与官方其他地方提到的一致。
而且,我在本地测试云函数时(使用命令行lean up)发现,在云函数定义中返回方式使用:
response.success(obj);
与使用:

return new Promise( (resolve, reject) => {
resolve(payload);
});
返回结果完全一致!那么,为什么在小程序端在解析这个返回结果时(上面示例中是data),就显示为undefined呢?

新版的 Promise 风格云函数要求你返回一个 Promise,我看到 order.place().then 这行前面是没加 return 的(可能还有其他位置,请自行检查下)。

谢谢,我再根据您的提示分析一下。