Files
ZYZ/web-server/app/service/Sdk.ts
2021-11-09 20:01:36 +08:00

79 lines
3.0 KiB
TypeScript

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';
import { gameData } from 'app/pubUtils/data';
/**
* 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;
const ip = ctx.request.ip;
let checkResult = ctx.service.sdk.check37Sign(params);
if(!checkResult) return ctx.service.utils.resResult(PAY_37_CALLBACK_CODE.MD5_ERR, '');
if(gameData.whiteip.indexOf(ip) == -1) {
return ctx.service.utils.resResult(PAY_37_CALLBACK_CODE.IP_LIMIT, '');
}
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, '');
}
}