123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339 |
- /**
- * 支付数据管理
- */
- 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;
|