支付回调
This commit is contained in:
@@ -0,0 +1,34 @@
|
||||
import { STATUS } from '@consts';
|
||||
import { Controller } from 'egg';
|
||||
import { PayCallback37Data } from '../domain/sdk';
|
||||
|
||||
export default class SdkController extends Controller {
|
||||
|
||||
public async pay37Callback() {
|
||||
const { ctx } = this;
|
||||
const params: PayCallback37Data = ctx.request.body;
|
||||
ctx.body = await ctx.service.sdk.pay37Callback(params);
|
||||
return;
|
||||
}
|
||||
|
||||
public async treatRoleName() {
|
||||
const { ctx } = this;
|
||||
|
||||
ctx.body = ctx.service.utils.resResult(STATUS.SUCCESS, '');
|
||||
return;
|
||||
}
|
||||
|
||||
public async treatGuildName() {
|
||||
const { ctx } = this;
|
||||
|
||||
ctx.body = ctx.service.utils.resResult(STATUS.SUCCESS, '');
|
||||
return;
|
||||
}
|
||||
|
||||
public async getGuildByUser() {
|
||||
const { ctx } = this;
|
||||
|
||||
ctx.body = ctx.service.utils.resResult(STATUS.SUCCESS, '');
|
||||
return;
|
||||
}
|
||||
}
|
||||
@@ -20,10 +20,9 @@ function aesDecrypt(data, key, iv) {
|
||||
|
||||
module.exports = options => {
|
||||
return async function parmsDecode(ctx: Context, next) {
|
||||
let m = ctx.request.url.indexOf("/dev");
|
||||
let n = ctx.request.url.indexOf("/web");
|
||||
let url = ctx.request.url;
|
||||
ctx.logcode = genCode(10);
|
||||
if(m == 0 || n == 0) {
|
||||
if(url.indexOf("/dev") == 0 || url.indexOf("/web") == 0 || url.indexOf("/cb") == 0) {
|
||||
await next();
|
||||
return;
|
||||
}
|
||||
@@ -59,7 +58,7 @@ module.exports = options => {
|
||||
try{
|
||||
await next();
|
||||
} catch(e) {
|
||||
ctx.service.utils.log('ERROR', `[${ctx.request.url}] [${ctx.logcode}] err: ${e.stack}`);
|
||||
ctx.service.utils.log('ERROR', `[${ctx.request.url}] [${ctx.logcode}] err: ${(<Error>e).stack}`);
|
||||
throw e;
|
||||
}
|
||||
const resBody = ctx.body;
|
||||
|
||||
@@ -23,4 +23,12 @@ export default (app: Application) => {
|
||||
router.post('/gate/queryenter', tokenParser, controller.game.queryEnter);
|
||||
router.post('/update/getversion', controller.update.getversion);
|
||||
router.post('/web/reloadresource', app.middleware.gmTokenParser(), controller.game.reloadResource);
|
||||
|
||||
|
||||
// sdk 回调
|
||||
router.post('/cb/pay37callback', controller.sdk.pay37Callback);
|
||||
router.post('/cb/treatusername', controller.sdk.treatRoleName);
|
||||
router.post('/cb/treatguildname', controller.sdk.treatGuildName);
|
||||
router.post('/cb/getguildbyuser', controller.sdk.getGuildByUser);
|
||||
|
||||
};
|
||||
|
||||
@@ -0,0 +1,73 @@
|
||||
|
||||
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, '');
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user