新版二手书小程序的进程每天都在更新了,中午抽时间赶到了支付阶段,第一次使用云开发进行小程序支付,体验了下,真的方便。
首先,创建云函数pay,其内容如下:
const config = {
appid: 'wx111111111111111', //小程序Appid
envName: 'zf-shcud', // 小程序云开发环境ID
mchid: '1511111111', //商户号
partnerKey: '11111111111111111111111111111111', //此处填商户密钥
notify_url: 'https://mp.weixin.qq.com', //支付回调网址,这里可以随意填一个网址
spbill_create_ip: '127.0.0.1'
};
const cloud = require('wx-server-sdk');
cloud.init({
env: config.envName
})
const db = cloud.database();
const TcbRouter = require('tcb-router'); //云函数路由
const rq = require('request');
const tenpay = require('tenpay');//支付核心模块
exports.main = async (event, context) => {
const app = new TcbRouter({
event
});
//支付回调
app.router('pay', async (ctx) => {
const wxContext = cloud.getWXContext();
// 在云函数参数中,提取商品 ID
const goodId = event.goodId;
// 根据商品的数据库_id将其它数据提取出来
let goods = await db.collection('publish').doc(goodId).get();
// 在云函数中提取数据,包括名称、价格才更合理安全,
// 因为从端里传过来的商品数据都是不可靠的
let good=goods.data;
const curTime = Date.now();
const api = tenpay.init(config)
let result = await api.getPayParams({
//商户订单号,我这里是定义的book+商品发布时间+当前时间戳
//微信这里限制订单号一次性不能重复,只需要唯一即可
out_trade_no: 'book'+good.creat + '' + curTime,
body: good.bookinfo.title, //商品名称,我设置的书名
total_fee: parseInt(good.price), //金额,注意是数字,不是字符串
openid: wxContext.OPENID //***用户的openid
});
ctx.body = result;//返回前端结果
});
//修改订单状态,以下是支付成功后的其余操作,与配置支付无关
app.router('change', async (ctx) => {
try {
return await db.collection('publish').doc(event._id).update({
data: {
status:1 ////0在售;1买家已付款,但卖家未发货;2买家确认收获,交易完成;3、交易作废,退还买家钱款
}
})
} catch (e) {
console.error(e)
}
});
return app.serve();
}
注意安装依赖;
前端代码
//支付提交
paypost() {
let that = this;
wx.showLoading({
title: '正在下单',
});
// 利用云开发接口,调用云函数发起订单
wx.cloud.callFunction({
name: 'pay',
data: {
$url: "pay", //云函数路由参数
goodId: that.data.publishinfo._id
},
success: res => {
wx.hideLoading();
that.pay(res.result)
},
fail(e) {
wx.hideLoading();
wx.showToast({
title: '支付失败,请及时反馈或稍后再试',
icon:'none'
})
}
});
},
//实现小程序支付
pay(payData) {
let that = this;
//官方标准的支付方法
wx.requestPayment({
timeStamp: payData.timeStamp,
nonceStr: payData.nonceStr,
package: payData.package,
signType: 'MD5',
paySign: payData.paySign,
success(res) {
console.log("支付成功", res)
},
})
}
这就是完整的云开发支付了,完整的dome,请敬请期待二手书小程序的上线,到时我会上传到我的Github,地址:
https://github.com/xuhuai66