// 必须传入price,show tradeNo // bind:payResult 返回支付状态 const CONFIG = require("../../config.js"); const Parse = getApp().Parse; const company = getApp().globalData.company; Component({ behaviors: [], properties: { show: { type: Boolean, value: false, }, //支付价格 *必填 price: { type: Number, value: 0, }, //订单id Order表创建后id orderId: { type: String, }, //支付类型 orderType: { type: String, value: 'shopgoods' }, //订单编号 *必填 tradeNo: { type: String, }, //显示公益金支付 Profile — bonus字段 showBonus: { type: Boolean, value: false }, //显示支付类型 showType: { type: String, value: 'all' }, profileId: { type: String } }, data: { radio: "wxpay", isPay: false, balanceTitle:CONFIG.default.payBalanceTitle || '余额' }, lifetimes: { created() { }, attached() {}, moved() {}, detached() {}, }, pageLifetimes: { show: async function () { // 页面显示 }, hide: function () { // 页面被隐藏 this.setData({ show: false, }); }, resize: function (size) { // 页面尺寸变化 }, }, methods: { onChange(event) { console.log(event) this.setData({ radio: event.detail, }); console.log(this.data.radio); }, onClickHide() { this.setData({ show: false }); this.payResult("Cancel the payment", undefined); }, /* 支付结果返回父组件 */ payResult(state, no) { let { radio } = this.data this.triggerEvent("payResult", { params: state, no: no, type: radio }); }, pay() { if (this.data.isPay) { wx.showToast({ title: '你已支付,请勿重复提交', icon: "none" }) return } let payType = this.data.radio; switch (payType) { case "wxpay": console.log(this.properties.tradeNo) this.wxPay(); break; case "balance": this.balance(); break; case "bonus": this.bonusPay(); break; case "offline": break; } }, async wxPay() { let that = this; let Account = new Parse.Query("Account"); Account.equalTo("user", Parse.User.current().id); Account.equalTo("company", company); let account = await Account.first(); let AccountLog = Parse.Object.extend("AccountLog"); let accountLog = new AccountLog(); accountLog.set("assetType", "wxPay"); accountLog.set("payType", "wxpay-wxapp"); accountLog.set("assetCount", this.data.price); accountLog.set("desc", "微信支付"); accountLog.set("orderType", this.data.orderType + "-wxpay"); accountLog.set("orderNumber", this.properties.tradeNo); if (this.properties.orderId) accountLog.set("orderId", this.properties.orderId) accountLog.set("isVerified", false); accountLog.set("targetName", "system"); if (account) { accountLog.set("fromAccount", account.toPointer()); } accountLog.set("fromName", Parse.User.current().get("nickname")); accountLog.set("company", { __type: "Pointer", className: "Company", objectId: company, }); let appId = getApp().globalData.appid; let openId = wx.getStorageSync("userInfo").openid; if(!openId && Parse.User.current().get("wxapp")){ openId = Parse.User.current().get("wxapp")?.[appId]?.openid } let goodsTotalPrice = this.data.price; console.log(goodsTotalPrice) if(goodsTotalPrice == 0){ this.updateLog(accountLog) return } wx.request({ method: "POST", url: "https://server.fmode.cn/api/wxpay/neworder", data: { appid: appId, openid: openId, out_trade_no: that.properties.tradeNo, total_fee: goodsTotalPrice, company: company }, success: (payres) => { console.log("Pay Params"); console.log(payres); let payinfo = payres.data; wx.requestPayment({ appId: appId, timeStamp: payinfo.timeStamp, nonceStr: payinfo.nonceStr, package: payinfo.package, signType: "MD5", paySign: payinfo.paySign, async success(data) { that.updateLog(accountLog) wx.showToast({ title: "支付成功", icon: "success", duration: 1500, }); that.setData({ show: false }) }, fail(err) { that.payResult(err, that.properties.tradeNo); wx.showToast({ title: "支付失败", icon: "error", duration: 1500, }); }, complete:(data) => { console.log(111,data) } }); }, fail: (err) => { wx.showToast({ title: "支付失败", icon: "error", duration: 1500, }); return false; }, }); }, //支付成功更新log async updateLog(accountLog){ this.payResult("ok", this.properties.tradeNo); accountLog.set("isVerified", true); await accountLog.save() }, async sendOrder(tradeNo) { let that = this; let DramaOrderLog = Parse.Object.extend("UserAgentOrder"); let current = Parse.User.current(); let dramaOrderLog = new DramaOrderLog(); dramaOrderLog.set("user", { __type: "Pointer", className: "_User", objectId: current.id, }); dramaOrderLog.set("orderId", tradeNo); dramaOrderLog.set("company", { __type: "Pointer", className: "Company", objectId: getApp().globalData.company, }); await dramaOrderLog.save(); }, async balance() { let { balanceTitle } = this.data let _this = this; try { let price = this.data.price let Account = new Parse.Query("Account"); Account.equalTo("user", Parse.User.current().id); Account.equalTo("company", company); let account = await Account.first(); console.log(account); if (!account.get("balance") || price > account.get("balance")) { wx.showToast({ title: `${balanceTitle == '积分' ? '积分不足' : '余额不足,请充值'}`, icon: "none" }) return } let AccountLog = Parse.Object.extend("AccountLog"); let accountLog = new AccountLog(); accountLog.set("assetType", "balance"); accountLog.set("payType", "balance"); accountLog.set("assetCount", this.data.price); accountLog.set("desc", `${balanceTitle}支付`); accountLog.set("orderType", this.data.orderType + "-balance"); accountLog.set("orderNumber", this.properties.tradeNo); if (this.properties.orderId) accountLog.set("orderId", this.properties.orderId) accountLog.set("isVerified", false); accountLog.set("targetName", "system"); if (account) { accountLog.set("fromAccount", account.toPointer()); } accountLog.set("fromName", Parse.User.current().get("nickname")); accountLog.set("company", { __type: "Pointer", className: "Company", objectId: company, }); accountLog.save() .then((res) => { res.set("isVerified", true); res.save().then((result) => { console.log(result) wx.showToast({ title: "支付成功", icon: "success", duration: 1500, }); _this.payResult("ok", this.properties.tradeNo); }) }) } catch (error) { console.log(error) wx.showToast({ title: "支付失败", icon: "error", duration: 1500, }); _this.payResult(error); } this.setData({ isPay: true }) }, //公益金支付 async bonusPay() { let _this = this; let { profileId } = this.data try { let data = await this.customSQL() console.log(data); if (data.code == 200) { let Account = new Parse.Query("Account"); Account.equalTo("user", Parse.User.current().id); Account.equalTo("company", company); let account = await Account.first(); let AccountLog = Parse.Object.extend("AccountLog"); let accountLog = new AccountLog(); accountLog.set("assetType", "bonus"); accountLog.set("payType", "bonus"); accountLog.set("assetCount", this.data.price); accountLog.set("desc", "公益金支付"); accountLog.set("orderType", this.data.orderType + "-bonus"); accountLog.set("orderNumber", this.properties.tradeNo); if (this.properties.orderId) accountLog.set("orderId", this.properties.orderId) accountLog.set("isVerified", true); accountLog.set("targetName", "system"); if (!profileId && account) { accountLog.set("fromAccount", account.toPointer()); } accountLog.set("fromName", Parse.User.current().get("nickname")); accountLog.set("company", { __type: "Pointer", className: "Company", objectId: company, }); await accountLog.save() wx.showToast({ title: data.msg, icon: 'none', image: '', duration: 1500, mask: false, }); _this.payResult("ok", this.properties.tradeNo); }else{ wx.showToast({ title: data.msg, icon: 'none', image: '', duration: 1500, mask: false, }); } } catch (err) { console.log(err) wx.showToast({ title: "支付失败", icon: "error", duration: 1500, }); _this.payResult(error); } }, async customSQL() { let price = this.data.price let { profileId } = this.data let promise = await new Promise((resolve, rej) => { wx.request({ url: "https://server.fmode.cn/api/food/bonus", data: { pid: profileId, price: price, company: company }, method: "POST", success(data) { console.log(data); resolve(data.data) }, fail(err) { rej(err); }, }); }); return promise; }, }, observers: { show: function (show) { console.log(show) } } });