import { Service } from 'egg'; import { REDIS_KEY, PAY_37_CALLBACK_CODE, SDK_37_CONST, ORDER_STATE, } from '@consts'; import { PayCallback37Data } from '../domain/sdk'; import { RedisClient } from 'redis'; import { get37Md5Sign, getRedisSubChannel } from '../pubUtils/sdkUtil'; import { pick } from 'underscore'; import { UserOrderModel } from '@db/UserOrder'; import { nowSeconds } from 'app/pubUtils/timeUtil'; import { RoleModel } from '@db/Role'; /** * Test Service */ export default class Sdk extends Service { public check37Sign(params: PayCallback37Data) { let body = pick(params, ['appid', 'uid', 'game_id', 'sid', 'actor_id', 'order_id', 'order_no', 'money', 'game_coin', 'product_id', 'time', 'ext']); let sign = get37Md5Sign(body, SDK_37_CONST.PAY_KEY); console.log('******37Sign', sign); return sign == params.sign; } public async pay37Callback(params: PayCallback37Data) { const { ctx } = this; const { app } = ctx; let checkResult = ctx.service.sdk.check37Sign(params); if(!checkResult) return ctx.service.utils.resResult(PAY_37_CALLBACK_CODE.MD5_ERR, ''); // ip校验 if(nowSeconds() - params.time > 15 * 60) { return ctx.service.utils.resResult(PAY_37_CALLBACK_CODE.TIME_IS_EXPIRED, ''); } let order = await UserOrderModel.findOrder(params.order_no); if(!order) { return ctx.service.utils.resResult(PAY_37_CALLBACK_CODE.FAIL, ''); } if(order.state != ORDER_STATE.APPLY) { return ctx.service.utils.resResult(PAY_37_CALLBACK_CODE.SUCCESS, ''); } if(order.price.toFixed(2) != params.money.toFixed(2)) { return ctx.service.utils.resResult(PAY_37_CALLBACK_CODE.PAY_ERR, ''); } let role = await RoleModel.findByRoleId(order.roleId); if(!role) { return ctx.service.utils.resResult(PAY_37_CALLBACK_CODE.ROLE_NOT_FOUND, ''); } if(role.serverId != params.sid) { return ctx.service.utils.resResult(PAY_37_CALLBACK_CODE.SERVER_NOT_FOUND, ''); } order = await UserOrderModel.check(order.roleId, order.localOrderID); if(!order) { return ctx.service.utils.resResult(PAY_37_CALLBACK_CODE.FAIL, ''); } let redisClient: RedisClient = app.context.redisClient; let name = getRedisSubChannel(REDIS_KEY.PAY_CHANNEL, app.config.env); console.log('**** channelname', name) let result = await redisClient.publishAsync(name, JSON.stringify(params)); console.log('**** result', result); if(result == 0) { return ctx.service.utils.resResult(PAY_37_CALLBACK_CODE.SERVER_IS_BUSY, ''); } return ctx.service.utils.resResult(PAY_37_CALLBACK_CODE.SUCCESS, ''); } }