xy-server/game/utils/Charge.ts
2025-04-23 09:34:08 +08:00

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}元成功!`);
});
}
}