/** * 支付数据管理 */ let PayMgr = { _orderList: [], // 订单列表 _pollingOrderList: [], // 轮询订单列表 _didConfirmedOrders: [], // 已有结果订单列表 init () { if (CC_EDITOR) { return; } this._initPublishListener(); }, /** * 初始化服务器请求事件侦听 * */ _initPublishListener () { cc.game.on('on_shop_order', this._onPublishPayResult, this); }, /** * 对比订单, 支付流程越前面的优先级越高 * * @param {Object} orderDataA * @param {Object} orderDataB * @returns */ orderCompare (orderDataA, orderDataB) { let statusA = orderDataA.status; let statusB = orderDataB.status; let map = { [JMC.ORDER_STATUS.PAY_FAILED]: 1, [JMC.ORDER_STATUS.PAY_SUCCEEDED]: 1, [JMC.ORDER_STATUS.SUBMIT_ORDER_SUCCEEDED]: 2, [JMC.ORDER_STATUS.SUBMIT_ORDER_FAILED]: 2, [JMC.ORDER_STATUS.SUBMIT_ORDER_UNKOWN]: 2, [JMC.ORDER_STATUS.CALL_PAY_SUCCEEDED]: 3, [JMC.ORDER_STATUS.CALL_PAY_FAILED]: 3 }; let a = map[statusA]; let b = map[statusB]; return a > b; }, /** * 获取合适的订单 * * @param {number} orderId * @returns {Object} */ getProperOrderData (orderId) { if (!G.FuncUtils.isString(orderId)) { return undefined; } let defaultOrderData = undefined; let orderList = this._orderList; if (!orderList || orderList.length == 0) { return undefined; } `` for (let orderData of orderList) { if (orderData.orderId == orderId) { if (!defaultOrderData) { defaultOrderData = orderData; } // 如果有更合适订单,就换成更合适的订单 else { let isBetter = this.orderCompare(orderData, defaultOrderData); if (isBetter) { defaultOrderData = orderData; } } } } return defaultOrderData; }, /** * 设置某gid的订单是否需要确认 * * @param {number} gid * @param {boolean} isDidConfirmed */ setDidConfirmedOrderByGoodsId (gid, isDidConfirmed) { this._didConfirmedOrders[gid] = isDidConfirmed; }, /** * 新增订单信息 * * @param {Object} orderData */ addOrderData (orderData) { this._orderList.push(orderData); }, /** * 更新订单 * * @param {Object} newOrderData */ updateOrderData (newOrderData) { let orderData = this.getProperOrderData(newOrderData.orderId); let hasUpdateStatus = false; if (orderData) { let isBetter = this.orderCompare(orderData, newOrderData); if (isBetter) { hasUpdateStatus = true; } } else { this.addOrderData(newOrderData); orderData = newOrderData; hasUpdateStatus = true; } if (hasUpdateStatus) { for (let [key, value] of Object.entries(newOrderData)) { if (value !== undefined) { orderData[key] = value; } } let gid = orderData.gid; goods = G.CfgMgr.goodsConfig.getByMainKey(gid); if (!goods) { return; } let newStatus = orderData.status; if (newStatus == JMC.ORDER_STATUS.PAY_SUCCEEDED || newStatus == JMC.ORDER_STATUS.PAY_FAILED) { this.setDidConfirmedOrderByGoodsId(gid, false); if (newStatus == JMC.ORDER_STATUS.PAY_SUCCEEDED) { this.didPaySuccussful(orderData); } else { this.didPayFailed(orderData); } } } return orderData; }, /** * 支付成功的数据处理 * * @param {Object} orderData */ didPaySuccussful (orderData) { cc.game.emit('e_nwk_on_shop_order', orderData); }, didPayFailed (orderData) { cc.game.emit('e_nwk_on_shop_order', orderData); }, payGoods(gid, isTest) { let goodsConfig = G.CfgMgr.goodsConfig.getByMainKey(gid); if (!goodsConfig) return; let timestamp = G.TimeUtils.getCurrentTime(); let uid = G.UserMgr.getUid(); let channel = G.MiddleDevice.getChannelId(); let orderId = cc.js.formatStr('%s_%s_%s_%s', timestamp, channel, uid, gid); if (!isTest) { let payType = 1; let status; let errMsg = ''; let jfid = goodsConfig.jfid; if (!jfid) return; let rmb = goodsConfig.rmb; if (!rmb) return; let ok = G.MiddlePay.pay(payType, uid, gid, jfid, rmb, goodsConfig.name, goodsConfig.name, orderId); if (ok) { status = JMC.ORDER_STATUS.CALL_PAY_SUCCEEDED; } else { status = JMC.ORDER_STATUS.CALL_PAY_FAILED; errMsg = '调起支付异常'; } let orderData = { orderId: orderId, status: status, errorMsg: errMsg, goodsConfig: goodsConfig, amount: rmb, payType: payType }; this.addOrderData(orderData); } else { let payType = 1; let info = { orderId: orderId, payName: 'alipay', status: true, resMsg: '支付成功', amount: goodsConfig.rmb } setTimeout (() => { G.NetworkMgr.sendSocketRequest('test_pay_goods', info, this._responseTestPayGood.bind(this)); }, 0.5); let rmb = goodsConfig.rmb; if (!rmb) return; let errMsg = ''; let orderData = { orderId: orderId, status: JMC.ORDER_STATUS.CALL_PAY_SUCCEEDED, errorMsg: errMsg, goodsConfig: goodsConfig, amount: rmb, payType: payType }; this.addOrderData(orderData); this.didPay(200, errMsg, uid, gid, rmb, payType, orderId); } }, didPay (code, errMsg, uid, gid, price, payType, orderId, errcode) { let status = JMC.ORDER_STATUS.SUBMIT_ORDER_SUCCEEDED; if (!G.FuncUtils.isNumber(code) || code != 200) { G.LogUtils.log('!G.FuncUtils.isNumber(code) || code != 200'); if (code == 202) { status = JMC.ORDER_STATUS.SUBMIT_ORDER_UNKOWN; } else { status = JMC.ORDER_STATUS.SUBMIT_ORDER_FAILED; } } let goodsConfig = G.CfgMgr.goodsConfig.getByMainKey(gid); if (!goodsConfig) return; let orderData = { orderId: orderId, status: status, errorMsg: errMsg, goodsConfig: goodsConfig, amount: price, payType: payType, errcode: errcode }; if (status == JMC.ORDER_STATUS.SUBMIT_ORDER_UNKOWN) { let data = G.FuncUtils.clone(orderData); // 避免updateOrderData修改了订单对象 // 延迟1秒,尽量避免客户端请求的时候,渠道还没回调结果到支付服 setTimeout(() => { // 订单轮询 }, 1000); } this.updateOrderData(orderData); }, // 中间层推送的支付回调 _handlePayResult (eventData) { let code = eventData.code; let errMsg = eventData.errorMsg; let data = eventData.data || {}; let uid = data.uid; let gid = data.gid; let price = data.price; let payType = data.payType; let orderId = data.orderId; let errcode = ''; this.didPay(code, errMsg, uid, gid, price, payType, orderId, errcode); }, //* ************* 客户端请求/响应 开始 ************* *// _responseTestPayGood (data) { cc.warn('_responseTestPayGood', data); let responseInfo = data.responseInfo; if (responseInfo.code != 200) { G.AppUtils.getSceneCtrl().addToast('调试支付失败' + responseInfo.code.toString()); } }, // # 推送商城购买订单结果 // on_shop_order 2300 { // request { // orderInfo 0: DataOrder # 订单数据 // } // } // # 订单信息 // .DataOrder { // status 0: integer # 订单状态, 1表示成功! // orderId 1: string # 订单ID // gid 2: integer # 商品ID // items 3: *DataItem # 商品发放物品列表 // giftItems 4: *DataItem # 赠送发放物品列表 // errMsg 5: string # 失败原因字符串! // payName 6: string # SDK支付名称 比如:cmpay // errCode 7: string # SDK支付方回调错误码, 可能有,可能没有 // amount 8: integer # 实际订单金额,单位分,要转字符串 // } _onPublishPayResult (data) { if (G.OPEN_DEBUG) { G.AppUtils.getSceneCtrl().addToast('订单推送'); } let orderData = data.orderInfo; if (orderData) { let status = orderData.status; if (status != JMC.ORDER_STATUS.PAY_SUCCEEDED) { orderData.status = JMC.ORDER_STATUS.PAY_FAILED; if (!G.FuncUtils.isString(orderData.errorMsg) || orderData.errorMsg.length == 0) { orderData.errorMsg = '支付未成功'; } } this.updateOrderData(orderData); } }, } module.exports = PayMgr;