const app = getApp(); const loginApi = require('../../../utils/loginApi.js'); const cartUtils = require('../../../utils/cartUtils.js'); const cartNum = require('../../../utils/cartNum.js'); const cartOrder = require('../../../utils/cartOrder.js'); const card = require('../../../utils/card.js'); const des = require('../../../utils/des.js'); const md5 = require('../../../utils/md5.js'); Page({ /** * 页面的初始数据 */ data: { hide: true, showPayPwdInput: false, //是否展示密码输入层 pwdVal: '', //输入的密码 payFocus: true, //文本框焦点 cartHeight: 0, ip: "123.12.12.123", taktTime: 2000, // 查询间隔时间(毫秒) executeCount: 30, // 查询次数 repeadCount: 2, // 重查次数 iPhoneX: wx.getStorageSync("model"), addressInfo: {}, // 收货地址信息 address: "选择收货地址", // showCart: false, // 是否展示购物车数据 cartList: [], // 购物车商品 cartTotal: {}, // 购物车汇总 boxFee: 0.00, // 餐盒费 deliverFee: 0.00, // 配送费 mobileFocus: false, mobileStatus: false, mobile: wx.getStorageSync("vipMobile"), description: "", dinewayIndex: 0, // 就餐方式index dinewayList: [], paywayIndex: 0, // 支付方式index paywayList: [{ name: "会员卡支付", sign: "02", color: "#000", icon: "icon-huiyuanqia" }, { name: "微信支付", sign: "05", color: "green", icon: "icon-weixinzhifu6" } ], store: {}, memberInfo: {}, payOrder: {}, }, /** * 生命周期函数--监听页面加载 */ onLoad: function(options) { var that = this; this.data.dinewayIndex = app.busMode var store = wx.getStorageSync("store"); console.log(store); if (store.storeBusModes) { var busArr = store.storeBusModes.split(','); for (var i = 0; i < busArr.length; i++) { that.data.dinewayList.push(cartUtils.getStoreBusMode(i)); } } that.setData({ store: store, takeMethod: that.data.dinewayIndex, dinewayList: that.data.dinewayList }); // 初始化购物车utils cartNum.init(app, cartUtils); // 获取页面信息 wx.getSystemInfo({ success: function(res) { var cartHeight = res.windowHeight * 0.7; that.setData({ cartHeight: cartHeight }); } }); }, /** * 刷新地址 */ updateDisSelectAddress: function(message) { var tempAddress = JSON.parse(message); this.data.addressInfo = tempAddress; var address = ""; if (tempAddress.receiveAddress.length > 0) { address = address + tempAddress.receiveAddress; } if (tempAddress.name.length > 0) { address = address + " " + tempAddress.name; } if (tempAddress.receiveMobile.length > 0) { address = address + " " + tempAddress.receiveMobile; } this.setData({ address: address }) }, /*** * 支付 */ bindGopay: function() { var that = this; that.setData({ pwdVal: "", }) var payType = this.data.paywayList[this.data.paywayIndex]; var sign = payType.sign; if (sign == "02") { // 会员支付 if (this.data.mobile == "") { app.msg.showMsg("提示", "请您先获取手机号"); return; } var order = cartUtils.getStoreCartMap(); var totalMemberCash = order.totalMemberCash; var cardAmcount = app.cardInfo.availableAmount; if (totalMemberCash <= cardAmcount) { that.createOrderInfo(); } else { wx.showModal({ title: '提示', content: '会员卡余额不足,请充值', showCancel: true, success: function(res) { if (res.confirm) { wx.navigateTo({ url: '../../card/recharge', }) } }, }) } } else { // 微信支付 this.createOrderInfo(); } }, // 创建订单 createOrderInfo: function() { var that = this; var store = cartUtils.getStore(); if (undefined == store) { app.msg.showMsg("提示", "门店信息不存在"); return; } var order = cartUtils.getStoreCartMap(); if (undefined == order || undefined == order.dishes || order.dishes.length == 0) { wx.showModal({ title: "提示", content: "购物车没有商品,快去选购商品吧", success: function(res) { if (res.confirm) { wx.navigateBack({ }); } } }); return; } // 组装订单数据 order = that.processOrder(order, store); // 校验订单参数 var result = that.checkOrder(order); if (!result.flag) { if (result.msg != "") { wx.showModal({ title: '提示', showCancel: false, content: result.msg, success: function(res) { if (res.confirm) { if(result.url){ wx.navigateTo({ url: result.url, }); } if (app.utils.isNotBlank(result.sign)) { that.setData({ mobileFocus: true }); } } } }) } return; } var params = { "method": "liteappdc.order.create", "storeId": store.id, "wid": app.wid, "userId": app.userId, "openId": app.openId, "orderInfoJson": encodeURIComponent(JSON.stringify(order)) } var ignores = []; ignores.push("wid"); ignores.push("userId"); ignores.push("openId"); ignores.push("orderInfoJson"); app.jsapi.api(app.globalData.appKey, app.globalData.appSecret, app.globalData.serverUrl).ajax(params, ignores, function(json) { wx.hideLoading(); var result = json.data; if (result.status == 1) { var tOrder = result.data.order; that.data.payOrder = tOrder; var payMap = that.data.paywayList[that.data.paywayIndex]; var sign = payMap.sign; if (sign == "02") { if (order.totalMemberCash == parseFloat(tOrder.receiveAmount).toFixed(2)) { var cardInfo = app.cardInfo; var isNoPwd = cardInfo.isNoPwd; // 是否免密 var npAmount = cardInfo.npAmount; // 免密金额 var receiveAmount = tOrder.receiveAmount; // 付款金额 if (isNoPwd == 0) { // 不免密 that.showInputLayer(); } else { if (receiveAmount > npAmount) { that.showInputLayer(); // 不免密 } else { that.cardPay(); } } } else { app.msg.showMsg("提示", "下单失败请重试"); } } else { // 微信统一下单 if (order.totalCash == parseFloat(tOrder.receiveAmount).toFixed(2)) { that.unifiedorder(tOrder.receiveAmount, tOrder.orderNo, tOrder.outTradeNo, store.id); } else { app.msg.showMsg("提示", "下单失败请重试"); } } } else { app.msg.showMsg("提示", result.message); } }, function(error) { app.msg.showMsg("提示", "网络中断,获取门店失败"); } ); }, /** * 会员卡支付 */ cardPay: function() { var that = this; var store = cartUtils.getStore(); var subject = this.data.store.name; var totalAmount = card.cardMoney(this.data.payOrder.amount); var realAmount = card.cardMoney(this.data.payOrder.receiveAmount); var payCardAmount = card.cardMoney(this.data.payOrder.receiveAmount); var discountAmount = card.cardMoney(this.data.payOrder.discountAmount); var params = { 'subject': subject, 'body': '微信小程序点餐消费', "mobile": this.data.mobile, "totalAmount": totalAmount, "realAmount": realAmount, "payCardAmount": payCardAmount, "discountAmount": discountAmount, // "couponTotalAmount":0, 'payMode': "02", 'shopNo': store.no, 'posNo': store.posNo, "workerNo": store.workerNo } params.tradeNo = card.getTradeNo(); // 订单单号 var cardInfo = app.cardInfo; var pays = card.getPays(realAmount); var isNoPwd = 0; var passwd = ""; if (that.data.pwdVal) { // 非免密支付 isNoPwd = 0; passwd = des.stringToHexForDES(that.data.pwdVal); } else { var content = params.tradeNo + realAmount; isNoPwd = 1; passwd = md5.md5(content); } var cardPayInfo = { "cardNo": cardInfo.cardNo, "amount": realAmount, "isNoPwd": isNoPwd, "passwd": passwd } params.cardPayInfo = JSON.stringify(cardPayInfo); var date = new Date(); var saleDate = app.utils.getFormatTime(date, 1); params.batchNo = '01'; params.serialNo = '01'; params.saleDate = saleDate; params.pointFlag = 2; params.pointValue = 0; params.pointAmount = realAmount; params.sourceSign = app.sourceSign; params.method = 'jw.mobile.trade.pay'; var ignores = ['batchNo', 'serialNo', 'subject', 'body', 'cardPayInfo', 'pays', 'coupons']; that.setData({ hide: false, msg: "处理中..." }); console.log(params); app.jsapi.memberApi(app.globalData.appMemberKey, app.globalData.appMemberSecret, app.globalData.serverMemberUrl).ajax(params, ignores, function(json) { console.log("会员卡支付", json); var result = json.data; if (result.status == 1) { // var data = result.data; var storeId = that.data.store.id; var tradeVoucherNo = data.tradeVoucherNo; var tradeNo = that.data.payOrder.outTradeNo; that.uploadOrder(storeId, tradeVoucherNo, tradeNo); } else { that.setData({ hide: true, msg: "处理中..." }); wx.showModal({ title: "提示", content: result.errMessage, showCancel: false }); } }, function(error) { that.setData({ hide: true, msg: "处理中..." }); wx.showModal({ title: "提示", content: "网络连接失败", showCancel: false }); } ); }, /** * 微信支付——统一下单 */ unifiedorder: function(amount, orderNo, tradeNo, storeId) { var that = this; var appid = app.globalData.appid; var openId = app.openId; var params = { "method": "liteappdc.pay.unifiedorder", "storeId": storeId, "operatorType": "custom", "sourceSign": app.globalData.sourceSign, "amount": amount, "workerNo": "", "posNo": "", "appid": appid, "openId": openId, "ip": that.data.ip, "orderNo": orderNo, "tradeNo": tradeNo, } // 忽略签名参数 var ignores = []; ignores.push("operatorType"); ignores.push("sourceSign"); ignores.push("accountId"); ignores.push("amount"); ignores.push("workerNo"); ignores.push("posNo"); ignores.push("appid"); ignores.push("openId"); ignores.push("ip"); ignores.push("orderNo"); ignores.push("tradeNo"); wx.showLoading({ title: '支付中...', }); app.jsapi.api(app.globalData.appKey, app.globalData.appSecret, app.globalData.serverUrl).ajax(params, ignores, function(json) { wx.hideLoading(); var result = json.data; if (result.status == 1) { // 拉起小程序支付 that.payRequest(result.data, amount, tradeNo); // 统一下单成功 启动定时器查询支付结果 that.timerQeuryPayResult(storeId, appid, orderNo, tradeNo, amount); } else { app.msg.showMsg("提示", result.message); } }, function(error) { wx.hideLoading(); app.msg.showMsg("提示", "网络中断,操作失败"); } ); }, /** * 拉起微信支付 */ payRequest: function(param, amount, tradeNo) { var that = this; wx.requestPayment({ 'timeStamp': param.timeStamp, 'nonceStr': param.nonceStr, 'package': param.package, 'signType': param.signType, 'paySign': param.paySign, complete: function(res) { if (res.errMsg != "requestPayment:ok") { wx.showModal({ title: '提示', content: '支付遇到了错误或者您主动放弃了支付', showCancel: false }); // 支付失败 关闭定时器 if (that.data.interval) { clearInterval(that.data.interval); } that.setData({ executeCount: 30 }); } } }) }, /** * 定时器-查询支付结果 * 查询一分钟 30次 */ timerQeuryPayResult: function(storeId, appid, orderNo, tradeNo, amount) { var that = this; var executeCount = that.data.executeCount; var interval = that.data.interval; interval = setInterval(function() { executeCount = that.data.executeCount; if (executeCount < 0) { // 查询次数用完 关闭并重置定时器 clearInterval(interval); that.setData({ executeCount: 30 }); // 再此发起查询 var repeadCount = that.data.repeadCount; if (repeadCount > 0) { wx.showModal({ title: '提示', content: '未查询到微信支付成功信息,是否再查询一次', confirmText: "再查一次", success: function() { repeadCount = that.data.repeadCount - 1; that.setData({ repeadCount: repeadCount }); } }); } else { app.utils.alertErrorMsg("提示", "支付失败,请联系管理员"); } } else { executeCount -= 1; that.setData({ executeCount: executeCount }); // 查询微信支付结果 that.queryPayResult(storeId, appid, orderNo, tradeNo); } }, that.data.taktTime) //循环时间 这里是1秒 that.setData({ interval: interval }); }, /** * 查询支付结果 */ queryPayResult: function(storeId, appid, orderNo, tradeNo) { var that = this; var params = { "method": "liteAppdc.pay.orderquery", "storeId": storeId, "appid": appid, "tradeNo": tradeNo } // 忽略签名参数 var ignores = []; ignores.push("appid"); ignores.push("tradeNo"); app.jsapi.api(app.globalData.appKey, app.globalData.appSecret, app.globalData.serverUrl).ajax(params, ignores, function(json) { var result = json.data; if (result.status == 1) { var payResult = result.data; // 支付成功 if (payResult.status == 1) { // 关闭定时器,重置查询次数 clearInterval(that.data.interval); that.setData({ executeCount: 30 }); /*** 通过微信异步通知来上传订单 这里不再主动发起上传 ***/ var prepayId = payResult.prepayId; // 支付成功-上传订单 that.uploadOrder(storeId, prepayId, tradeNo); } } else { console.log("查询订单支付结果异常:" + payResult.message); } }, function(error) { clearInterval(that.data.interval); that.setData({ executeCount: 30 }); wx.showModal({ title: '提示', content: "网络中断,操作失败" }); } ); }, /** * 上传订单 */ uploadOrder: function(storeId, prepayId, tradeNo) { var that = this; var params = { "method": "liteAppdc.salesOrder.create", "storeId": storeId, "prepayId": prepayId, "tradeNo": tradeNo } // 不签名参数 var ignores = []; ignores.push("prepayId"); ignores.push("tradeNo"); app.jsapi.api(app.globalData.appKey, app.globalData.appSecret, app.globalData.serverUrl).ajax(params, ignores, function(json) { that.setData({ hide: true, msg: "处理中..." }); var result = json.data; if (result.status == 1) { // 清除购物车商品 cartUtils.clearStoreCartMap(); // // 跳转到订单详情 // wx.redirectTo({ // url: '../detail/detail?orderNo=' + orderNo + "&storeId=" + storeId, // }); // 跳转到订单详情 wx.redirectTo({ url: '../detail/detail?orderNo=' + result.data.orderNo + "&storeId=" + result.data.storeId, }); } else { app.msg.showMsg("提示", "订单信息异常,请取消下单。"); } }, function(error) { that.setData({ hide: true, msg: "处理中..." }); app.msg.showMsg("提示", "网络中断,获取品类失败"); } ); }, // 校验订单信息 checkOrder: function(order) { var that = this; var flag = true; var sign = ""; var msg = ""; // 支付方式 if (app.utils.isBlank(order.paymode)) { flag = false; msg = "请选择支付方式"; return { flag: flag, msg: msg }; } // 就餐方式 if (app.utils.isBlank(order.busMode)) { flag = false; msg = "请选择就餐方式"; return { flag: flag, msg: msg }; } // 如果是堂食,桌号不能为空 if (order.busMode == 0) { if (undefined == order.tableNo || order.tableNo.length == 0) { // 打开桌号列表 flag = false; msg = ""; that.bindGoTables(); return { flag: flag, msg: msg }; } } // 校验手机号 if (app.utils.isBlank(order.mobile)) { flag = false; sign: "mobile"; msg = "请输入手机号码以便为您提供更好的服务 "; return { flag: flag, sign: sign, msg: msg }; } if (order.busMode == 2) { if (order.receiveAddress.length == 0) { flag = false; return { url:'../address/address', flag: flag, sign: "提示", msg: "请选择收货地址, 以便及时给您送餐", }; } } // 校验user信息 if (app.utils.isBlank(order.memberId)) { flag = false; msg = "未能获取用户信息"; return { flag: flag, msg: msg }; } return { flag: flag, msg: msg }; }, // 组装订单数据 processOrder: function(order, store) { var that = this; order.storeId = store.id; order.storeNo = store.no; order.storeName = store.name; order.posNo = store.posNo; order.workerNo = store.workerNo; // 支付方式 05:微信支付 02:会员卡支付 var paywayIndex = that.data.paywayIndex; var paywayList = that.data.paywayList; var payway = paywayList[paywayIndex]; order.paymode = payway.sign; // 就餐方式 0:堂食 1:外带 2:外卖 var dinewayIndex = that.data.dinewayIndex; var dinewayList = that.data.dinewayList; var dineway = dinewayList[dinewayIndex]; if(dineway.sign == undefined){ dineway.sign = 0; } order.busMode = dineway.sign; order.takeMethod = ""; order.takeTime = ""; order.address = ""; /* 桌号 */ if (order.busMode != 2) { order.tableId = app.table.tableId; order.tableNo = app.table.tableNo; order.tableName = app.table.tableName; } else { order.tableId = ""; order.tableNo = ""; order.tableName = ""; } order.mobile = undefined == that.data.mobile ? "" : that.data.mobile; order.cardNo = ""; // 会员卡号 order.memberId = app.userId; order.description = that.data.description; var receiveName = ""; var receiveMobile = ""; var receiveAddress = ""; var boxFee = 0.00; var distributionFee = 0.00; if (dinewayIndex == 1) { // 外带 boxFee = that.data.boxFee; } else if (dinewayIndex == 2) { // 外卖 if (that.data.addressInfo.receiveMobile) { receiveName = that.data.addressInfo.name; receiveMobile = that.data.addressInfo.receiveMobile; receiveAddress = that.data.addressInfo.receiveAddress; } boxFee = that.data.boxFee; distributionFee = that.data.deliverFee; } order.receiveName = receiveName; order.receiveMobile = receiveMobile; order.receiveAddress = receiveAddress; order.boxFee = boxFee; order.distributionFee = distributionFee; // 重新计算商品的总价和会员价 cartOrder.getTotal(order); return order; }, /** * 刷新商品数量和购物车信息 */ refreshCartData: function() { var cartTotal = cartUtils.getCartTotal(); var cartList = cartUtils.getDishListByCart(); if (cartList.length == 0) { this.setData({ showCart: false }); } this.setData({ cartTotal: cartTotal, cartList: cartList }); // 计算额外的费用 this.getExtraCost(); }, /** * 修改购物车商品数量 */ bindChangeNum: function(e) { var that = this; var sign = e.currentTarget.dataset.sign; var uniqueId = e.currentTarget.dataset.uniqueid; switch (sign) { case "2": cartNum.addNumberByCart(uniqueId); break; case "3": cartNum.decNumberByCart(uniqueId); break; default: console.log("error"); break; } //更新购物车 that.refreshCartData(); }, /** * 打开/关闭购物车 */ showCartList: function(e) { // 获取购物车商品列表 var dishList = cartUtils.getDishListByCart(); this.setData({ cartList: dishList }); if (this.data.cartList.length > 0) { this.setData({ showCart: !this.data.showCart }); } }, /** * 选择就餐方式 */ binddineway: function(e) { var index = e.currentTarget.dataset.index; this.setData({ dinewayIndex: index, takeMethod: index, }); this.getExtraCost(); }, /** * 计算额外的费用 */ getExtraCost: function() { var index = this.data.dinewayIndex; var order = cartUtils.getStoreCartMap(); this.data.boxFee = cartOrder.getBoxFee(order); this.data.deliverFee = cartOrder.getDeliverFee(this.data.store); var extraCost = ""; if (index == 1) { // 外带 extraCost = "餐盒费:¥ " + this.data.boxFee; } else if (index == 2) { // 外卖 extraCost = "餐盒费:" + this.data.boxFee + " + " + "配送费:" + this.data.deliverFee; } this.setData({ dinewayIndex: index, takeMethod: index, extraCost: extraCost, }); }, /** * 选择支付方式 */ bindpayway: function(e) { var index = e.currentTarget.dataset.index; this.setData({ paywayIndex: index }); }, /** * 选择桌号 */ bindGoTables: function() { var erpStoreId = this.data.store.storeId; var tableId = app.table.tableId; var tableNo = app.table.tableNo; wx.navigateTo({ url: '../table/table?erpStoreId=' + erpStoreId + "&tableId=" + tableId + "&tableNo=" + tableNo, }) }, /** * 手机号 */ inputMobile: function(e) { var value = e.detail.value; this.setData({ mobile: value }); return value; }, /** * 选择送餐地址 */ selectSendAddress: function() { wx.navigateTo({ url: '../address/address', }) }, /** * 备注 */ inputDescription: function(e) { var value = e.detail.value; this.setData({ description: value }); return value; }, /** * 获取手机号 */ getPhoneNumber: function(e) { var that = this; if (e.detail.errMsg == 'getPhoneNumber:ok') { var iv = e.detail.iv; var encryptedData = e.detail.encryptedData; card.wx_getPhoneNumber(iv, encryptedData, function(json) { var result = json.data; if (result.status == '1') { var data = result.data.data; var purePhoneNumber = data.purePhoneNumber; //没有区号的手机号 var phoneNumber = data.phoneNumber; // 用户绑定的手机号(国外手机号会有区号) var countryCode = data.countryCode; //区号 that.setData({ mobile: purePhoneNumber, mobileStatus: true }); wx.hideLoading(); wx.setStorageSync("mobile", purePhoneNumber); that.updateUserMobile(purePhoneNumber); } }, function(err) { }); } }, /** * 更改/记录用户的手机号 */ updateUserMobile: function(purePhoneNumber) { wx.request({ url: app.globalData.serverUrlExtend, method: "POST", header: { 'content-type': 'application/x-www-form-urlencoded' }, data: { "type": "wxdcedituser", "tenantId": app.tenantId, "wid": app.wid, "userId": app.userId, "mobile": purePhoneNumber, }, complete: function(res) { console.log("更改用户手机号码result:"); } }) }, /** * 生命周期函数--监听页面显示 */ onShow: function() { var that = this; // 刷新购物车商品列表 that.refreshCartData(); // 获取ip wx.request({ url: 'http://ip-api.com/json', success: function(e) { var ip = e.data.query; ip = app.utils.isNotBlank(ip) ? ip : "123.12.12.123"; that.setData({ ip: ip }); } }); this.setData({ table: app.table }); }, /** * 显示支付密码输入层 */ showInputLayer: function() { this.setData({ showPayPwdInput: true, payFocus: true }); }, /** * 隐藏支付密码输入层 */ hidePayLayer: function() { var val = this.data.pwdVal; this.setData({ showPayPwdInput: false, payFocus: false, pwdVal: val }); // 会员创建订单 if (val) { this.cardPay(); } }, /** * 获取焦点 */ getFocus: function() { this.setData({ payFocus: true }); }, /** * 输入密码监听 */ inputPwd: function(e) { this.setData({ pwdVal: e.detail.value }); if (e.detail.value.length >= 6) { this.hidePayLayer(); } } })