| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214 |
- import Koa from 'koa';
- import Router from '@koa/router';
- import Msg from './msg'; // 确保路径是正确的
- const winston = require('winston');
- const DailyRotateFile = require('winston-daily-rotate-file');
- const path = require('path');
- const bodyParser = require('koa-bodyparser');
- const CryptoJS = require("crypto-js");
- const axios = require('axios');
- const querystring = require('querystring');
- const servers = require('./serverList.json')
- const AppSecret = "67db708fdc1b3f61341db6e8551143c0"
- const AppKey = "64ba80a7e327f3f334425d8a8d897117"
- const AppId = "120"
- // var Url = 'ws://43.198.254.107:8192' //服务器地址
- const Account = "H1EqhbpA80jt0Jw6Q3T2"//ws请求密钥
- const SdkUrl = "https://sdk.87game1.com/cp/user/check"
- var orderList = []
- const logger = winston.createLogger({
- level: 'info',
- format: winston.format.json(),
- defaultMeta: { service: 'sdk-service' }
- });
- logger.add(new DailyRotateFile({
- dirname: path.join(__dirname, 'logs'),
- filename: '%DATE%.log',
- datePattern: 'YYYY-MM-DD-HH',
- zippedArchive: true,
- maxSize: '20m',
- maxFiles: '14d'
- }));
- logger.add(new winston.transports.Console({
- format: winston.format.simple(),
- }));
- const app = new Koa();
- const router = new Router();
- app.use(bodyParser());
- // 将路由应用到 Koa 应用上
- app.use(router.routes()).use(router.allowedMethods());
- // 支付回调
- router.post('/callback', async (ctx, next) => {
- let ret = {
- code: 0,
- msg: '发货失败'
- }
- var result = await callPay(ctx)
- if(result){
- ret.code = 1;
- ret.msg = '发货成功';
- }
- ctx.body = JSON.stringify(ret)
- })
- //账号验证
- router.post("/checkUserToken",async (ctx,next)=>{
- const result = await checkUserToken(ctx);
- let data = {"status":false,"sign":""}
- if(result != ""){
- data.status = true
- data.sign = result
- }
- ctx.body = data
- })
- // router.post('/testCallback', async (ctx, next) => {
- // //发货
- // // 使用 Msg 类的 connect 方法连接到 WebSocket 服务器
- // Msg.connect(Url, Account);
-
- // // 在适当的时机,调用 CG_ASK_LOGIN 方法
- // let params = `{"account":"23417","order":"123456","id":102,"cnt":100,"money":6}`
- // setTimeout(function() {
- // console.log("这个消息将在3秒后打印出来");
- // Msg.CG_ASK_LOGIN(Account, 0, "", 'cn', 'CN',Url, params);
- // }, 3000);
- // ctx.body = "ok"
- // })
- router.get('/serverList',async (ctx,next)=>{
- let id = ctx.query.id
- console.log(getServerList(id))
- ctx.body = servers
- })
- app.listen(3000);
- //根据区服id获取地址
- const getServerList = (serverId) => {
- for(let i=0;i<servers.length;i++){
- if(servers[i].id == serverId){
- return 'ws://'+servers[i].ip+':'+ servers[i].port
- }
- }
- }
- //支付回调逻辑
- const callPay = async(ctx)=>{
- let data = ctx.request.body
- let sign = data.sign
- let serverId = data.serverId
- logger.info("pay callback params:",{"url":ctx.href,"params":data})
- //签名参数
- let signData = Object.keys(data).filter(key => key !== 'sign');
- let signStr = signData.map(key => `${data[key]}`).join('');
- signStr += AppSecret
- let newSign = CryptoJS.MD5(signStr).toString();
- console.log("signStr:",signStr)
- console.log("newSign:",newSign)
- if(sign != newSign){
- console.log("签名错误:",signStr,newSign,sign)
- return false
- }
- console.log(111,orderList)
- if(orderList.includes(data.orderId)){
- logger.error("订单号无效",data.orderId)
- return false
- }
- let url = getServerList(serverId)
- if(!url){
- console.log("区服id错误")
- return false
- }
- //发货
- // 使用 Msg 类的 connect 方法连接到 WebSocket 服务器
- Msg.connect(url, Account);
-
- let orgMemId = data.uid
- let orgOderId = data.cpOrder
- let orgProductId = data.orderId
- let orgExt = data.cText
- let orgProductPrice = data.skuPrice
- // 在适当的时机,调用 CG_ASK_LOGIN 方法
- let params = `{"account":"${orgMemId}","order":"${orgOderId}","id":${orgProductId},"cnt":100,"money":${orgProductPrice}}`
- setTimeout(function() {
- console.log("这个消息将在3秒后打印出来");
- Msg.CG_ASK_LOGIN(Account, 0, "", 'cn', 'CN',ctx.request.ip, params);
- }, 3000);
- orderList.push(data.order_id)
- return true
- }
- //验证账号
- const checkUserToken = async(ctx)=>{
- let id = AppId
- let key = AppKey
- let memId = ctx.request.body.mem_id
- let userToken = ctx.request.body.user_token
- let signStr = `app_id=${id}&mem_id=${memId}&user_token=${userToken}&app_key=${key}`
- console.log("signStr",signStr)
- let sign = CryptoJS.MD5(signStr).toString()
- let params = {
- "app_id": AppId,
- "mem_id":memId,
- "user_token":userToken,
- "sign":sign
- }
- logger.info("req params",{"url":SdkUrl,"params":params})
- var ret = axios.post(SdkUrl, params)
- .then(function (response) {
- // 处理成功的情况
- logger.info("sdk resp data",response.data)
- if(response.data.status ==1){
- return sign
- }
- return ""
- })
- .catch(function (error) {
- // 处理错误的情况
- logger.error("请求sdk服务器错误:"+error.response.statusText)
- return ""
- });
- return ret
- }
|