247 lines
7.0 KiB
TypeScript
247 lines
7.0 KiB
TypeScript
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}元成功!`);
|
|
});
|
|
}
|
|
}
|