Selaa lähdekoodia

【修改】修改支付与心跳包

DESKTOP-VHLO35R\Administrator 1 vuosi sitten
vanhempi
commit
e08a5c4643

Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 1233 - 91
assets/resources/edt_prefab/Debug/debug_alert.prefab


Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 1 - 1
assets/resources/res_text/proto/http_c2s.txt


Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 1 - 1
assets/resources/res_text/proto/http_s2c.txt


Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 1 - 1
assets/resources/res_text/proto/socket_c2s.txt


Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 1 - 1
assets/resources/res_text/proto/socket_s2c.txt


+ 7 - 62
assets/script/core/ctrl/ReconnCtrl.js

@@ -127,43 +127,7 @@ cc.Class({
127 127
         let cb = (alert, eventKey, eventData) => {
128 128
             switch (eventKey) {
129 129
                 case 'clickedLeft': {
130
-                    G.AppUtils.loadScene('scene_home');
131
-                    break;
132
-                }
133
-                case 'clickedRight': {
134
-                    this.reconnect(alert);
135
-                    break;
136
-                }
137
-                case 'willShow': {
138
-                    // 兼容代码
139
-                    // 避免出现两个网络异常弹窗
140
-                    G.AppUtils.getSceneCtrl().popAllAlert(true);
141
-                    // ZIndex 设置100避免popAllAlert关闭
142
-                    alert.alertZIndex = 100;
143
-                    break;
144
-                }
145
-                default: {
146
-                    alert.alertDefaultCallback(eventKey, eventData);
147
-                    break;
148
-                }
149
-            }
150
-        };
151
-
152
-        let alertData = {};
153
-        G.AppUtils.getSceneCtrl().showNormalAlert(alertId, alertData, cb);
154
-    },
155
-
156
-    showNetworkAnomalySingle (alertId) {
157
-        if (G.AppUtils.getSceneCtrl().getAlert(alertId)) {
158
-            return;
159
-        }
160
-
161
-        G.AppUtils.getSceneCtrl().popAllAlert();
162
-
163
-        let cb = (alert, eventKey, eventData) => {
164
-            switch (eventKey) {
165
-                case 'clickedLeft': {
166
-                    G.AppUtils.loadScene('scene_room_single');
130
+                    G.AppUtils.loadScene('scene_login');
167 131
                     break;
168 132
                 }
169 133
                 case 'clickedRight': {
@@ -191,11 +155,7 @@ cc.Class({
191 155
 
192 156
     reconnect (alert) {
193 157
         if (G.MiddleDevice.getApnType() == -1) {
194
-            if (G.SingleRoomMgr.isOpen()) {
195
-                G.AppUtils.getSceneCtrl().addToast('当前未连接网络或网络异常,可先去单机挑战一下哦');
196
-            } else {
197
-                G.AppUtils.getSceneCtrl().addToast('当前未连接网络或网络异常');
198
-            }
158
+            G.AppUtils.getSceneCtrl().addToast('当前未连接网络或网络异常');
199 159
             return;
200 160
         }
201 161
 
@@ -209,10 +169,9 @@ cc.Class({
209 169
         } else {
210 170
             if (G.LoginMgr.loginTimestamp) {
211 171
                 // 本次启动登录成功过
212
-                let uid = G.LoginMgr.getStorageValue('uid');
213
-                let password = G.LoginMgr.getStorageValue('password');
214
-                let isGuest = !G.LoginMgr.isAuthSuccess();
215
-                G.LoginMgr.requestLogin(uid, password, isGuest);
172
+                let uid = G.UserMgr.getUid();
173
+                let password = G.LoginMgr.getPassWord();
174
+                G.LoginMgr.requestLogin(uid, password);
216 175
 
217 176
                 // 重连计数
218 177
                 G.LoginMgr.reconnectTimes += 1;
@@ -236,11 +195,7 @@ cc.Class({
236 195
     handleOffline () {
237 196
         if (G.MiddleDevice.getApnType() == -1) {
238 197
             // 无网络需要弹出提示
239
-            if (G.SingleRoomMgr.isOpen()) {
240
-                G.AppUtils.getSceneCtrl().addToast('当前未连接网络或网络异常,可先去单机挑战一下哦');
241
-            } else {
242
-                G.AppUtils.getSceneCtrl().addToast('当前未连接网络或网络异常');
243
-            }
198
+            G.AppUtils.getSceneCtrl().addToast('当前未连接网络或网络异常');
244 199
         } else {
245 200
             if (G.LoginMgr.loginTimestamp) {
246 201
                 // 登录成功过
@@ -267,16 +222,6 @@ cc.Class({
267 222
 
268 223
     // 弹出断线重连弹窗
269 224
     showOfflineAlert () {
270
-        if (G.SingleRoomMgr.isOpen()) {
271
-            // 有单机场
272
-            this.showNetworkAnomalySingle(JMC.ALERT_ID.HOME_NETWORK_ANOMALY);
273
-        } else {
274
-            // 无单机场
275
-            if (G.AppUtils.getSceneCtrl().sceneName == '大厅') {
276
-                this.showNetworkAnomaly(JMC.ALERT_ID.HOME_SCENE_NETWORK_ANOMALY);
277
-            } else {
278
-                this.showNetworkAnomaly(JMC.ALERT_ID.OTHER_SCENE_NETWORK_ANOMALY);
279
-            }
280
-        }
225
+        this.showNetworkAnomaly(JMC.ALERT_ID.HOME_SCENE_NETWORK_ANOMALY);
281 226
     }
282 227
 });

+ 0 - 15
assets/script/core/ctrl/SceneCtrlBase.js

@@ -232,21 +232,6 @@ cc.Class({
232 232
         }
233 233
     },
234 234
 
235
-    // 详见 ToastCtrl 同名函数
236
-    debugToast (msg, holdTime) {
237
-        if (!G.OPEN_DEBUG) {
238
-            return;
239
-        }
240
-
241
-        let isOpen = G.DebugMgr.getValue(JMC.DEBUG_KEY.DEBUG_TOAST);
242
-        if (!isOpen) {
243
-            return;
244
-        }
245
-
246
-        this.addToast(msg, holdTime);
247
-    },
248
-
249
-
250 235
     // ---------------- 私有方法分割线 ----------------
251 236
 
252 237
 

+ 10 - 0
assets/script/core/debug/DebuguAlert.js

@@ -10,6 +10,7 @@ cc.Class({
10 10
     properties: {
11 11
         itemIdEB: cc.EditBox,
12 12
         itemNumEB: cc.EditBox,
13
+        goodsIdEB: cc.EditBox,
13 14
     },
14 15
 
15 16
     onLoad () {
@@ -46,6 +47,15 @@ cc.Class({
46 47
             }
47 48
         ]);
48 49
     },
50
+    
51
+    debuguGoodsBuyOnClicked() {
52
+        if (this.goodsIdEB.string.length == 0) {
53
+            return;
54
+        }
55
+
56
+        let goodid = parseInt(this.goodsIdEB.string);
57
+        G.PayMgr.payGoods(goodid, true);
58
+    },
49 59
 
50 60
     requestAddItems (items) {
51 61
         let uid = G.UserMgr.getUid();

+ 4 - 3
assets/script/core/model/login/LoginMgr.js

@@ -413,10 +413,10 @@ let LoginMgr = {
413 413
              * 4 * 30秒间隔发一次保活请求
414 414
              * 发送保活请求后30秒没返回断开当前连接进行重连
415 415
              */
416
-            if (this.keepaliveTimeoutCount == 4) {
416
+            if (this.keepaliveTimeoutCount == 1) {
417 417
                 // G.LogUtils.log('发送心跳');
418 418
                 this._requestKeepalive();
419
-            } else if (this.keepaliveTimeoutCount == 5) {
419
+            } else if (this.keepaliveTimeoutCount == 2) {
420 420
                 // G.LogUtils.log('心跳不通');
421 421
                 // 清空心跳定时器
422 422
                 clearInterval(this._keepaliveIntervalId);
@@ -436,11 +436,12 @@ let LoginMgr = {
436 436
      * @date 2019-03-26
437 437
      */
438 438
      _requestKeepalive () {
439
-        G.NetworkMgr.sendSocketRequest('h5user_keepalive', undefined, this._responseKeepalive.bind(this));
439
+        G.NetworkMgr.sendSocketRequest('user_keepalive', undefined, this._responseKeepalive.bind(this));
440 440
     },
441 441
     _responseKeepalive (data) {
442 442
         let responseInfo = data.responseInfo;
443 443
         if (responseInfo && responseInfo.systemTime) {
444
+            G.TimeUtils.synTime(responseInfo.sysTime);
444 445
             this.keepaliveTime = responseInfo.systemTime;
445 446
 
446 447
             // 间隔多少秒请求一次保活

+ 326 - 0
assets/script/core/model/pay/PayMgr.js

@@ -3,10 +3,336 @@
3 3
  */
4 4
 
5 5
 let PayMgr = {
6
+    _orderList: [],                 // 订单列表
7
+    _pollingOrderList: [],          // 轮询订单列表
8
+    _didConfirmedOrders: [],        // 已有结果订单列表
9
+
6 10
     init () {
7 11
         if (CC_EDITOR) {
8 12
             return;
9 13
         }
14
+
15
+        this._initPublishListener();
16
+    },
17
+
18
+     /**
19
+     * 初始化服务器请求事件侦听
20
+     *
21
+     */
22
+     _initPublishListener () {
23
+        cc.game.on('on_shop_order', this._onPublishPayResult, this);
24
+    },
25
+
26
+    /**
27
+     * 对比订单, 支付流程越前面的优先级越高
28
+     *
29
+     * @param {Object} orderDataA
30
+     * @param {Object} orderDataB
31
+     * @returns
32
+     */
33
+    orderCompare (orderDataA, orderDataB) {
34
+        let statusA = orderDataA.status;
35
+        let statusB = orderDataB.status;
36
+
37
+        let map = {
38
+            [JMC.ORDER_STATUS.PAY_FAILED]: 1,
39
+            [JMC.ORDER_STATUS.PAY_SUCCEEDED]: 1,
40
+            [JMC.ORDER_STATUS.SUBMIT_ORDER_SUCCEEDED]: 2,
41
+            [JMC.ORDER_STATUS.SUBMIT_ORDER_FAILED]: 2,
42
+            [JMC.ORDER_STATUS.SUBMIT_ORDER_UNKOWN]: 2,
43
+            [JMC.ORDER_STATUS.CALL_PAY_SUCCEEDED]: 3,
44
+            [JMC.ORDER_STATUS.CALL_PAY_FAILED]: 3
45
+        };
46
+
47
+        let a = map[statusA];
48
+        let b = map[statusB];
49
+        return a > b;
50
+    },
51
+
52
+    /**
53
+     * 获取合适的订单
54
+     *
55
+     * @param {number} orderId
56
+     * @returns {Object}
57
+     */
58
+    getProperOrderData (orderId) {
59
+        if (!G.FuncUtils.isString(orderId)) {
60
+            return undefined;
61
+        }
62
+
63
+        let defaultOrderData = undefined;
64
+        let orderList = this._orderList;
65
+        if (!orderList || orderList.length == 0) {
66
+            return undefined;
67
+        }
68
+``
69
+        for (let orderData of orderList) {
70
+            if (orderData.orderId == orderId) {
71
+                if (!defaultOrderData) {
72
+                    defaultOrderData = orderData;
73
+                }
74
+                // 如果有更合适订单,就换成更合适的订单
75
+                else {
76
+                    let isBetter = this.orderCompare(orderData, defaultOrderData);
77
+                    if (isBetter) {
78
+                        defaultOrderData = orderData;
79
+                    }
80
+                }
81
+            }
82
+        }
83
+
84
+        return defaultOrderData;
85
+    },
86
+
87
+    /**
88
+     * 设置某gid的订单是否需要确认
89
+     *
90
+     * @param {number} gid
91
+     * @param {boolean} isDidConfirmed
92
+     */
93
+    setDidConfirmedOrderByGoodsId (gid, isDidConfirmed) {
94
+        this._didConfirmedOrders[gid] = isDidConfirmed;
95
+    },
96
+
97
+    /**
98
+     * 新增订单信息
99
+     *
100
+     * @param {Object} orderData
101
+     */
102
+    addOrderData (orderData) {
103
+        this._orderList.push(orderData);
104
+    },
105
+
106
+    /**
107
+     * 更新订单
108
+     *
109
+     * @param {Object} newOrderData
110
+     */
111
+    updateOrderData (newOrderData) {
112
+        let orderData = this.getProperOrderData(newOrderData.orderId);
113
+        let hasUpdateStatus = false;
114
+        if (orderData) {
115
+            let isBetter = this.orderCompare(orderData, newOrderData);
116
+            if (isBetter) {
117
+                hasUpdateStatus = true;
118
+            }
119
+        }
120
+        else {
121
+            this.addOrderData(newOrderData);
122
+            orderData = newOrderData;
123
+            hasUpdateStatus = true;
124
+        }
125
+
126
+        if (hasUpdateStatus) {
127
+            for (let [key, value] of Object.entries(newOrderData)) {
128
+                if (value !== undefined) {
129
+                    orderData[key] = value;
130
+                }
131
+            }
132
+
133
+            let gid = orderData.gid;
134
+            goods = G.CfgMgr.goodsConfig.getByMainKey(gid);
135
+            if (!goods) {
136
+                return;
137
+            }
138
+
139
+            let newStatus = orderData.status;
140
+            if (newStatus == JMC.ORDER_STATUS.PAY_SUCCEEDED || newStatus == JMC.ORDER_STATUS.PAY_FAILED) {
141
+                this.setDidConfirmedOrderByGoodsId(gid, false);
142
+
143
+                if (newStatus == JMC.ORDER_STATUS.PAY_SUCCEEDED) {
144
+                    this.didPaySuccussful(orderData);
145
+                }
146
+                else {
147
+                    this.didPayFailed(orderData);
148
+                }
149
+            }
150
+        }
151
+
152
+        return orderData;
153
+    },
154
+
155
+    /**
156
+     * 支付成功的数据处理
157
+     *
158
+     * @param {Object} orderData
159
+     */
160
+    didPaySuccussful (orderData) {
161
+        cc.game.emit('e_nwk_on_shop_order', orderData);
162
+    },
163
+
164
+    didPayFailed (orderData) {
165
+        cc.game.emit('e_nwk_on_shop_order', orderData);
166
+    },
167
+
168
+    payGoods(gid, isTest) {
169
+        let goodsConfig = G.CfgMgr.goodsConfig.getByMainKey(gid);
170
+        if (!goodsConfig) return;
171
+
172
+        let timestamp = G.TimeUtils.getCurrentTime();
173
+        let uid = G.UserMgr.getUid();
174
+        let channel = G.MiddleDevice.getChannelId();
175
+        let orderId = cc.js.formatStr('%s_%s_%s_%s', timestamp, channel, uid, gid);
176
+        
177
+        if (!isTest) {
178
+            let payType = 1;
179
+            let status;
180
+            let errMsg = '';
181
+            let jfid = goodsConfig.jfid;
182
+            if (!jfid) return;
183
+
184
+            let rmb = goodsConfig.rmb;
185
+            if (!rmb) return;
186
+
187
+            let ok = G.MiddlePay.pay(payType, uid, gid, jfid, rmb, goodsConfig.name, goodsConfig.name, orderId);
188
+            if (ok) {
189
+                status = JMC.ORDER_STATUS.CALL_PAY_SUCCEEDED;
190
+            } else {
191
+                status = JMC.ORDER_STATUS.CALL_PAY_FAILED;
192
+                errMsg = '调起支付异常';
193
+            }
194
+
195
+            let orderData = {
196
+                orderId: orderId,
197
+                status: status,
198
+                errorMsg: errMsg,
199
+                goodsConfig: goodsConfig,
200
+                amount: rmb,
201
+                payType: payType
202
+            };
203
+
204
+            this.addOrderData(orderData);
205
+        }
206
+        else {
207
+            let payType = 1;
208
+            let info = {
209
+                orderId: orderId, 
210
+                payName: 'alipay',
211
+                status: true,
212
+                resMsg: '支付成功',
213
+                amount: goodsConfig.rmb
214
+            }
215
+
216
+            setTimeout (() => {
217
+                G.NetworkMgr.sendSocketRequest('test_pay_goods', info, this._responseTestPayGood.bind(this));
218
+            }, 0.5);
219
+
220
+            let rmb = goodsConfig.rmb;
221
+            if (!rmb) return;
222
+
223
+            let errMsg = '';
224
+            let orderData = {
225
+                orderId: orderId,
226
+                status: JMC.ORDER_STATUS.CALL_PAY_SUCCEEDED,
227
+                errorMsg: errMsg,
228
+                goodsConfig: goodsConfig,
229
+                amount: rmb,
230
+                payType: payType
231
+            };
232
+
233
+            this.addOrderData(orderData);
234
+
235
+            this.didPay(200, errMsg, uid, gid, rmb, payType, orderId);
236
+        }
237
+    },
238
+
239
+    didPay (code, errMsg, uid, gid, price, payType, orderId, errcode) {
240
+        let status = JMC.ORDER_STATUS.SUBMIT_ORDER_SUCCEEDED;
241
+        if (!G.FuncUtils.isNumber(code) || code != 200) {
242
+            G.LogUtils.log('!G.FuncUtils.isNumber(code) || code != 200');
243
+            if (code == 202) {
244
+                status = JMC.ORDER_STATUS.SUBMIT_ORDER_UNKOWN;
245
+            } else {
246
+                status = JMC.ORDER_STATUS.SUBMIT_ORDER_FAILED;
247
+            }
248
+        }
249
+
250
+        let goodsConfig = G.CfgMgr.goodsConfig.getByMainKey(gid);
251
+        if (!goodsConfig) return;
252
+
253
+        let orderData = {
254
+            orderId: orderId,
255
+            status: status,
256
+            errorMsg: errMsg,
257
+            goodsConfig: goodsConfig,
258
+            amount: price,
259
+            payType: payType,
260
+            errcode: errcode
261
+        };
262
+
263
+        if (status == JMC.ORDER_STATUS.SUBMIT_ORDER_UNKOWN) {
264
+            let data = G.FuncUtils.clone(orderData); // 避免updateOrderData修改了订单对象
265
+            // 延迟1秒,尽量避免客户端请求的时候,渠道还没回调结果到支付服
266
+            setTimeout(() => {
267
+                // 订单轮询
268
+                
269
+            }, 1000);
270
+        }
271
+
272
+        this.updateOrderData(orderData);
273
+    },
274
+
275
+    // 中间层推送的支付回调
276
+    _handlePayResult (eventData) {
277
+        let code = eventData.code;
278
+        let errMsg = eventData.errorMsg;
279
+        let data = eventData.data || {};
280
+        let uid = data.uid;
281
+        let gid = data.gid;
282
+        let price = data.price;
283
+        let payType = data.payType;
284
+        let orderId = data.orderId;
285
+        let errcode = '';
286
+
287
+        this.didPay(code, errMsg, uid, gid, price, payType, orderId, errcode);
288
+    },
289
+
290
+    //* ************* 客户端请求/响应 开始 ************* *//
291
+    _responseTestPayGood (data) {
292
+        cc.warn('_responseTestPayGood', data);
293
+        let responseInfo = data.responseInfo;
294
+        if (responseInfo.code != 200) {
295
+            G.AppUtils.getSceneCtrl().addToast('调试支付失败' + responseInfo.code.toString());
296
+        }
297
+    },
298
+
299
+    // # 推送商城购买订单结果
300
+    // on_shop_order 2300 {
301
+    //     request {
302
+    //         orderInfo 0: DataOrder      # 订单数据
303
+    //     }
304
+    // }
305
+
306
+    // # 订单信息
307
+    // .DataOrder {
308
+    //     status 0: integer               # 订单状态, 1表示成功!
309
+    //     orderId 1: string               # 订单ID
310
+    //     gid 2: integer                  # 商品ID
311
+    //     items 3: *DataItem              # 商品发放物品列表
312
+    //     giftItems 4: *DataItem          # 赠送发放物品列表
313
+    //     errMsg 5: string                # 失败原因字符串!
314
+    //     payName 6: string               # SDK支付名称 比如:cmpay
315
+    //     errCode 7: string               # SDK支付方回调错误码, 可能有,可能没有
316
+    //     amount 8: integer               # 实际订单金额,单位分,要转字符串
317
+    // }
318
+
319
+    _onPublishPayResult (data) {
320
+        if (G.OPEN_DEBUG) {
321
+            G.AppUtils.getSceneCtrl().addToast('订单推送');
322
+        }
323
+       
324
+        let orderData = data.orderInfo;
325
+        if (orderData) {
326
+            let status = orderData.status;
327
+            if (status != JMC.ORDER_STATUS.PAY_SUCCEEDED) {
328
+                orderData.status = JMC.ORDER_STATUS.PAY_FAILED;
329
+                if (!G.FuncUtils.isString(orderData.errorMsg) || orderData.errorMsg.length == 0) {
330
+                    orderData.errorMsg = '支付未成功';
331
+                }
332
+            }
333
+
334
+            this.updateOrderData(orderData);
335
+        }
10 336
     },
11 337
 }
12 338
 

+ 1 - 5
assets/script/platform/MiddlePay.js

@@ -101,9 +101,6 @@ cc.Class({
101 101
     /**
102 102
      * 支付 pay_pay
103 103
      *
104
-     * @author Pyden
105
-     * @date 2020-03-11
106
-     * @param {String} sdkName
107 104
      * @param {Integer} payType
108 105
      * @param {Integer} uid
109 106
      * @param {Integer} gid
@@ -112,10 +109,9 @@ cc.Class({
112 109
      * @param {String} goodsName
113 110
      * @param {String} goodsDesc
114 111
      * @param {String} orderId
115
-     * @param {String} payCode 第三方H5游戏传入的计费点 LegendMgr
116 112
      * @returns {Boolean} 返回值表示是否调起支付成功
117 113
      */
118
-    pay (sdkName, payType, uid, gid, jfid, price, goodsName, goodsDesc, orderId, payCode) {
114
+    pay (payType, uid, gid, jfid, price, goodsName, goodsDesc, orderId) {
119 115
         return false;
120 116
     },
121 117