import DB from "./DB"; import ChargeConfig from "../core/ChargeConfig"; import ServerMgr from "../gate/ServerMgr"; import Http from "./Http"; import SKLogger from "../gear/SKLogger"; import SKDataUtil from "../gear/SKDataUtil"; import { MsgCode } from "../role/EEnum"; import GameConf from "../../conf/GameConf"; let request = require('sync-request'); // 充值 export default class Charge { static shared = new Charge(); orderList: any; constructor() { this.orderList = {}; } /* * 获取随机的20位的订单号 */ getRandomOrderid20() { let date = new Date(); let second = date.getTime(); let random = Math.floor(900000 * Math.random()) + 100000; let orderid = 'E' + second + '' + random; return orderid; } getAgentOrderid20() { let date = new Date(); let second = date.getTime(); let random = Math.floor(900000 * Math.random()) + 100000; let orderid = 'A' + second + '' + random; return orderid; } /* * 创建自定义订单 */ createCustomOrder(roleid: any, goodsid: any, goodscount: any, pay_bankcode: any, money: any, activitystates: any, callback: any) { if ([210, 220, 310, 330].indexOf(pay_bankcode) == -1) { callback(false); return; } money = parseInt(money); if (isNaN(money) || money <= 1996) { callback(false); return; } let jade = this.getAllJadeByMoney(money); let orderid = this.getRandomOrderid20(); DB.createChargeOrder(orderid, roleid, money, jade, goodscount, goodsid, activitystates, (ret: any) => { if (!ret) { callback(false, {}); return; } let url = this.getPayH5(roleid, orderid, money, pay_bankcode); callback(true, { url: url }); }); } /* * 创建订单 * @param roleid 角色id * @param goodsid 货物pid * @param goodscount 货品数量 * @param activitystates 双倍充值活动是否开启 */ createOrder(roleid: any, goodsid: any, goodscount: any, pay_bankcode: any, money: any, activitystates: any, callback: any) { if (goodsid == 0) { this.createCustomOrder(roleid, goodsid, goodscount, pay_bankcode, money, activitystates, callback); return; } if ([210, 220, 310, 330].indexOf(pay_bankcode) == -1) { callback(false); return; } let jade = 0; let name = ''; let list = ChargeConfig.shared.charge_list; for (let data of list) { if (data.goodsid == goodsid) { jade = (data.jade + data.ex_jade) * goodscount; money = data.money * goodscount; name = data.name; } } if (jade == 0 || money == 0 || name == '') { callback(false); return; } let orderid = this.getRandomOrderid20(); DB.createChargeOrder(orderid, roleid, money, jade, goodscount, goodsid, activitystates, (ret: any) => { if (!ret) { callback(false, {}); return; } let url = this.getPayH5(roleid, orderid, money, pay_bankcode); callback(true, { url: url }); }); } // 获得支付H5地址 getPayH5(roleId: string, orderId: string, money: number, type: number): string { let paytype = "alipay"; if (type == 330 || type == 310) { paytype = "weixin"; } let url = `http://`+GameConf.charge_url+`/system/pay/order?userOrderNo=${orderId}&topUpMoney=${money}&type=${type}&tradeType=${paytype}`; let res = request('GET', url, { headers: { 'user-agent': 'example-user-agent', }, }); return res.getBody('utf8'); } getItem(i: any) { let config = ChargeConfig.shared.charge_list; for (let item of config) { if (item.goodsid == i) { return item; } } return null; } /* * 自定义订单根据money计算jade */ getAllJadeByMoney(money: any) { let jade = money * 100; let exjade = 0; for (let i = 6; i >= 1; --i) { let item = this.getItem(i); if (item && money >= item.money) { let count = Math.floor(money / item.money); exjade += count * item.ex_jade; money -= count * item.money; } } return jade + exjade; } // 充值同步跳转 pay_return(req: any, res: any) { let sdpayno = req.query.sdpayno; let total_fee = req.query.total_fee; let sdorderno = req.query.sdorderno; let sign = req.query.sign; if (sign == GameConf.sign){ this.paySuccess(sdorderno, sdpayno, total_fee); Http.reply(res, { code: MsgCode.SUCCESS, msg: `充值${total_fee}元成功!`, }); } } // 充值成功处理 paySuccess(sdorderno: string, sdpayno: string, total_fee: string) { if (this.orderList[sdorderno]) { SKLogger.debug(`订单${sdorderno}正在处理...`); return; } this.orderList[sdorderno] = 0; DB.canFinishOrder(sdorderno, sdpayno, total_fee, (code: MsgCode, row: any) => { if (row == null) { delete this.orderList[sdorderno]; return; } let sd_money = SKDataUtil.numberBy(row.money); let server = ServerMgr.shared.getServer(row.serverid); if (server == null || server.net_ip == null || !server.http_port == null) { delete this.orderList[sdorderno]; SKLogger.warn(`支付:玩家充值[${total_fee}]元失败,找不到所在游戏服务器!`); return; } Http.sendget(server.net_ip, server.http_port, '/charge_callback', { roleid: row.roleid, sdorderno: sdorderno, sdpayno: sdpayno, jade: row.jade, sd_money: sd_money, total_fee: total_fee, }, (success: boolean, data: any) => { delete this.orderList[sdorderno]; if (!success) { return; } if (data.code == MsgCode.SUCCESS) { DB.setOrderFinish(sdorderno, sdpayno, total_fee, (success: boolean) => { if (success) { SKLogger.info(`支付:玩家[${row.roleid}]充值${total_fee}元成功!`); } else { SKLogger.info(`支付:玩家[${row.roleid}]充值${total_fee}元失败!`); } }); } }); }); } // 代理充值 agentCharge(role_id: string, charge_id: number, count: number, activitystates: any, callback: (code: number, msg: string) => void) { let list = ChargeConfig.shared.charge_list; if (charge_id < 1 || charge_id > list.length) { callback(MsgCode.FAILED, `代理充值:charge_id配置没有找到!`); return; } let data = list[charge_id - 1]; let goodsid = data.goodsid; let jade = (data.jade + data.ex_jade) * count; let money = data.money * count; let order_id = this.getAgentOrderid20(); DB.agentCharge(order_id, role_id, money, jade, count, goodsid, activitystates, (code: number, msg: string, server_id: any) => { if (code == MsgCode.SUCCESS) { this.agentPaySuccess(order_id, role_id, jade, money, server_id, callback); } else { callback(code, msg); } }); } agentPaySuccess(order_id: string, roleId: any, jade: number, money: number, server_id: any, callback: (code: number, msg: string) => void) { let server = ServerMgr.shared.getServer(server_id); if (!server || !server.net_ip || !server.http_port) { callback(MsgCode.FAILED, `代理充值${money}元失败,找不到所在游戏服务器!`); return; } Http.sendget(server.net_ip, server.http_port, '/charge_callback', { roleid: roleId, sdorderno: order_id, sdpayno: "", jade: jade, sd_money: money, total_fee: money, }, (ret: any, data: any) => { callback(MsgCode.SUCCESS, `代理充值${money}元成功!`); }); } }