支付回调

This commit is contained in:
luying
2021-11-09 19:24:00 +08:00
parent 173481a60c
commit 106493b878
26 changed files with 424 additions and 135 deletions
+34
View File
@@ -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;
}
}
+3 -4
View File
@@ -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;
+8
View File
@@ -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);
};
+73
View File
@@ -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, '');
}
}
+8 -3
View File
@@ -685,6 +685,11 @@
"integrity": "sha512-I99sngh224D0M7XgW1s120zxCt3VYQ3IQsuw3P3jbq5GG4yc79+ZjyKznyOGIQrflfylLgcfekeZW/vk0yng6A==",
"dev": true
},
"@types/underscore": {
"version": "1.11.3",
"resolved": "https://registry.npmjs.org/@types/underscore/-/underscore-1.11.3.tgz",
"integrity": "sha512-Fl1TX1dapfXyDqFg2ic9M+vlXRktcPJrc4PR7sRc7sdVrjavg/JHlbUXBt8qWWqhJrmSqg3RNAkAPRiOYw6Ahw=="
},
"@types/yargs": {
"version": "12.0.18",
"resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-12.0.18.tgz",
@@ -11118,9 +11123,9 @@
"integrity": "sha1-rOEWq1V80Zc4ak6I9GhTeMiy5Po="
},
"underscore": {
"version": "1.12.0",
"resolved": "https://registry.npmjs.org/underscore/-/underscore-1.12.0.tgz",
"integrity": "sha512-21rQzss/XPMjolTiIezSu3JAjgagXKROtNrYFEOWK109qY1Uv2tVjPTZ1ci2HgvQDA16gHYSthQIJfB+XId/rQ=="
"version": "1.13.1",
"resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.1.tgz",
"integrity": "sha512-hzSoAVtJF+3ZtiFX0VgfFPHEDRm7Y/QPjGyNo4TVdnDTdft3tr8hEkD25a1jC+TjTuE7tkHGKkhwCgs9dgBB2g=="
},
"unescape": {
"version": "1.0.1",
+2 -1
View File
@@ -27,6 +27,7 @@
"lylocal": "cross-env EGG_SERVER_ENV=lylocal npm run dev"
},
"dependencies": {
"@types/underscore": "^1.11.3",
"crc": "^3.8.0",
"cross-env": "^7.0.3",
"csprng": "^0.1.2",
@@ -42,7 +43,7 @@
"reflect-metadata": "^0.1.13",
"request": "^2.88.2",
"request-promise": "^4.2.6",
"underscore": "^1.12.0"
"underscore": "^1.13.1"
},
"devDependencies": {
"@types/mocha": "^2.2.40",
+2
View File
@@ -5,6 +5,7 @@ import 'egg';
import ExportAccount from '../../../app/controller/account';
import ExportGame from '../../../app/controller/game';
import ExportHome from '../../../app/controller/home';
import ExportSdk from '../../../app/controller/sdk';
import ExportUpdate from '../../../app/controller/update';
declare module 'egg' {
@@ -12,6 +13,7 @@ declare module 'egg' {
account: ExportAccount;
game: ExportGame;
home: ExportHome;
sdk: ExportSdk;
update: ExportUpdate;
}
}
+2
View File
@@ -8,6 +8,7 @@ type CanExportFunc = AnyFunc<Promise<any>> | AnyFunc<IterableIterator<any>>;
type AutoInstanceType<T, U = T extends CanExportFunc ? T : T extends AnyFunc ? ReturnType<T> : T> = U extends AnyClass ? InstanceType<U> : U;
import ExportAuth from '../../../app/service/Auth';
import ExportGame from '../../../app/service/Game';
import ExportSdk from '../../../app/service/Sdk';
import ExportTest from '../../../app/service/Test';
import ExportTurboCore from '../../../app/service/TurboCore';
import ExportUpdate from '../../../app/service/Update';
@@ -17,6 +18,7 @@ declare module 'egg' {
interface IService {
auth: AutoInstanceType<typeof ExportAuth>;
game: AutoInstanceType<typeof ExportGame>;
sdk: AutoInstanceType<typeof ExportSdk>;
test: AutoInstanceType<typeof ExportTest>;
turboCore: AutoInstanceType<typeof ExportTurboCore>;
update: AutoInstanceType<typeof ExportUpdate>;