PayMgr.js 10.0 KB

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