'use strict'; var quick = require('quick-pomelo'); var P = quick.Promise; var _ = require('lodash'); var url = require('url'); var md5 = require('md5'); var http = require('http'); var https = require('https'); var uuid = require('node-uuid'); var qs = require('querystring'); var conf = require('./conf.json'); var C = require('../share/constant'); var logger = quick.logger.getLogger('charge', __filename); var uuid = require('node-uuid'); var configCommon = require('../share/configCommon'); // 构造方法 var Controller = function (app) { this.app = app; this.uptime = Date.now(); this.port = app.getCurServer().httpPort; this.server = http.createServer((req, res) => this.handleAsync(req, res)); this.server.listen(this.port); ////TL++,为了给管理后台统计数据 this.jrStart = getTodaySJC();////今日0时的时间戳 setTimeout(() => this.timeOutHander(),getjlzdsjc(this.jrStart)); }; // 导出方法 module.exports = function (app) { return new Controller(app); }; // 原型对象 var proto = Controller.prototype; // 路由函数 proto.route = function (pathname) { switch (pathname) { //case '/withdrawstart.nd': return (query, method, res) => this.withdrawstartAsync(query, method, res);//充值开始 case '/clear.nd': return (query, method, res) => this.clearAsync(query, method, res);//充值开始 case '/checkUser': return (query, method, res) => this.checkUserAsync(query, method, res);//充值开始 case '/queryBalance': return (query, method, res) => this.queryBalanceAsync(query, method, res);//充值开始 case '/deductUsdt': return (query, method, res) => this.deductUsdtAsync(query, method, res);//充值开始 case '/addUsdt': return (query, method, res) => this.addUsdtAsync(query, method, res);//充值开始 case '/refundUsdt': return (query, method, res) => this.refundUsdtAsync(query, method, res);//充值开始 case '/hoodleToUsdt.nd': return (query, method, res) => this.hoodleToUsdtAsync(query, method, res);//充值开始 //case '/taskRecord.nd': return (query, method, res) => this.taskRecordAsync(query, method, res);//充值开始 //case '/withdrawrecord.nd': return (query, method, res) => this.withdrawRecordAsync(query, method, res);//充值开始 ///case '/sgjrecord.nd': return (query, method, res) => this.sgjRecordAsync(query, method, res);//充值开始 //case '/payrecord.nd': return (query, method, res) => this.payRecordAsync(query, method, res);//充值开始 case '/withdrawok.nd': return (query, method, res) => this.withdrawOkAsync(query, method, res);//充值成功 //case '/paystart.nd': return (query, method, res) => this.payStartAsync(query, method, res);//充值开始 case '/getUsdtAddress.nd': return (query, method, res) => this.payUsdtLoctionAsync(query, method, res);//充值开始 case '/payok.nd': return (query, method, res) => this.payOkAsync(query, method, res);//充值成功 case '/setopenid.nd': return (query, method, res) => this.setOpenIdAsync(query, method, res);//设置公众号openid case '/getopenid.nd': return (query, method, res) => this.getOpenIdAsync(query, method, res);//得到公众号openid case '/synbind.nd': return (query, method, res) => this.BindAsync(query, method, res);//闲聊同步绑定 //case '/adddiamond.nd': return (query, method, res) => this.addDiamondAsync(query, method, res);//后台加钻石 //case '/makeRedpack': return (query, method, res) => this.makeRedpackAsync(query, method, res); //case '/recvRedpack': return (query, method, res) => this.recvRedpackAsync(query, method, res); } }; // 写出数据 proto.writeOut = function (query, res) { if (typeof query != 'object') { return res.end(String(query)); } return res.end(JSON.stringify(query)); }; // 跨域选项 const ACCESS = { "Content-Type": "text/plain;charset=utf-8", "Access-Control-Allow-Origin": "*", "Access-Control-Allow-Headers": "X-Requested-With", "Access-Control-Allow-Methods": "PUT,POST,GET,DELETE,OPTIONS" }; // 入口函数 proto.handleAsync = P.coroutine(function* (req, res) { var pathname = url.parse(req.url).pathname; var phandler = this.route(pathname); if (!phandler) { res.writeHead(404, ACCESS); return res.end('WARNING: Not Found!'); } else { res.writeHead(200, ACCESS); if (req.method.toLowerCase() == 'get') { let query = url.parse(req.url, true).query; return phandler(query, req.method, res); } else if (req.method.toLowerCase() == 'post') { let data = ''; req.on('data', (d) => { data += d; }); req.on('end', () => { let query = { __post__: data }; let regexp = /^\s*{(\s*?".*?":.*\s*)*}\s*$/; if (regexp.test(data)) try { query = JSON.parse(data); } catch (e) { } else if (data.indexOf('=') != -1) query = qs.parse(data); return phandler(query, req.method, res); }); } } }); //TL++ 绑定闲聊 proto.BindAsync = P.coroutine(function* (query, method, res) { // console.warn("绑定闲聊-------------------"); var id1 = query['id1']; if (!id1) { return this.writeOut('fail: id1 error!', res); } //id1 微信用户 var id2 = query['id2']; if (!id2) { return this.writeOut('fail: id2 error!', res); } //id2 闲聊用户 if(id1==id2) { return this.writeOut('fail: id error!', res); } var sign = query['sign']; if (!sign) { return this.writeOut('fail: sign error!', res); } if (!checkSign(sign)) { return this.writeOut('fail: sign error!', res); } var self = this; var app = this.app; return app.memdb.goose.transactionAsync(P.coroutine(function* () { var oldsynPlayer1; var player1 = yield app.models.Player.findByIdAsync(id1, 'synPlayer formId'); if (player1) { oldsynPlayer1=player1.synPlayer; if(player1.formId!=0) { // console.warn("绑定失败: 微信玩家账号参数错误!"); return self.writeOut('1', res); } player1.synPlayer = id2; } else { // console.warn("绑定失败: 没有找到微信玩家账号,请先注册!"); return self.writeOut('2', res); } var oldsynPlayer2; var player2 = yield app.models.Player.findByIdAsync(id2, 'synPlayer formId'); if (player2) { oldsynPlayer2=player2.synPlayer; if(player2.formId==0) { // console.warn("绑定失败: 闲聊玩家账号参数错误!"); return self.writeOut('3', res); } player2.synPlayer = id1; } else { // console.warn("绑定失败: 没有找到闲聊玩家账号,请先注册!"); return self.writeOut('4', res); } if(oldsynPlayer1==id2 && oldsynPlayer2==id1)//已经绑定 { // console.warn("已经绑定:不用重复绑定"); return self.writeOut('5', res); } yield player1.saveAsync(); yield player2.saveAsync(); if(oldsynPlayer1 && oldsynPlayer1!=id2) { var oldPlayer1 = yield app.models.Player.findByIdAsync(oldsynPlayer1, 'synPlayer'); if (oldPlayer1) { oldPlayer1.synPlayer = ''; yield oldPlayer1.saveAsync(); // console.warn("清空原绑定的玩家1------------------",oldsynPlayer1); } } if(oldsynPlayer2 && oldsynPlayer2!=id1) { var oldPlayer2 = yield app.models.Player.findByIdAsync(oldsynPlayer2, 'synPlayer'); if (oldPlayer2) { oldPlayer2.synPlayer = ''; yield oldPlayer2.saveAsync(); // console.warn("清空原绑定的玩家2------------------",oldsynPlayer2); } } // console.warn("绑定闲聊成功------------------",id1,id2); return self.writeOut('999999', res); }), app.getServerId()) .then(() => app.event.emit('transactionSuccess'), () => app.event.emit('transactionFail')); }); //ts++ 设置公众号openid proto.setOpenIdAsync = P.coroutine(function* (query, method, res) { // console.warn("设置公众号openId-------------------"); var playerId = query['playerid']; if (!playerId) { return this.writeOut('fail: userid error!', res); } //console.warn("设置公众号openId-------------------playerId:",playerId); var openId = query['openid']; //console.warn("设置公众号openId-------------------openId:",openId); if (!openId) { return this.writeOut('fail: openId error!', res); } var mpId = query['mpid']; if (!mpId) { return this.writeOut('fail: mpId error!', res); } var sign = query['sign']; if (!sign) { return this.writeOut('fail: sign error!', res); } if (!checkSign(sign)) { return this.writeOut('fail: sign error!', res); } var self = this; var app = this.app; return app.memdb.goose.transactionAsync(P.coroutine(function* () { var player = yield app.models.Player.findByIdAsync(playerId, 'openId mpId'); if (player) { if(player.openId!=openId) { player.openId = openId; player.mpId = mpId; yield player.saveAsync(); // console.warn("设置公众号openid-------------------修改"); } } return self.writeOut('999999', res); }), app.getServerId()) .then(() => app.event.emit('transactionSuccess'), () => app.event.emit('transactionFail')); }); //ts++ 得到openid proto.getOpenIdAsync = P.coroutine(function* (query, method, res) { // console.warn("得到openid-------------------"); var playerId = query['playerid']; if (!playerId) { return this.writeOut('', res);//fail: userid error! } var sign = query['sign']; if (!sign) { return this.writeOut('fail: sign error!', res); } if (!checkSign(sign)) { return this.writeOut('', res); } var openId = ''; var mpId = ''; var self = this; var app = this.app; return app.memdb.goose.transactionAsync(P.coroutine(function* () { var player = yield app.models.Player.findByIdReadOnlyAsync(playerId, 'openId mpId'); if (player) { openId=player.openId; mpId=player.mpId; } // console.warn("得到openid-------------------openid:",openId); return self.writeOut({ openId: openId, mpId: mpId }, res); }), app.getServerId()) .then(() => app.event.emit('transactionSuccess'), () => app.event.emit('transactionFail')); }); // 充值初始化 proto.payStartAsync = P.coroutine(function* (query, method, res) { // console.warn("充值开始-------------------",query); var out_trade_no = query['out_trade_no']; if (!out_trade_no) { return this.writeOut('1', res); } var payplayerId = query['playerid']; if (!payplayerId) { return this.writeOut('2', res); } // console.warn("充值开始-------------------payplayerId:",payplayerId); var payment = Number(query['payment']); // console.warn("充值开始-------------------支付方式:",payment); var total_fee = Number(query['total_fee']); // console.warn("充值开始-------------------Number(query['toid']:" +Number(query['toid']) + " total_fee "+total_fee); var toid = Number(query['toid'])|| 0; var sign = query['sign']; if (!checkUsdtSign(sign)) { return this.writeOut('3', res); } var self = this; var app = this.app; return app.memdb.goose.transactionAsync(P.coroutine(function* () { let playerId=payplayerId; // console.warn("代充用户-------------------toid:",toid); if(toid>0) { let playerList = yield app.models.Player.findMongoAsync({userId:toid}, '_id userId'); if (playerList.length > 0) { playerId = playerList[0]._id; // console.warn("代充用户-------------------playerId:",playerId); } else { return self.writeOut('4', res); } } else { let player = yield app.models.Player.findByIdReadOnlyAsync(playerId,'diamond totalMoney'); if (!player) { // console.warn("充值开始-------------------用户不存在:"); return self.writeOut('5', res); } } // console.warn("充值开始-------------------查询数据是否存在:"); var record = yield app.models.PayRecord.findByIdReadOnlyAsync(out_trade_no, 'playerId'); if (record) { // console.warn("充值开始-------------------数据已经录入 不能重复录入:"); return self.writeOut('6', res); } // console.warn("充值开始-------------------录入数据:"); record = new app.models.PayRecord({ _id: out_trade_no, playerId: playerId, payplayerId: payplayerId, total_fee: total_fee, payment:payment }); yield record.saveAsync(); // console.warn("充值开始-------------------录入成功:"); return self.writeOut('999999', res); }), app.getServerId()) .then(() => app.event.emit('transactionSuccess'), () => app.event.emit('transactionFail')); }); proto.savePlayer = P.coroutine(function* (userid,address) { var app = this.app console.warn("userid:",userid) return app.memdb.goose.transactionAsync(P.coroutine(function* () { console.warn("userid:",userid) var players = yield app.models.Player.findMongoAsync({ userId: userid }); players[0].address = address; yield players[0].saveAsync(); return address; }), app.getServerId()) .then(() => app.event.emit('transactionSuccess'), () => app.event.emit('transactionFail')); }); proto.getDepositAddress = P.coroutine(function* (suffix,coinurl) { return new Promise((resolve, reject) => { const url = "https://"+coinurl+'/api/deposit/address?' + suffix; https.get(url, (res) => { console.warn("300 url:",url); res.setEncoding('utf8'); if (res.statusCode !== 200) { const errMsg = `请求失败,状态码: ${res.statusCode}`; console.warn("res:", res.statusCode); return reject(+new Error(errMsg)); } let data = ''; res.on('data', (chunk) => { console.warn("chunk:", chunk); data += chunk; }); res.on('end', function() { console.warn("end"); try { const parsedData = JSON.parse(data); //console.warn("226 player:", userid, parsedData.data.address); // 这里返回解析后的数据,供后续yield使用 resolve(parsedData); } catch (e) { const parseErr = new Error(`JSON 解析失败: ${e.message}`); console.warn(parseErr.message); reject(parseErr); } }); }).on('error', err => { console.error('请求错误:', err); reject(err); }); }); }); proto.payUsdtLoctionAsync = P.coroutine(function* (query, method, res) { // console.warn("充值开始-------------------",query); var response = {} response.code= "0" response.message= "" var userid = query['userId']; if (!userid) { response.code= "1" response.message= "user not exist" return this.writeOut(response, res); } var suffix = "chainCode=tron×tamp="+Date.now()+"&userId="+userid var md5str = "chainCode=tron×tamp="+Date.now()+"&userId="+userid+"&key=1bU4uOEs4kZoQA0D55mzAwBr2NlN9o40" var sign = md5(md5str).toLowerCase(); suffix = suffix +"&sign="+sign console.warn("suffix:",suffix) var app = this.app var self = this return app.memdb.goose.transactionAsync(P.coroutine(function* () { console.warn("userid:",userid) var players = yield app.models.Player.findMongoAsync({ userId: userid }); if (players.length == 0 ) { response.code= "1" response.message= "user not exist" return self.writeOut(response, res); } var player = players[0] if (player.address) { response.address = player.address return self.writeOut(response, res); } let sgjconfigs = yield app.models.SGJConfig.findMongoAsync(); var sgjconfig = sgjconfigs[0] let parsedData = yield self.getDepositAddress(suffix,sgjconfig.coinurl) console.log("parsedData:",parsedData) yield self.savePlayer(userid,parsedData.data.address); response.address = parsedData.data.address return self.writeOut(response, res); }), app.getServerId()) .then(() => app.event.emit('transactionSuccess'), () => app.event.emit('transactionFail')); }); // 钻石充值 proto.payDiamondAsync = P.coroutine(function* (playerId, out_trade_no, total_fee, res) { // delete require.cache[require.resolve('./conf.json')]; let conf2 = require('./conf.json'); const VALUES = conf2.pay_diamonds || {}; const GIVEV = conf2.give_diamonds || {}; var value = VALUES[total_fee]; if (!value) { return this.writeOut('4', res); } var self = this; var app = this.app; return app.memdb.goose.transactionAsync(P.coroutine(function* () { var record = yield app.models.PayRecord.findByIdAsync(out_trade_no, 'playerId paystate paydiamond payreward'); if (record) { if(record.paystate>0) { // console.warn("充值成功-------------------重复处理:"); return self.writeOut('5', res); } playerId = record.playerId; var player = yield app.models.Player.findByIdAsync(playerId, 'userId name diamond totalMoney payReward'); if (player) { var reward=0; //首充翻倍 // if(player.payReward==0) // { // player.payReward=value; // reward=value; // value=value*2; // } var gaivevalue = GIVEV[total_fee]; // //首充或者在活动期间大额加赠 // let iszhdqj = false;////是否在活动期间 // let currtime = Date.now(); // if(currtime >= 1601481600000 && currtime < 1602172800000 ) iszhdqj = true;///10月1号0点 ~ 10月9号0点 // if((player.totalMoney==0 || iszhdqj ) && gaivevalue > 0)//首充大额加赠 // { // player.payReward=gaivevalue; // reward=gaivevalue; // value+=gaivevalue; // } ////平时充值 if(gaivevalue > 0)//首充大额加赠 { player.payReward=gaivevalue; reward=gaivevalue; value+=gaivevalue; } // console.warn("充值金额 : 本次冲之前钻石数 本次充值金额 本次充值奖励",player.diamond,total_fee,gaivevalue,reward,value); let dSource=player.diamond; let dNow=player.diamond+value; player.diamond += value; player.totalMoney += total_fee; yield player.saveAsync(); // 钻石记录 var diamondrecord = new app.models.DiamondRecord({ _id: uuid.v1(), playerId: playerId, dType: 2,//充值 dSource: dSource, dSwap: value, dNow: dNow, tableId: out_trade_no }); yield diamondrecord.saveAsync(); //record = new app.models.PayRecord({ _id: out_trade_no, playerId: playerId, total_fee: total_fee }); record.paystate=1; record.paydiamond=value; record.payreward=reward; yield record.saveAsync(); let wjsx = yield app.models.PayLimit.findByIdAsync(playerId, 'userId name paytotal dataTime'); if (wjsx) { let jjrStart = getTodaySJC();////今日0时的时间戳 wjsx.userId = player.userId; wjsx.name = player.name; if(jjrStart == wjsx.dataTime){ wjsx.paytotal += total_fee; } else{ wjsx.paytotal = total_fee; wjsx.dataTime = jjrStart; } yield wjsx.saveAsync(); } }else { return self.writeOut('1', res); } return self.writeOut('999999', res); } else { // console.warn("充值成功-------------------重复处理:"); return self.writeOut('6', res); } }), app.getServerId()) .then(() => app.event.emit('transactionSuccess'), () => app.event.emit('transactionFail')); }); //充值成功前不生成订单 proto.payOkAsync = P.coroutine(function* (query, method, res) { // console.warn("充值成功-------------------",query); // var playerId = query['playerid']; // if (!playerId) { // return this.writeOut('1', res); // } // // console.warn("充值成功-------------------playerId:",playerId); // var out_trade_no = query['out_trade_no']; // // console.warn("充值成功-------------------out_trade_no:",out_trade_no); // var total_fee = Number(query['total_fee']); // // console.warn("充值成功-------------------total_fee:",total_fee); // var sign = query['sign']; // if (!checkSign(sign)) { // return this.writeOut('3', res); // } // if(total_fee == 1800 || total_fee == 900 || total_fee == 5800 || total_fee == 2900) { // return this.payJiPaiQiAsync(playerId, out_trade_no, total_fee, res); // } //return this.payDiamondAsync(playerId, out_trade_no, total_fee, res); return this.payUsdtAsync(query,res); }); proto.checkUserAsync = P.coroutine(function* (query, method, res){var response = {} response.code = 200 response.message = "" console.warn("checkUserAsync query:",query) var app_key = query["app_key"] if (!app_key) { response.code = "1" response.message = "param is wrong" return this.writeOut(response, res); } if (app_key != "pm7OoaSJXL2j6UMnWifVN5I0") { response.code = "1" response.message = "param is wrong" return this.writeOut(response, res); } var userid = query["user_id"] if (!userid) { response.code = "1" response.message = "param is wrong" return this.writeOut(response, res); } var token = query["token"] if (!token) { response.code = 401 response.message = "token invalid" return this.writeOut(response, res); } if (!checkFishUSDTSign(query)) { response.code = 403 response.message = "sign error" return this.writeOut(response, res); } var players = yield this.app.models.Player.findMongoAsync({ userId: Number(userid) }); if (players.length == 0) { response.code = "1" response.message = "param is wrong" return this.writeOut(response, res); } var player = players[0] if (player._id != token) { response.code = 401 response.message = "token invalid" return this.writeOut(response, res); } response.usdt = players[0].diamond return this.writeOut(response, res); }) proto.queryBalanceAsync = P.coroutine(function* (query, method, res){var response = {} response.code = 200 response.message = "" console.warn("queryBalanceAsync query:",query) var app_key = query["app_key"] if (!app_key) { response.code = "1" response.message = "param is wrong" return this.writeOut(response, res); } if (app_key != "pm7OoaSJXL2j6UMnWifVN5I0") { response.code = "1" response.message = "param is wrong" return this.writeOut(response, res); } var userid = query["user_id"] if (!userid) { response.code = "1" response.message = "param is wrong" return this.writeOut(response, res); } if (!checkFishUSDTSign(query)) { response.code = 403 response.message = "sign error" return this.writeOut(response, res); } var players = yield this.app.models.Player.findMongoAsync({ userId: Number(userid) }); if (players.length == 0) { response.code = "1" response.message = "param is wrong" return this.writeOut(response, res); } var player = players[0] response.usdt = players[0].diamond return this.writeOut(response, res); }) proto.deductUsdtAsync = P.coroutine(function* (query, method, res){var response = {} response.code = 200 response.message = "success" console.warn("deductUsdtAsync query:",query) var app_key = query["app_key"] if (!app_key) { response.code = "1" response.message = "param is wrong" return this.writeOut(response, res); } if (app_key != "pm7OoaSJXL2j6UMnWifVN5I0") { response.code = "1" response.message = "param is wrong" return this.writeOut(response, res); } var game_type = query["game_type"] if (!game_type) { response.code = "1" response.message = "param is wrong" return this.writeOut(response, res); } var userid = query["user_id"] if (!userid) { response.code = "1" response.message = "param is wrong" return this.writeOut(response, res); } var trade_no = query["trade_no"] if (!trade_no) { response.code = 401 response.message = "trade_no invalid" return this.writeOut(response, res); } var usdt_amount = query["usdt_amount"] if (!usdt_amount || usdt_amount == 0) { response.code = 401 response.message = "token invalid" return this.writeOut(response, res); } usdt_amount = Number(usdt_amount) if (!checkFishUSDTSign(query)) { response.code = 403 response.message = "sign error" return this.writeOut(response, res); } var players = yield this.app.models.Player.findMongoAsync({ userId: Number(userid) }); if (players.length == 0) { response.code = "1" response.message = "param is wrong" return this.writeOut(response, res); } var player = players[0] if (usdt_amount > player.diamond){ response.code = 402 response.message = "insufficient balance" return this.writeOut(response, res); } var self = this var app = this.app return app.memdb.goose.transactionAsync(P.coroutine(function* () { var records = yield app.models.ThirdUSDTRecord.findMongoAsync({gameType:query["game_type"], trade_no: trade_no }); if (records.length > 0) { response.code = 401 response.message = "already exist" return self.writeOut(response, res); } var record = new app.models.ThirdUSDTRecord({ _id: uuid.v1(), // 订单号 userId: userid, trade_no: trade_no, dSource: player.diamond, dSwap: 0-usdt_amount, dNow:player.diamond - usdt_amount, timestamp: Date.now(), gameType:query["game_type"] }); response.usdt = player.diamond var diamondrecord = new app.models.DiamondRecord({ _id: uuid.v1(), playerId: player._id, dType: 25,//withdraw fail dSource: player.diamond, dSwap: 0-usdt_amount, dNow: player.diamond - usdt_amount, tableId: -usdt_amount, gameType:query["game_type"], }); player.diamond -= usdt_amount yield diamondrecord.saveAsync() yield record.saveAsync() yield player.saveAsync() response.deduct_usdt = String(usdt_amount) response.remain_usdt = String(player.diamond) console.warn("deductUsdtAsync response:",response) return self.writeOut(response, res); }), app.getServerId()) .then(() => app.event.emit('transactionSuccess'), () => app.event.emit('transactionFail')); }) proto.addUsdtAsync = P.coroutine(function* (query, method, res){var response = {} response.code = 200 response.message = "success" console.warn("addUsdtAsync query:",query) var app_key = query["app_key"] if (!app_key) { response.code = "1" response.message = "param is wrong" return this.writeOut(response, res); } if (app_key != "pm7OoaSJXL2j6UMnWifVN5I0") { response.code = "1" response.message = "param is wrong" return this.writeOut(response, res); } var game_type = query["game_type"] if (!game_type) { response.code = "1" response.message = "param is wrong" return this.writeOut(response, res); } var userid = query["user_id"] if (!userid) { response.code = "1" response.message = "param is wrong" return this.writeOut(response, res); } var trade_no = query["trade_no"] if (!trade_no) { response.code = 401 response.message = "trade_no invalid" return this.writeOut(response, res); } var usdt_amount = query["usdt_amount"] if (!usdt_amount || usdt_amount == 0) { response.code = 401 response.message = "token invalid" return this.writeOut(response, res); } usdt_amount = Number(usdt_amount) if (!checkFishUSDTSign(query)) { response.code = 403 response.message = "sign error" return this.writeOut(response, res); } var players = yield this.app.models.Player.findMongoAsync({ userId: Number(userid) }); if (players.length == 0) { response.code = "1" response.message = "param is wrong" return this.writeOut(response, res); } var player = players[0] var self = this var app = this.app return app.memdb.goose.transactionAsync(P.coroutine(function* () { var records = yield app.models.ThirdUSDTRecord.findMongoAsync({gameType:query["game_type"], trade_no: trade_no }); if (records.length > 0) { response.code = 401 response.message = "already exist" return self.writeOut(response, res); } var record = new app.models.ThirdUSDTRecord({ _id: uuid.v1(), // 订单号 userId: userid, trade_no: trade_no, dSource: player.diamond, dSwap: usdt_amount, dNow:player.diamond + usdt_amount, timestamp: Date.now(), gameType:query["game_type"], }); response.usdt = player.diamond var diamondrecord = new app.models.DiamondRecord({ _id: uuid.v1(), playerId: player._id, dType: 26,//withdraw fail dSource: player.diamond, dSwap: usdt_amount, dNow: player.diamond + usdt_amount, tableId: usdt_amount, gameType:query["game_type"], }); player.diamond += usdt_amount yield diamondrecord.saveAsync() yield record.saveAsync() yield player.saveAsync() response.add_usdt = String(usdt_amount) response.remain_usdt = String(player.diamond) return self.writeOut(response, res); }), app.getServerId()) .then(() => app.event.emit('transactionSuccess'), () => app.event.emit('transactionFail')); }) proto.refundUsdtAsync = P.coroutine(function* (query, method, res){var response = {} response.code = 200 response.message = "success" console.warn("refundUsdtAsync query:",query) var app_key = query["app_key"] if (!app_key) { response.code = "1" response.message = "param is wrong" return this.writeOut(response, res); } if (app_key != "pm7OoaSJXL2j6UMnWifVN5I0") { response.code = "1" response.message = "param is wrong" return this.writeOut(response, res); } var userid = query["user_id"] if (!userid) { response.code = "1" response.message = "param is wrong" return this.writeOut(response, res); } var trade_no = query["trade_no"] if (!trade_no) { response.code = 401 response.message = "trade_no invalid" return this.writeOut(response, res); } var game_type = query["game_type"] if (!game_type) { response.code = "1" response.message = "param is wrong" return this.writeOut(response, res); } var origin_trade_no = query["origin_trade_no"] if (!origin_trade_no) { response.code = 401 response.message = "origin_trade_no invalid" return this.writeOut(response, res); } var usdt_amount = query["usdt_amount"] if (!usdt_amount || usdt_amount == 0) { response.code = 401 response.message = "token invalid" return this.writeOut(response, res); } usdt_amount = Number(usdt_amount) if (!checkFishUSDTSign(query)) { response.code = 403 response.message = "sign error" return this.writeOut(response, res); } var players = yield this.app.models.Player.findMongoAsync({ userId: Number(userid) }); if (players.length == 0) { response.code = "1" response.message = "param is wrong" return this.writeOut(response, res); } var player = players[0] if (player._id != token) { response.code = 401 response.message = "token invalid" return this.writeOut(response, res); } var self = this var app = this.app return app.memdb.goose.transactionAsync(P.coroutine(function* () { var records = yield this.app.models.ThirdUSDTRecord.findMongoAsync({gameType:query["game_type"], trade_no: origin_trade_no }); if (records.length == 0 ) { response.code = 401 response.message = "trade_no not exist" return self.writeOut(response, res); } var record = records[0] if (records[0].is_refund == 1 ) { response.code = 401 response.message = "trade_no already refund" return self.writeOut(response, res); } if (record.dSwap + usdt_amount != 0) { response.code = 401 response.message = "trade_no not exist" return self.writeOut(response, res); } var thirdRefundRecord = new app.models.ThirdRefundUSDTRecord({ _id: uuid.v1(), // 订单号 userId: userid, trade_no: trade_no, origin_trade_no:origin_trade_no, dSource: player.diamond, dSwap: usdt_amount, dNow:player.diamond + usdt_amount, timestamp: Date.now(), gameType:query["game_type"] }); var diamondrecord = new app.models.DiamondRecord({ _id: uuid.v1(), playerId: player._id, dType: 27,//withdraw fail dSource: player.diamon , dSwap: usdt_amount, dNow: player.diamond + usdt_amount, tableId: -amount, gameType:query["game_type"], }); yield diamondrecord.saveAsync() player.diamond += usdt_amount response.usdt = player.diamond yield thirdRefundRecord.saveAsync() yield player.saveAsync() response.refund_usdt = String(usdt_amount) response.remain_usdt = String(player.diamond) return self.writeOut(response, res); }), app.getServerId()) .then(() => app.event.emit('transactionSuccess'), () => app.event.emit('transactionFail')); }) proto.withdrawstartAsync = P.coroutine(function* (query, method, res){ var response = {} response.code = "0" response.message = "" response.usdt = 0 var userid = query["clientId"] if (!userid) { console.warn("userid:",userid) response.code = "1" response.message = "param is wrong" return this.writeOut(response, res); } var players = yield this.app.models.Player.findMongoAsync({ userId: Number(userid) }); if (players.length == 0) { console.warn("players:",players) response.code = "1" response.message = "param is wrong" return this.writeOut(response, res); } console.warn("610") let sgjconfigs = yield this.app.models.SGJConfig.findMongoAsync(); var sgjconfig = sgjconfigs[0] console.warn("612") var amount = query["amount"] if (!amount) { console.warn("amount:",amount) response.code = "1" response.message = "param is wrong" return this.writeOut(response, res); } if (amount < sgjconfig.withdrawlowlimit || amount <= 0) { response.code = "1" response.message = "withdraw must bigger than " + sgjconfig.withdrawlowlimit return this.writeOut(response, res); } var player = players[0] if (player.diamond < amount) { response.code = "1" response.message = "you not have much money" return this.writeOut(response, res); } var targetAddress = query["targetAddress"] if (!targetAddress) { response.code = "1" response.message = "param is wrong" return this.writeOut(response, res); } if (!checkUSDTSign(query)) { response.code = "1" response.message = "验证签名错误" return this.writeOut(response, res); } //var data = yield this.withdrawSubmit(amount-sgjconfig.withdrawfee, targetAddress, userid) //if (!data.success) { // return this.writeOut(data, res); //} var beforeusdt = player.diamond var afterusdt = player.diamond - amount var app = this.app var self = this return app.memdb.goose.transactionAsync(P.coroutine(function* () { var timestamp = Date.now() var record = new app.models.UsdtWithdrawRecord({ _id: uuid.v1(), // 订单号 chainCode: "tron", // 玩家ID clientId: query["clientId"], // 支付玩家ID code: "usdt", // 总金额 amount: query["amount"], // 支付方式 0为微信 1为支付宝 targetAddress: query["targetAddress"], // 充值奖励 submitTime: Date.now(), // 充值奖励 sign: query["sign"], // 充值奖励 refOrderId: "ORDER"+timestamp,//data.data.refOrderId, status:100, submitfee: sgjconfig.withdrawfee, userId :userid, beforeusdt: beforeusdt, afterusdt: afterusdt, }); player.diamond -= amount response.usdt = player.diamond var diamondrecord = new app.models.DiamondRecord({ _id: uuid.v1(), playerId: player._id, dType: 23,//withdraw fail dSource: beforeusdt , dSwap: record.amount, dNow: afterusdt, tableId: -amount }); var SGJUserTongjis = yield app.models.SGJUserTongji.findMongoAsync({todaytime:self.getTodaySJC()}) var SGJUserTongji = null if (SGJUserTongjis.length == 0) { SGJUserTongji = app.models.SGJUserTongji({ _id: uuid.v1(), //userId: player.userId, usdt: afterusdt, feeconfigusdt: sgjconfig.withdrawfee,//下注 todaytime: self.getTodaySJC() }); yield SGJUserTongji.saveAsync() }else { SGJUserTongji = SGJUserTongjis[0] console.warn("SGJUserTongji:",SGJUserTongji) //SGJUserTongji.usdt = afterusdt SGJUserTongji.feeconfigusdt = (Number(SGJUserTongji.feeconfigusdt) +Number(sgjconfig.withdrawfee)).toFixed(2)//下注 yield SGJUserTongji.saveAsync() } yield diamondrecord.saveAsync() yield player.saveAsync() yield record.saveAsync(); var data = yield self.withdrawSubmit(amount-sgjconfig.withdrawfee, targetAddress, userid,timestamp,sgjconfig.coinurl) if (!data.success) { beforeusdt = player.diamond afterusdt = (Number(player.diamond) + Number(amount)).toFixed(2) player.diamond = (Number(player.diamond)+Number(amount)).toFixed(2) response.usdt = player.diamond var diamondrecord = new app.models.DiamondRecord({ _id: uuid.v1(), playerId: player._id, dType: 24,//withdraw fail dSource: beforeusdt , dSwap: record.amount, dNow: afterusdt, tableId: amount }); SGJUserTongji.usdt = afterusdt SGJUserTongji.feeconfigusdt = (Number(SGJUserTongji.feeconfigusdt) -Number(sgjconfig.withdrawfee)).toFixed(2)//下注 record.time = Date.now() record.callBackTime = Date.now() record.msg = data.message record.status = 2 yield record.saveAsync(); yield player.saveAsync() yield diamondrecord.saveAsync() yield SGJUserTongji.saveAsync() response.code = "1" response.message = record.msg return self.writeOut(response, res); } return self.writeOut(response, res); }), app.getServerId()) .then(() => app.event.emit('transactionSuccess'), () => app.event.emit('transactionFail')); }); proto.getTodaySJC = function (){ var today = new Date(); today.setHours(0); today.setMinutes(0); today.setSeconds(0); today.setMilliseconds(0); let jrsjc = today.getTime(); // console.warn("111得到今日0点的时间戳 ",jrsjc, typeof jrsjc); return jrsjc; }; proto.clearAsync = P.coroutine(function* (query, method, res){ var app = this.app; var self = this query["all"] = 1 return app.memdb.goose.transactionAsync(P.coroutine(function* () { let SGJTables = yield app.models.SGJTables.findMongoAsync() for (var i = 0; i < SGJTables.length; i++) { console.warn("688 SGJTables:",SGJTables[i]._id) yield app.models.SGJTables.removeAsync({_id : SGJTables[i]._id}); yield SGJTables[i].removeAsync() } if (query["Player"]||query["all"]) { var players = yield app.models.Player.findMongoAsync() for (var i = 0; i < players.length; i++) { console.warn("685 players:", players[i].userId) yield players[i].removeAsync() } } if (query["Mails"]||query["all"]) { var players = yield app.models.Mails.findMongoAsync() for (var i = 0; i < players.length; i++) { console.warn("685 players:", players[i].userId) //yield players[i].saveAsync() yield players[i].removeAsync() } } if (query["UsdtPayRecord"]||query["all"]) { var players = yield app.models.UsdtPayRecord.findMongoAsync() for (var i = 0; i < players.length; i++) { console.warn("UsdtPayRecord:", players[i].userId) yield players[i].removeAsync() } } if (query["UsdtWithdrawRecord"]||query["all"]) { var players = yield app.models.UsdtWithdrawRecord.findMongoAsync() for (var i = 0; i < players.length; i++) { console.warn("UsdtWithdrawRecord:", players[i].userId) yield players[i].removeAsync() } } if (query["UsdtWithdrawRecord"]||query["all"]) { var players = yield app.models.UsdtWithdrawRecord.findMongoAsync() for (var i = 0; i < players.length; i++) { console.warn("UsdtWithdrawRecord:", players[i].userId) yield players[i].removeAsync() } } if (query["SGJUser"]||query["all"]) { var players = yield app.models.SGJUser.findMongoAsync() console.warn("707 players", players) for (var i = 0; i < players.length; i++) { console.warn("SGJUser:", players[i].userId) yield players[i].removeAsync() } } if (query["SGJTables"]||query["all"]) { var players = yield app.models.SGJTables.findMongoAsync() for (var i = 0; i < players.length; i++) { console.warn("SGJTables:", players[i].userId) yield players[i].removeAsync() } } if (query["SGJTask"]||query["all"]) { var players = yield app.models.SGJTask.findMongoAsync() for (var i = 0; i < players.length; i++) { console.warn("SGJTask:",players[i].userId) yield players[i].removeAsync() } } if (query["UsdtWithdrawRecord"]||query["all"]) { var players = yield app.models.UsdtWithdrawRecord.findMongoAsync() for (var i = 0; i < players.length; i++) { console.warn("UsdtWithdrawRecord:",players[i].userId) yield players[i].removeAsync() } } if (query["SGJPaiHang"]||query["all"]) { var players = yield app.models.SGJPaiHang.findMongoAsync() for (var i = 0; i < players.length; i++) { console.warn("SGJPaiHang:",players[i].userId) yield players[i].removeAsync() } } if (query["SGJMRRS"]||query["all"]) { var players = yield app.models.SGJMRRS.findMongoAsync() for (var i = 0; i < players.length; i++) { console.warn("SGJMRRS:",players[i].userId) yield players[i].removeAsync() } } if (query["SGJMRTJ"]||query["all"]) { var players = yield app.models.SGJMRTJ.findMongoAsync() for (var i = 0; i < players.length; i++) { console.warn("SGJMRTJ:",players[i].userId) yield players[i].removeAsync() } } if (query["SGJTongji"]||query["all"]) { var players = yield app.models.SGJTongji.findMongoAsync() for (var i = 0; i < players.length; i++) { console.warn("SGJTongji:",players[i].userId) yield players[i].removeAsync() } } if (query["SGJUserTongji"]||query["all"]) { var players = yield app.models.SGJUserTongji.findMongoAsync() for (var i = 0; i < players.length; i++) { console.warn("SGJTongji:",players[i].userId) yield players[i].removeAsync() } } if (query["EveryTop"]||query["all"]) { var players = yield app.models.EveryTop.findMongoAsync() for (var i = 0; i < players.length; i++) { console.warn("SGJTongji:",players[i].userId) yield players[i].removeAsync() } } if (query["Login"]||query["all"]) { var players = yield app.models.Login.findMongoAsync() for (var i = 0; i < players.length; i++) { console.warn("SGJTongji:",players[i].userId) yield players[i].removeAsync() } } if (query["SGJWJJRRWC"]||query["all"]) { var players = yield app.models.SGJWJJRRWC.findMongoAsync() for (var i = 0; i < players.length; i++) { console.warn("SGJWJJRRWC:",players[i].userId) yield players[i].removeAsync() } } if (query["GameTable"]||query["all"]) { var players = yield app.models.GameTable.findMongoAsync() for (var i = 0; i < players.length; i++) { console.warn("GameTable:",players[i].userId) yield players[i].removeAsync() } } if (query["DiamondRecord"]||query["all"]) { var players = yield app.models.DiamondRecord.findMongoAsync() for (var i = 0; i < players.length; i++) { console.warn("DiamondRecord:",players[i].userId) yield players[i].removeAsync() } } if (query["TaskQuanRecord"]||query["all"]) { var players = yield app.models.TaskQuanRecord.findMongoAsync() for (var i = 0; i < players.length; i++) { console.warn("DiamondRecord:",players[i].userId) yield players[i].removeAsync() } } if (query["sgjusertongji"]||query["all"]) { var players = yield app.models.TaskQuanRecord.findMongoAsync() for (var i = 0; i < players.length; i++) { console.warn("DiamondRecord:",players[i].userId) yield players[i].removeAsync() } } return self.writeOut('1', res); }), app.getServerId()) .then(() => app.event.emit('transactionSuccess'), () => app.event.emit('transactionFail')); }) proto.withdrawSubmit = P.coroutine(function* (amount, targetAddress, userid,timestamp, coinurl) { // https://bar-coinpay.ala456.com/api/withdraw/submit?additionalAudit=false&amount=0.01&chainCode=tron&refOrderId=ORDER20260228001&targetAddress=TD92sxkgUHHadcoSiHY6Bus5fA9rsAYAKZ×tamp=1772270280000&tokenCode=usdt&userId=123&sign=bfb1d7bf14f5217cac9204b929ca4334 var suffix = "additionalAudit=false&amount="+amount+"&chainCode=tron&refOrderId=ORDER"+timestamp+"&targetAddress="+targetAddress+"×tamp="+timestamp+"&tokenCode=usdt&userId="+userid console.warn("suffix:",suffix) var md5str = suffix+"&key=1bU4uOEs4kZoQA0D55mzAwBr2NlN9o40" var sign = md5(md5str).toLowerCase(); console.warn("sign:",sign) suffix = suffix +"&sign="+sign return new Promise((resolve, reject) => { let postDataStr = ''; let options = { hostname: coinurl, port: '', path: '/api/withdraw/submit?'+suffix, method: 'POST', rejectUnauthorized: false, requestCert: true, headers: { 'Content-Type': 'Application/json', "Content-Length":Buffer.byteLength(JSON.stringify(postDataStr)), } }; //const url = 'https://bar-coinpay.ala456.com/api/withdraw/submit?' + suffix; var req = https.request(options, (res) => { res.setEncoding('utf8'); // if (res.statusCode !== 200) { // console.warn(res) // const errMsg = `请求失败,状态码: ${res.statusCode}`; // console.warn("res:", res.statusCode); // return reject(new Error(errMsg)); // } let data = ''; res.on('data', (chunk) => { console.warn("chunk:", chunk); data += chunk; }); res.on('end', function() { console.warn("end"); try { const parsedData = JSON.parse(data); //console.warn("226 player:", userid, parsedData.data.address); // 这里返回解析后的数据,供后续yield使用 resolve(parsedData); } catch (e) { const parseErr = new Error(`JSON 解析失败: ${e.message}`); console.warn(parseErr.message); reject(parseErr); } }); }).on('error', err => { console.error('请求错误:', err); reject(err); }); req.write(JSON.stringify(postDataStr)); }); }); function checkUSDTSign(query) { var sortedKeys = Object.keys(query) .filter(function(key) { if (key == 'hash') { return query[key].length > 0 }// 替换箭头函数为 function 声明 return key !== 'sign'; // 跳过 sign 参数 }) .sort(); // 3. 拼接键值对(替换箭头函数) var queryStr = sortedKeys .map(function(key) { if (key=='hash' && query[key]=='') { return } var value = (query[key] === undefined || query[key] === null) ? '' : String(query[key]); return key + '=' + value; // 避免模板字符串,用字符串拼接更兼容 }) .join('&'); var signKey = md5(queryStr+"&key=1bU4uOEs4kZoQA0D55mzAwBr2NlN9o40").toLowerCase(); console.warn("queryStr:",queryStr) console.warn("signKey:",signKey) var sign = query["sign"] console.warn("sign:",sign) if (sign!=signKey) return false; return true; }; function checkFishUSDTSign(query) { var sortedKeys = Object.keys(query) .filter(function(key) { if (key == 'hash') { return query[key].length > 0 }// 替换箭头函数为 function 声明 return key !== 'sign'; // 跳过 sign 参数 }) .sort(); // 3. 拼接键值对(替换箭头函数) var queryStr = sortedKeys .map(function(key) { if (key=='hash' && query[key]=='') { return } var value = (query[key] === undefined || query[key] === null) ? '' : String(query[key]); return key + '=' + value; // 避免模板字符串,用字符串拼接更兼容 }) .join('&'); var signKey = md5("TGv4NBh80V7JbED39xyjX6PdsWnHZK2tcpAueFMm"+queryStr).toLowerCase(); console.warn("queryStr:",queryStr) console.warn("signKey:",signKey) var sign = query["sign"] console.warn("sign:",sign) if (sign!=signKey) return false; return true; }; proto.withdrawRecordAsync = P.coroutine(function* (query, method, res) { var userid = query["userid"] var limit = query["limit"] var page = query["page"] var response = {} response.code = "0" response.message = "" if (!userid) { response.code = "1" response.message = "param is wrong" return this.writeOut(response, res); } /* (!checkUSDTSign(query)) { response.code = "1" response.message = "验证签名错误" return this.writeOut(response, res); }*/ if (!page) { page = 0 } if (!limit) { limit = 0 } var skip = Number(page)*Number(limit) var self = this var app = this.app return app.memdb.goose.transactionAsync(P.coroutine(function* () { let players = yield app.models.Player.findMongoAsync({userId:userid}); if (players.length == 0) { response.code = "1" response.message = "user not exist" return self.writeOut(response, res); } var player = players[0] let count = yield app.models.UsdtWithdrawRecord.countMongoAsync({ userId: player.userId}) response.count = count let records = yield app.models.UsdtWithdrawRecord.findMongoAsync({ userId: player.userId},{},{sort:{submitTime: -1},skip:skip, limit: Number(limit)}); response.data = records return self.writeOut(response, res); }), app.getServerId()) .then(() => app.event.emit('transactionSuccess'), () => app.event.emit('transactionFail')); }); proto.taskRecordAsync = P.coroutine(function* (query, method, res) { var userid = query["userid"] var limit = query["limit"] var page = query["page"] var response = {} response.code = "0" response.message = "" if (!userid) { response.code = "1" response.message = "param is wrong" return this.writeOut(response, res); } /*if (!checkUSDTSign(query)) { response.code = "1" response.message = "验证签名错误" return this.writeOut(response, res); }*/ if (!page) { page = 0 } if (!limit) { limit = 0 } var skip = Number(page)*Number(limit) var self = this var app = this.app return app.memdb.goose.transactionAsync(P.coroutine(function* () { let count = yield app.models.SGJTask.countMongoAsync({ userId: userid,state: 3 }) response.count = count let records = yield app.models.SGJTask.findMongoAsync({ userId: userid,state: 3 },{},{sort:{lqTime: -1},skip:skip, limit: Number(limit)}); response.data = records return self.writeOut(response, res); }), app.getServerId()) .then(() => app.event.emit('transactionSuccess'), () => app.event.emit('transactionFail')); }); proto.sgjRecordAsync = P.coroutine(function* (query, method, res) { var userid = query["userid"] var limit = query["limit"] var page = query["page"] var response = {} response.code = "0" response.message = "" if (!userid) { response.code = "1" response.message = "param is wrong" return this.writeOut(response, res); } /*if (!checkUSDTSign(query)) { response.code = "1" response.message = "验证签名错误" return this.writeOut(response, res); }*/ if (!page) { page = 0 } if (!limit) { limit = 10 } var skip = Number(page)*Number(limit) var self = this var app = this.app return app.memdb.goose.transactionAsync(P.coroutine(function* () { let players = yield app.models.Player.findMongoAsync({userId:userid}); if (players.length == 0) { response.code = "1" response.message = "user not exist" return this.writeOut(response, res); } let count = yield app.models.DiamondRecord.countMongoAsync({ playerId:players[0]._id, dType: 20 }) let records = yield app.models.DiamondRecord.findMongoAsync({ playerId:players[0]._id, dType: 20 },{},{sort:{registerTime: -1},skip:skip, limit: Number(limit)}); response.count = count response.data = records return self.writeOut(response, res); }), app.getServerId()) .then(() => app.event.emit('transactionSuccess'), () => app.event.emit('transactionFail')); }); proto.payRecordAsync = P.coroutine(function* (query, method, res) { var userid = query["userid"] var limit = query["limit"] var page = query["page"] var response = {} response.code = "0" response.message = "" if (!userid) { response.code = "1" response.message = "param is wrong" return this.writeOut(response, res); } //if (!checkUSDTSign(query)) { //response.code = "1" //response.message = "验证签名错误" //return this.writeOut(response, res); //} if (!page) { page = 0 } if (!limit) { limit = 0 } var skip = Number(page)*Number(limit) var self = this; var app = this.app; return app.memdb.goose.transactionAsync(P.coroutine(function* () { let count = yield app.models.UsdtPayRecord.countMongoAsync({ clientId: userid }) response.count = count let records = yield app.models.UsdtPayRecord.findMongoAsync({ clientId: userid },{},{sort:{timestamp: -1},skip:skip, limit: Number(limit)}); response.data = records return self.writeOut(response, res); }), app.getServerId()) .then(() => app.event.emit('transactionSuccess'), () => app.event.emit('transactionFail')); }); proto.chargeUsdt = P.coroutine(function* (playerid,amount) { let player = yield this.app.models.Player.findByIdAsync(playerid); player.diamond += amount player.totalMoney += amount yield player.saveAsync() }); proto.returnUsdt = P.coroutine(function* (playerid,userid,amount) { this.lconfigCommon = new configCommon(this.app); yield this.lconfigCommon.senMailToPlayer(playerid,userid,23,23,1,1,amount,"sgjSys"); }); proto.withdrawOkAsync = P.coroutine(function* (query, method, res) { //{"hash":"eaf94f7eff192ff4eb49338bc2c5dd286034cf40b73df81dd4990d8ff3dea0bb","refOrderId":"ORDER20240228001","amount":0.01,"status":0,"message":"\u6210\u529F","fees":0,"feesU":0.123322,"timestamp":1772271039176,"sign":"968121dcd20682ab9dc296296b6aca46"} // delete require.cache[require.resolve('./conf.json')]; var hash = query["hash"] var refOrderId = query["refOrderId"] var am = query["amount"] var status = query["status"] var fees = query["fees"] var feesU = query["feesU"] var timestamp = query["timestamp"] var response = {} response.code = "0" response.message = "" if (!checkUSDTSign(query)) { response.code = "1" response.message = "验证签名错误" return this.writeOut(response, res); } console.warn("query:",query) var self = this; var app = this.app; return app.memdb.goose.transactionAsync(P.coroutine(function* () { console.warn("refOrderId:",refOrderId) let records = yield app.models.UsdtWithdrawRecord.findMongoAsync({ refOrderId: refOrderId }); if (records.length > 0) { var record = records[0] if ((record.amount-record.submitfee).toFixed(2) != am.toFixed(2) ) { response.code = "1" response.message = "金额不匹配" console.warn("1208") return self.writeOut(response, res); } if (record.status == status){ response.code = +"1" response.message = "状态重复" console.warn("1214") return self.writeOut(response, res); } if (record.status != 100){ response.code = "1" response.message = "status already dealed" console.warn("1220") return self.writeOut(response, res); } record.status = status record.hash = hash record.fees = fees record.feesU = feesU record.callBackTime = timestamp record.time = timestamp var player = null var players = yield app.models.Player.findMongoAsync({ userId: Number(record.userId) }); if (record.status != 0) { if (players.length > 0) { player = players[0] record.resultbeforeusdt =player.diamond player.diamond += record.amount record.resultafterusdt =player.diamond yield player.saveAsync() //only withdraw fail can return money var diamondrecord = new app.models.DiamondRecord({ _id: uuid.v1(), playerId: player._id, dType: 24,//withdraw fail dSource: record.resultbeforeusdt , dSwap: record.amount, dNow: record.resultafterusdt, tableId: refOrderId }); yield diamondrecord.saveAsync() } } if (record.status == 0) { if (players.length > 0) { player = players[0] player.cost += am yield player.saveAsync(); } var SGJUserTongjis = yield app.models.SGJUserTongji.findMongoAsync({todaytime:self.getTodaySJC()}) var SGJUserTongji = null if (SGJUserTongjis.length == 0) { SGJUserTongji = app.models.SGJUserTongji({ _id: uuid.v1(), //userId: player.userId, //usdt: player.diamond, withdrawusdt: am,//下注 todaytime: self.getTodaySJC() }); yield SGJUserTongji.saveAsync() }else { SGJUserTongji = SGJUserTongjis[0] console.warn("SGJUserTongji:",SGJUserTongji) //SGJUserTongji.usdt = player.diamond, SGJUserTongji.withdrawusdt = (Number(SGJUserTongji.withdrawusdt) +Number(am)).toFixed(2)//下注 yield SGJUserTongji.saveAsync() } } yield record.saveAsync(); if (record.status!==0 && player !== null) { //self.returnUsdt(player._id,player.userId,record.amount) } return self.writeOut(response, res); } else { // console.warn("充值失败-------------------重复处理:"); return self.writeOut('this order already dealed', res); } }), app.getServerId()) .then(() => app.event.emit('transactionSuccess'), () => app.event.emit('transactionFail')); }); proto.payUsdtAsync = P.coroutine(function* (query,res) { // delete require.cache[require.resolve('./conf.json')]; let conf2 = require('./conf.json'); const VALUES = conf2.pay_diamonds || {}; const GIVEV = conf2.give_diamonds || {}; //var value = VALUES[total_fee]; var total_fee = query["amount"] var value = total_fee; var response = {} response.code = "0" response.message = "" if (!value || !query["sourceAddress"] || !query["targetAddress"]) { var response = {} response.code = "1" response.message = "param is wrong" return this.writeOut(response, res); } if (!this.isNumeric(query["clientId"])) { var response = {} response.code = "1" response.message = "param is wrong" return this.writeOut(response, res); } var self = this; var app = this.app; var total_fee = query["amount"] if (!checkUSDTSign(query)) { response.code = "1" response.message = "校验签名失败" return this.writeOut(response, res); } return app.memdb.goose.transactionAsync(P.coroutine(function* () { //var record = yield app.models.PayRecord.findByIdAsync(out_trade_no, 'playerId paystate paydiamond payreward'); // {"amount":0.01,"chainCode":"tron","clientId":"user001","code":"usdt","hash":"6bcc085b47886c4268409678ec19867bbdf4bcccf3bfcf37a8fa9b05587e98d2","sourceAddress":"TNPGfRjRDApdT8nKjSE2fPR7VNtphEYxvK","targetAddress":"TUqHmzKbscBqdUZsCZDju9WnQQpX6K7c6u","risk":false,"timestamp":1772266248790,"sign":"35241a47dcf4af2f528620ceeb0888ed"} // 充值订单 let rec = yield app.models.UsdtPayRecord.findMongoAsync({ hash: query["hash"] }); if (rec.length == 0) { var record = new app.models.UsdtPayRecord({ _id: uuid.v1(), // 订单号 chainCode: query["chainCode"], // 玩家ID clientId: query["clientId"], // 支付玩家ID code: query["code"], // 总金额 amount: query["amount"], // 支付方式 0为微信 1为支付宝 hash: query["hash"], // 支付状态 0未支付 1成功 sourceAddress: query["sourceAddress"], // 充值钻石 targetAddress: query["targetAddress"], // 充值奖励 risk: query["risk"], // 充值奖励 timestamp: query["timestamp"], // 充值奖励 sign: query["sign"], // 充值奖励 time: Date.now(), // 时间戳 }); var playerId = query["clientId"] var players = yield app.models.Player.findMongoAsync({ userId: Number(playerId) }); if (players.length > 0) { var player = players[0] var reward=0; //首充翻倍 // if(player.payReward==0) // { // player.payReward=value; // reward=value; // value=value*2; // } console.warn("767:",767) var gaivevalue = GIVEV[total_fee]; // //首充或者在活动期间大额加赠 // let iszhdqj = false;////是否在活动期间 // let currtime = Date.now(); // if(currtime >= 1601481600000 && currtime < 1602172800000 ) iszhdqj = true;///10月1号0点 ~ 10月9号0点 // if((player.totalMoney==0 || iszhdqj ) && gaivevalue > 0)//首充大额加赠 // { // player.payReward=gaivevalue; // reward=gaivevalue; // value+=gaivevalue; // } ////平时充值 if(gaivevalue > 0)//首充大额加赠 { player.payReward=gaivevalue; reward=gaivevalue; value+=gaivevalue; } // console.warn("充值金额 : 本次冲之前钻石数 本次充值金额 本次充值奖励",player.diamond,total_fee,gaivevalue,reward,value); let dSource=player.diamond; let dNow=player.diamond+value; record.beforeusdt = player.diamond player.diamond += value; player.totalMoney += total_fee; record.afterusdt = player.diamond console.warn("958:",958) yield player.saveAsync(); var SGJUserTongjis = yield app.models.SGJUserTongji.findMongoAsync({todaytime:self.getTodaySJC()}) var SGJUserTongji = null if (SGJUserTongjis.length == 0) { SGJUserTongji = app.models.SGJUserTongji({ _id: uuid.v1(), //userId: player.userId, //usdt: player.diamond, rechargeusdt: value,//下注 todaytime: self.getTodaySJC() }); yield SGJUserTongji.saveAsync() }else { SGJUserTongji = SGJUserTongjis[0] console.warn("SGJUserTongji:",SGJUserTongji) //SGJUserTongji.usdt = player.diamond, SGJUserTongji.rechargeusdt = (Number(SGJUserTongji.rechargeusdt) +Number(value)).toFixed(2)//下注 yield SGJUserTongji.saveAsync() } // 钻石记录 var diamondrecord = new app.models.DiamondRecord({ _id: uuid.v1(), playerId: player._id, dType: 2,//充值 dSource: dSource, dSwap: value, dNow: dNow, tableId: query["hash"], }); console.warn("diamondrecord:",diamondrecord) yield diamondrecord.saveAsync(); //record = new app.models.PayRecord({ _id: out_trade_no, playerId: playerId, total_fee: total_fee }); console.warn("record:",record) yield record.saveAsync(); let wjsx = yield app.models.PayLimit.findByIdAsync(playerId, 'userId name paytotal dataTime'); if (wjsx) { let jjrStart = getTodaySJC();////今日0时的时间戳 wjsx.userId = player.userId; wjsx.name = player.name; if(jjrStart == wjsx.dataTime){ wjsx.paytotal += total_fee; } else{ wjsx.paytotal = total_fee; wjsx.dataTime = jjrStart; } yield wjsx.saveAsync(); } }else { yield record.saveAsync() return self.writeOut(response, res); } return self.writeOut(response, res); //return self.writeOut('999999', res); } else { response.code = "1"; response.message = "order already exist"; // console.warn("充值成功-------------------重复处理:"); return self.writeOut(response, res); } }), app.getServerId()) .then(() => app.event.emit('transactionSuccess'), () => app.event.emit('transactionFail')); }); //记牌器充值 proto.payJiPaiQiAsync = P.coroutine(function* (playerId, out_trade_no, total_fee, res) { var self = this; var app = this.app; return app.memdb.goose.transactionAsync(P.coroutine(function* () { var record = yield app.models.PayRecord.findByIdAsync(out_trade_no, 'playerId paystate paydiamond payreward'); if (record) { if(record.paystate>0) { // console.warn("充值成功-------------------重复处理:"); return self.writeOut('5', res); } playerId = record.playerId; var player = yield app.models.Player.findByIdAsync(playerId, 'userId diamond totalMoney payReward'); if (player) { let currtime = Date.now(); //下面是修改或创建记牌器购买信息记录 let isBuyed = false;//是否购买过 let jipaiqi = yield app.models.JiPaiQi.findByIdAsync(playerId, 'times0 times1 times2 jpqdqsj lastBuyTime'); if (jipaiqi) { isBuyed = (jipaiqi.times1 > 0 || jipaiqi.times2 > 0); if(jipaiqi.jpqdqsj > currtime ) currtime = jipaiqi.jpqdqsj;//还未到期提前充值 } //下面是在充值完成之后修改玩家的记牌器到期时间 let czts = 0;//充值天数 if(total_fee == 1800 || (!isBuyed && total_fee == 900)) czts = 7; if(total_fee == 5800 || (!isBuyed && total_fee == 2900)) czts = 30; if(czts == 0) return self.writeOut('4', res); let jpqdqsj = currtime + czts*86400000;//记牌器到期时间 if (!jipaiqi) { //这里是未免费试用直接购买,则把免费试用的时长加上去 jpqdqsj += 3*86400000; } player.totalMoney += total_fee; yield player.saveAsync(); if (jipaiqi) { if(czts == 7) jipaiqi.times1 += 1; else if(czts == 30) jipaiqi.times2 += 1; jipaiqi.jpqdqsj = jpqdqsj; jipaiqi.lastBuyTime = Date.now(); yield jipaiqi.saveAsync(); } else{ let times1 = 0; let times2 = 0; if(czts == 7) times1 = 1; else if(czts == 30) times2 = 1; // 记牌器购买信息 var newjpq = new app.models.JiPaiQi({ _id: playerId, userId: player.userId, times0: 0, times1: times1, times2: times2, jpqdqsj: jpqdqsj, lastBuyTime: Date.now(), }); yield newjpq.saveAsync(); } //下面是修改支付记录 record.paystate=1; record.paydiamond=0; record.payreward=0; yield record.saveAsync(); //下面是修改玩家今日充值总数,用于玩家每日充值上限 let wjsx = yield app.models.PayLimit.findByIdAsync(playerId, 'userId name paytotal dataTime'); if (wjsx) { let jjrStart = getTodaySJC();////今日0时的时间戳 wjsx.userId = player.userId; wjsx.name = player.name; if(jjrStart == wjsx.dataTime){ wjsx.paytotal += total_fee; } else{ wjsx.paytotal = total_fee; wjsx.dataTime = jjrStart; } yield wjsx.saveAsync(); } } return self.writeOut('999999', res); } else { // console.warn("充值成功-------------------重复处理:"); return self.writeOut('6', res); } }), app.getServerId()) .then(() => app.event.emit('transactionSuccess'), () => app.event.emit('transactionFail')); }); //ts++签名验证 function checkSign(sign) { var signKey = 'defe6d21422c8b770767f74fcea95'; if (sign!=signKey) return false; return true; }; //TL++,得到今日0点的时间戳 function getTodaySJC() { var today = new Date(); today.setHours(0); today.setMinutes(0); today.setSeconds(0); today.setMilliseconds(0); let jrsjc = today.getTime(); // console.warn("111得到今日0点的时间戳 ",jrsjc, typeof jrsjc); return jrsjc; }; //TL++,得到目前距离整点时间差 function getjlzdsjc(jrStart) { let date = new Date(Date.now()); let year = date.getFullYear(); let month = (date.getMonth() + 1); let day = date.getDate(); let hour = date.getHours() + 1; let minute = 0; let second = 0; let zdsjccz = 0;////当前时间距离整点的时间差 if(hour == 24){ zdsjccz = jrStart + 86400000 - Date.now();////整点时间戳差值 // console.warn("得到目前距离整点时间差 ",zdsjccz,typeof zdsjccz); } else{ date.setHours(hour); date.setMinutes(0); date.setSeconds(0); date.setMilliseconds(0); let zdsjc = date.getTime();//(number) zdsjccz = zdsjc - Date.now();////整点时间戳差值 // console.warn("得到目前距离整点时间差 ",Date.now(),zdsjc,zdsjccz,typeof zdsjc); } return zdsjccz; }; //TL++.统计在线人数峰值等等管理后台所需要的数据 proto.timeOutHander = P.coroutine(function* () { setInterval(() => this.intervalHander(), 3600000);////每小时统计一次在线人数(记录整点在线) setInterval(() => this.intervalHander22(), 300000);////每5分钟统计一次在线人数(修改峰值) }); //TL++.每小时一次的定时器处理 proto.intervalHander = P.coroutine(function* () { yield this.setData(); }); //TL++.每10分钟一次的定时器处理 proto.intervalHander22 = P.coroutine(function* () { yield this.setData(); }); //TL++.统计在线人数峰值等等管理后台所需要的数据 proto.setData = P.coroutine(function* () { var self = this; var app = this.app; return app.memdb.goose.transactionAsync(P.coroutine(function* () { let nowtime = Date.now(); let date = new Date(nowtime); let hour = date.getHours(); ///查询现在有多少人在线 var opts = { rTableId: { $gte: 1, $lt: 9999999 }}; var onlineCount = yield app.models.Player.countMongoAsync(opts); if(nowtime >= self.jrStart + 86400000){//// 86400000 self.jrStart = getTodaySJC();////更新今日0时的时间戳 } let daysTop = yield app.models.EveryTop.findMongoAsync({ daytime: self.jrStart }, 'onlineList onlineTop onlineTop_t'); if (daysTop.length > 0) { ////更新今天的数据库记录 let everytop = daysTop[0]; if(everytop.onlineList.length < 24) everytop.onlineList.push(onlineCount); else { let newOnlineList = _.clone(everytop.onlineList); newOnlineList[23] = onlineCount; everytop.onlineList = newOnlineList; } if(everytop.onlineTop < onlineCount){ everytop.onlineTop = onlineCount; everytop.onlineTop_t = nowtime; } yield everytop.saveAsync(); } else{ ////创建今天的数据库记录 let newOnlineList = []; if(hour > 0){ for (var i = 0; i < hour; i++) { newOnlineList[i] = 0; } } newOnlineList.push(onlineCount); var everytop = new app.models.EveryTop({ _id: uuid.v1(), daytime: self.jrStart, onlineList: newOnlineList, onlineTop: onlineCount, onlineTop_t: nowtime, registCount: 0, loginCount: 0, payCount: 0, outRebateCount: 0 }); yield everytop.saveAsync(); ////修改昨日的数据库记录 let zrdaysTop = yield app.models.EveryTop.findMongoAsync({ daytime: self.jrStart-86400000 }, 'registCount loginCount payCount outRebateCount'); if (zrdaysTop.length > 0) { let zrregistCount = 0; let zrloginCount = 0; let zrpayCount = 0; let zroutRebateCount = 0; let opts1 = { registerTime: { $gte: self.jrStart-86400000, $lt: self.jrStart}}; zrregistCount = yield app.models.Player.countMongoAsync(opts1) let opts2 = { lastLoginTime: { $gte: self.jrStart-86400000, $lt: self.jrStart}}; zrloginCount = yield app.models.Player.countMongoAsync(opts2) let opts3 = { time: { $gte: self.jrStart-86400000, $lt: self.jrStart},paystate: 1}; let zrpayList = yield app.models.PayRecord.findMongoAsync(opts3,"total_fee") if(zrpayList.length > 0){ for (var i = 0; i < zrpayList.length; i++) { zrpayCount += zrpayList[i].total_fee; } } let opts4 = { payTime: { $gte: self.jrStart-86400000, $lt: self.jrStart}, payState: { $gte: 2, $lte: 3} }; let zroutRebateList = yield app.models.OutRebate.findMongoAsync(opts4,"totalFee") if(zroutRebateList.length > 0){ for (var i = 0; i < zroutRebateList.length; i++) { zroutRebateCount += zroutRebateList[i].totalFee; } } let zreverytop = zrdaysTop[0]; zreverytop.registCount = zrregistCount; zreverytop.loginCount = zrloginCount; zreverytop.payCount = zrpayCount; zreverytop.outRebateCount = zroutRebateCount; yield zreverytop.saveAsync(); } } }), app.getServerId()) .then(() => app.event.emit('transactionSuccess'), () => app.event.emit('transactionFail')); }); proto.isNumeric = P.coroutine(function* (str) { // 先去除首尾空格(可选,根据你的业务需求) const trimmedStr = str.trim(); // 如果是空字符串,直接返回false if (trimmedStr === '') return false; // 尝试转换为数字 const num = Number(trimmedStr); // 判断转换结果是否为有效数字(排除 NaN) return !isNaN(num); });