各位朋友好,请问有哪位遇到类似于我下面的问题?
我最近在调试从小程序端访问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", …}
特此请求有关高手:
是不是我哪些地方还领悟不到位?在此先致谢了!