支付回调
This commit is contained in:
@@ -125,6 +125,7 @@ app.configure(ALL_ENVS, 'systimer', function () {
|
|||||||
app.afterStart(async () => {
|
app.afterStart(async () => {
|
||||||
await redisService.initAllRank();
|
await redisService.initAllRank();
|
||||||
await timeTaskService.init();
|
await timeTaskService.init();
|
||||||
|
redisService.redisSubScribe();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -163,6 +164,8 @@ function initMongodb(app: _pinus.Application) {
|
|||||||
function initRedis(app: _pinus.Application) {
|
function initRedis(app: _pinus.Application) {
|
||||||
const redisClient = connectRedis(app.get('database').redis, app.get('database').redispw);
|
const redisClient = connectRedis(app.get('database').redis, app.get('database').redispw);
|
||||||
app.set('redis', redisClient);
|
app.set('redis', redisClient);
|
||||||
|
const redisClientPub = connectRedis(app.get('database').redis, app.get('database').redispw);
|
||||||
|
app.set('redisPub', redisClientPub); // 发布订阅机
|
||||||
redLockService.initRedlock(redisClient);
|
redLockService.initRedlock(redisClient);
|
||||||
redlockCacheService.init();
|
redlockCacheService.init();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -89,7 +89,7 @@ export class GachaHandler {
|
|||||||
}
|
}
|
||||||
// 给东西
|
// 给东西
|
||||||
// console.log('****', heroInfo)
|
// console.log('****', heroInfo)
|
||||||
let { heroes } = await createHeroes(roleId, roleName, sid, serverId, heroInfo);
|
let { heroes, resultHeroes } = await createHeroes(roleId, roleName, sid, serverId, heroInfo);
|
||||||
await addItems(roleId, roleName, sid, items);
|
await addItems(roleId, roleName, sid, items);
|
||||||
// 更新数据
|
// 更新数据
|
||||||
userGacha = await UserGachaModel.updateInfo(roleId, gachaId, activityId, {
|
userGacha = await UserGachaModel.updateInfo(roleId, gachaId, activityId, {
|
||||||
@@ -102,7 +102,7 @@ export class GachaHandler {
|
|||||||
await checkTask(roleId, sid, TASK_TYPE.GASHA, count, true, {});
|
await checkTask(roleId, sid, TASK_TYPE.GASHA, count, true, {});
|
||||||
//活动统计
|
//活动统计
|
||||||
await checkActivityTask(serverId, sid, roleId, TASK_TYPE.GASHA, count)
|
await checkActivityTask(serverId, sid, roleId, TASK_TYPE.GASHA, count)
|
||||||
for (let hero of heroes) {
|
for (let hero of resultHeroes) {
|
||||||
activityData.push({ hid: hero.hid, quality: hero.quality });
|
activityData.push({ hid: hero.hid, quality: hero.quality });
|
||||||
}
|
}
|
||||||
await checkActivityTask(serverId, sid, roleId, TASK_TYPE.GACHA_QUALITY_COUNT, count, { heroes: activityData })
|
await checkActivityTask(serverId, sid, roleId, TASK_TYPE.GACHA_QUALITY_COUNT, count, { heroes: activityData })
|
||||||
@@ -115,7 +115,9 @@ export class GachaHandler {
|
|||||||
return resResult(STATUS.SUCCESS, {
|
return resResult(STATUS.SUCCESS, {
|
||||||
gachaId, activityId,
|
gachaId, activityId,
|
||||||
freeCount, refFreeTime: resultRefFreeTime, count: userGacha.count, point: userGacha.point, floor, hope,
|
freeCount, refFreeTime: resultRefFreeTime, count: userGacha.count, point: userGacha.point, floor, hope,
|
||||||
heroes, result: resultList
|
heroes: resultHeroes,
|
||||||
|
addHeros: heroes,
|
||||||
|
result: resultList
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -203,9 +205,9 @@ export class GachaHandler {
|
|||||||
for (let i = 0; i < count; i++) {
|
for (let i = 0; i < count; i++) {
|
||||||
heroInfo.push({ hid: hero, count: 1 })
|
heroInfo.push({ hid: hero, count: 1 })
|
||||||
}
|
}
|
||||||
let { heroes, goods } = await createHeroes(roleId, roleName, sid, serverId, heroInfo);
|
let { heroes, resultHeroes, goods } = await createHeroes(roleId, roleName, sid, serverId, heroInfo);
|
||||||
let resultList: GachaResult[] = [];
|
let resultList: GachaResult[] = [];
|
||||||
for (let h of heroes) {
|
for (let h of resultHeroes) {
|
||||||
let result = new GachaResult(contentId);
|
let result = new GachaResult(contentId);
|
||||||
result.setHero(h.hid);
|
result.setHero(h.hid);
|
||||||
resultList.push(result);
|
resultList.push(result);
|
||||||
@@ -232,7 +234,8 @@ export class GachaHandler {
|
|||||||
point: userGacha.point,
|
point: userGacha.point,
|
||||||
turntable: userGacha.turntable,
|
turntable: userGacha.turntable,
|
||||||
result: resultList,
|
result: resultList,
|
||||||
heroes
|
addHeros: heroes,
|
||||||
|
heroes: resultHeroes
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -95,7 +95,7 @@ export class NewHeroGachaHandler {
|
|||||||
await ActivityNewHeroGachaModel.addRecord(serverId, activityId, roleId, hid, floorCount, JSON.stringify(resultList), hasGetFloor);
|
await ActivityNewHeroGachaModel.addRecord(serverId, activityId, roleId, hid, floorCount, JSON.stringify(resultList), hasGetFloor);
|
||||||
|
|
||||||
// 给东西
|
// 给东西
|
||||||
let { heroes } = await createHeroes(roleId, roleName, sid, serverId, heroInfo);
|
let { heroes, resultHeroes } = await createHeroes(roleId, roleName, sid, serverId, heroInfo);
|
||||||
await addItems(roleId, roleName, sid, items);
|
await addItems(roleId, roleName, sid, items);
|
||||||
//固定奖励
|
//固定奖励
|
||||||
let rewardParamArr: Array<RewardParam> = stringToRewardParam(item.commonReward);
|
let rewardParamArr: Array<RewardParam> = stringToRewardParam(item.commonReward);
|
||||||
@@ -103,7 +103,7 @@ export class NewHeroGachaHandler {
|
|||||||
let commonResult = await addReward(roleId, roleName, sid, serverId, newRewardParamArr)
|
let commonResult = await addReward(roleId, roleName, sid, serverId, newRewardParamArr)
|
||||||
|
|
||||||
return resResult(STATUS.SUCCESS, {
|
return resResult(STATUS.SUCCESS, {
|
||||||
hid, activityId, count, randomReward: { heroes, result: resultList }, commonReward: commonResult
|
hid, activityId, count, randomReward: { heroes: resultHeroes, result: resultList }, commonReward: commonResult
|
||||||
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,10 +7,8 @@ import _ = require('underscore');
|
|||||||
import { applyOrderWX, checkOrderWX } from '../../../services/pay/weixinPay';
|
import { applyOrderWX, checkOrderWX } from '../../../services/pay/weixinPay';
|
||||||
import { applyOrderALI, checkOrderALI } from '../../../services/pay/aliPay';
|
import { applyOrderALI, checkOrderALI } from '../../../services/pay/aliPay';
|
||||||
import { applyOrder37 } from '../../../services/pay/37Pay';
|
import { applyOrder37 } from '../../../services/pay/37Pay';
|
||||||
import { makeOrder } from '../../../services/orderService';
|
import { makeOrder, settleOrder, settleOrderAli, settleOrderWx } from '../../../services/orderService';
|
||||||
import { addRechargeMoney } from '../../../services/activity/rechargeMoneyService';
|
import { addRechargeMoney } from '../../../services/activity/rechargeMoneyService';
|
||||||
import { ActivityModel, ActivityModelType } from '../../../db/Activity';
|
|
||||||
import { ServerlistModel } from '../../../db/Serverlist';
|
|
||||||
import { addVipRechargeMoney } from '../../../services/activity/vipRechargeMoneyService';
|
import { addVipRechargeMoney } from '../../../services/activity/vipRechargeMoneyService';
|
||||||
import { checkActivityTask } from '../../../services/taskService';
|
import { checkActivityTask } from '../../../services/taskService';
|
||||||
import { getActivityById } from '../../../services/activity/activityService';
|
import { getActivityById } from '../../../services/activity/activityService';
|
||||||
@@ -91,6 +89,7 @@ export class orderHandler {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
case PAY_TYPE.TEST:
|
||||||
case PAY_TYPE.APPLE:
|
case PAY_TYPE.APPLE:
|
||||||
{
|
{
|
||||||
break;
|
break;
|
||||||
@@ -123,9 +122,6 @@ export class orderHandler {
|
|||||||
if (!orderInfo) {
|
if (!orderInfo) {
|
||||||
return resResult(STATUS.NO_ORDER);
|
return resResult(STATUS.NO_ORDER);
|
||||||
}
|
}
|
||||||
if (orderInfo.state == ORDER_STATE.RESULT_SUCCESS) {
|
|
||||||
return resResult(STATUS.DUPLICATE_ORDER);
|
|
||||||
}
|
|
||||||
|
|
||||||
//商品价格信息
|
//商品价格信息
|
||||||
let productInfo = dicRMB.get(orderInfo.productID)
|
let productInfo = dicRMB.get(orderInfo.productID)
|
||||||
@@ -134,89 +130,53 @@ export class orderHandler {
|
|||||||
return resResult(STATUS.NO_PRODUCT_ID);
|
return resResult(STATUS.NO_PRODUCT_ID);
|
||||||
}
|
}
|
||||||
|
|
||||||
let productType = productInfo.type;//类型
|
switch (orderInfo.payType) {
|
||||||
let price = orderInfo.price;//下单时的价格
|
case PAY_TYPE.TEST:
|
||||||
let payType = orderInfo.payType;//支付类型
|
case PAY_TYPE.THREE_SEVEN:
|
||||||
let roleId = orderInfo.roleId;//角色
|
case PAY_TYPE.APPLE:
|
||||||
|
{
|
||||||
orderInfo = await UserOrderModel.check(roleId, localOrderID);
|
break;
|
||||||
if (!orderInfo) {
|
}
|
||||||
return resResult(STATUS.DUPLICATE_ORDER);
|
|
||||||
}
|
|
||||||
switch (payType) {
|
|
||||||
case PAY_TYPE.WX:
|
case PAY_TYPE.WX:
|
||||||
{
|
{
|
||||||
let weixinResult = await checkOrderWX(localOrderID);
|
let res = await settleOrderWx(orderInfo, serverId, sid);
|
||||||
if (weixinResult.code == 0) {
|
if(res.code != 0) {
|
||||||
console.log('微信订单查询失败')
|
return resResult(res);
|
||||||
return resResult(STATUS.ORDER_ERROR);
|
|
||||||
}
|
|
||||||
if (parseInt(weixinResult.data.total_fee) / 100 != price) {
|
|
||||||
console.log('订单价格错误')
|
|
||||||
return resResult(STATUS.PRICE_ERROR);
|
|
||||||
}
|
|
||||||
if (weixinResult.data.trade_state != "SUCCESS" ||
|
|
||||||
weixinResult.data.result_code != "SUCCESS" ||
|
|
||||||
weixinResult.data.return_code != "SUCCESS") {
|
|
||||||
return resResult(STATUS.NO_PAY);
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case PAY_TYPE.ALI:
|
case PAY_TYPE.ALI:
|
||||||
{
|
{
|
||||||
let aliResult = await checkOrderALI(localOrderID);
|
let res = await settleOrderAli(orderInfo, serverId, sid);
|
||||||
if (aliResult.code == 0) {
|
if(res.code != 0) {
|
||||||
console.log('支付宝订单查询失败')
|
return resResult(res);
|
||||||
return resResult(STATUS.ORDER_ERROR);
|
|
||||||
}
|
}
|
||||||
if (parseInt(aliResult.data.total_amount) != price) {
|
|
||||||
console.log('订单价格错误')
|
|
||||||
return resResult(STATUS.PRICE_ERROR);
|
|
||||||
}
|
|
||||||
if (aliResult.data.trade_status != "TRADE_SUCCESS") {
|
|
||||||
return resResult(STATUS.NO_PAY);
|
|
||||||
}
|
|
||||||
let aliOrderID = aliResult.data.trade_no;
|
|
||||||
await UserOrderModel.saveOrderID(roleId, localOrderID, aliOrderID);
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case PAY_TYPE.APPLE:
|
|
||||||
{
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
default:
|
default:
|
||||||
console.log('未知支付类型');
|
console.log('未知支付类型');
|
||||||
return resResult(STATUS.NO_PAY_TYPE);
|
return resResult(STATUS.NO_PAY_TYPE);
|
||||||
}
|
}
|
||||||
|
|
||||||
//订单成功
|
//订单成功
|
||||||
orderInfo = await UserOrderModel.success(roleId, localOrderID);
|
console.log('结算完成', localOrderID)
|
||||||
if (orderInfo) {
|
let res: any = {};
|
||||||
|
try {
|
||||||
//结算奖励
|
res = JSON.parse(orderInfo.rewardResult)
|
||||||
let result = await makeOrder(localOrderID, sid, orderInfo);
|
} catch(e) {
|
||||||
if (result.code !== 0) {//结算失败
|
console.log('order rewardResult', e);
|
||||||
console.log(`测试支付失败..... ${JSON.stringify(result)}`)
|
|
||||||
return resResult(result);
|
|
||||||
}
|
|
||||||
//推送
|
|
||||||
this.app.channelService.pushMessageByUids('onOrder', resResult(STATUS.SUCCESS, {
|
|
||||||
data: result.data,
|
|
||||||
price: price,
|
|
||||||
}), [{ uid: roleId, sid: sid }]);
|
|
||||||
//活动统计
|
|
||||||
await addRechargeMoney(roleId, serverId, price);
|
|
||||||
await addVipRechargeMoney(roleId, serverId, price);
|
|
||||||
//成长任务
|
|
||||||
await checkActivityTask(serverId, sid, roleId, TASK_TYPE.ACTIVITY_RMB, price, { activityId: orderInfo.activityId })
|
|
||||||
|
|
||||||
|
|
||||||
console.log('结算完成', localOrderID)
|
|
||||||
return resResult(STATUS.SUCCESS, result.data);
|
|
||||||
}
|
}
|
||||||
|
if(res.code && res.code != 0) {
|
||||||
return resResult(STATUS.DUPLICATE_ORDER);
|
return resResult(STATUS.APPLY_ORDER_ERROR);
|
||||||
|
}
|
||||||
|
|
||||||
|
return resResult(STATUS.SUCCESS, {
|
||||||
|
...res,
|
||||||
|
price: orderInfo.price,
|
||||||
|
state: orderInfo.state,
|
||||||
|
localOrderID: orderInfo.localOrderID
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -268,28 +228,13 @@ export class orderHandler {
|
|||||||
await UserOrderModel.applyOrder(serverId, roleId, productID, localOrderID, orderID, price, payType, activityId, paramStr, message);
|
await UserOrderModel.applyOrder(serverId, roleId, productID, localOrderID, orderID, price, payType, activityId, paramStr, message);
|
||||||
|
|
||||||
//订单成功
|
//订单成功
|
||||||
let orderInfo = await UserOrderModel.success(roleId, localOrderID);
|
let orderInfo = await UserOrderModel.findOrder(localOrderID);
|
||||||
if (orderInfo) {
|
if(!orderInfo) {
|
||||||
//结算奖励
|
return resResult(STATUS.NO_ORDER);
|
||||||
let result = await makeOrder(localOrderID, sid, orderInfo);
|
|
||||||
if (result.code !== 0) {//结算失败
|
|
||||||
console.log(`测试支付失败..... ${JSON.stringify(result)}`)
|
|
||||||
return resResult(result);
|
|
||||||
}
|
|
||||||
//推送
|
|
||||||
this.app.channelService.pushMessageByUids('onOrder', resResult(STATUS.SUCCESS, {
|
|
||||||
data: result.data,
|
|
||||||
price: price,
|
|
||||||
}), [{ uid: roleId, sid: sid }]);
|
|
||||||
//活动统计
|
|
||||||
await addRechargeMoney(roleId, serverId, price);
|
|
||||||
await addVipRechargeMoney(roleId, serverId, price);
|
|
||||||
//成长任务
|
|
||||||
await checkActivityTask(serverId, sid, roleId, TASK_TYPE.ACTIVITY_RMB, price, { activityId })
|
|
||||||
console.log(`测试支付完成!!!!!!!!!!!!! serverId:${serverId}, productID:${productID}, productType:${productType}, roleId:${roleId}, localOrderID:${localOrderID}, payType:${payType}`)
|
|
||||||
return resResult(STATUS.SUCCESS, result.data);
|
|
||||||
}
|
}
|
||||||
|
let result = await settleOrder(orderInfo, serverId, sid);
|
||||||
return resResult(STATUS.NO_ORDER, {});
|
orderInfo = await UserOrderModel.success(roleId, localOrderID, result);
|
||||||
|
console.log(`测试支付完成!!!!!!!!!!!!! serverId:${serverId}, productID:${productID}, productType:${productType}, roleId:${roleId}, localOrderID:${localOrderID}, payType:${payType}`)
|
||||||
|
return resResult(STATUS.SUCCESS, JSON.parse(result));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
import { Application, ChannelService, HandlerService, } from 'pinus';
|
import { Application, ChannelService, HandlerService, } from 'pinus';
|
||||||
import { reloadResources } from '../../../pubUtils/data';
|
import { reloadResources } from '../../../pubUtils/data';
|
||||||
|
import { settleOrderFromRedisPub } from '../../../services/orderService';
|
||||||
|
|
||||||
export default function (app: Application) {
|
export default function (app: Application) {
|
||||||
new HandlerService(app, {});
|
new HandlerService(app, {});
|
||||||
@@ -21,4 +22,8 @@ export class OrderRemote {
|
|||||||
public async reloadResources() {
|
public async reloadResources() {
|
||||||
reloadResources();
|
reloadResources();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public async settleOrderFromRedisPub(message: string) {
|
||||||
|
await settleOrderFromRedisPub(message);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -49,10 +49,10 @@ export class HeroHandler {
|
|||||||
let costResult = await handleCost(roleId, sid, [{ id: pieceId, count: pieceCount }]);
|
let costResult = await handleCost(roleId, sid, [{ id: pieceId, count: pieceCount }]);
|
||||||
if (!costResult) return resResult(STATUS.ROLE_MATERIAL_NOT_ENOUGH);
|
if (!costResult) return resResult(STATUS.ROLE_MATERIAL_NOT_ENOUGH);
|
||||||
// createHero
|
// createHero
|
||||||
let { heroes } = await createHero(roleId, roleName, sid, serverId, { hid, count: 1 });
|
let { heroes, resultHeroes } = await createHero(roleId, roleName, sid, serverId, { hid, count: 1 });
|
||||||
|
|
||||||
pushComposeOrangeHero(roleId, roleName, serverId, heroes[0]);
|
pushComposeOrangeHero(roleId, roleName, serverId, resultHeroes[0]);
|
||||||
return resResult(STATUS.SUCCESS, { curHero: heroes[0] });
|
return resResult(STATUS.SUCCESS, { curHero: resultHeroes[0], addHeros: heroes });
|
||||||
}
|
}
|
||||||
|
|
||||||
// 武将升级
|
// 武将升级
|
||||||
@@ -710,8 +710,8 @@ export class HeroHandler {
|
|||||||
}
|
}
|
||||||
let hero = await HeroModel.findByHidAndRole(hid, roleId);
|
let hero = await HeroModel.findByHidAndRole(hid, roleId);
|
||||||
if(!hero) {
|
if(!hero) {
|
||||||
let { heroes } = await createHero(roleId, roleName, sid, serverId, { hid, count: 1, ...params });
|
let { resultHeroes } = await createHero(roleId, roleName, sid, serverId, { hid, count: 1, ...params });
|
||||||
hero = heroes[0];
|
hero = resultHeroes[0];
|
||||||
}
|
}
|
||||||
hero = await HeroModel.updateHeroInfo(roleId, hid, params);
|
hero = await HeroModel.updateHeroInfo(roleId, hid, params);
|
||||||
|
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ import { RoleModel, RoleUpdate } from './../../../db/Role';
|
|||||||
import { HeroModel, HeroUpdate } from '../../../db/Hero';
|
import { HeroModel, HeroUpdate } from '../../../db/Hero';
|
||||||
import { resResult, decodeIdCntArrayStr, parseGoodStr, genCode } from '../../../pubUtils/util';
|
import { resResult, decodeIdCntArrayStr, parseGoodStr, genCode } from '../../../pubUtils/util';
|
||||||
import { Application, BackendSession, pinus, HandlerService, } from 'pinus';
|
import { Application, BackendSession, pinus, HandlerService, } from 'pinus';
|
||||||
import { handleCost, addItems, createHeroes } from '../../../services/rewardService';
|
import { handleCost, addItems } from '../../../services/rewardService';
|
||||||
import { getTitle, getTeraph, gameData, getScollByStar, getFriendLvByExp, getHeroExpByLv, getExpByLv } from '../../../pubUtils/data';
|
import { getTitle, getTeraph, gameData, getScollByStar, getFriendLvByExp, getHeroExpByLv, getExpByLv } from '../../../pubUtils/data';
|
||||||
import { SCHOOL, SCROLL, EXTERIOR, SCRIPT } from '../../../pubUtils/dicParam';
|
import { SCHOOL, SCROLL, EXTERIOR, SCRIPT } from '../../../pubUtils/dicParam';
|
||||||
import { getAtrrNameById } from '../../../consts/constModules/abilityConst'
|
import { getAtrrNameById } from '../../../consts/constModules/abilityConst'
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import { UserOrderModelType } from '../db/UserOrder';
|
import { UserOrderModel, UserOrderModelType } from '../db/UserOrder';
|
||||||
import { ACTIVITY_TYPE, STATUS } from '../consts';
|
import { ACTIVITY_TYPE, ORDER_STATE, STATUS, TASK_TYPE } from '../consts';
|
||||||
import { dicRMB } from '../pubUtils/dictionary/DicRMB';
|
import { dicRMB } from '../pubUtils/dictionary/DicRMB';
|
||||||
import { makeYuanbaoShopReward } from './activity/yuanbaoService';
|
import { makeYuanbaoShopReward } from './activity/yuanbaoService';
|
||||||
import { RoleModel } from '../db/Role';
|
import { RoleModel } from '../db/Role';
|
||||||
@@ -19,17 +19,20 @@ import { ActivityMonopolyModel, ActivityMonopolyModelType } from '../db/Activity
|
|||||||
import { ActivityMonopolyLandModel, ActivityMonopolyLandModelType } from '../db/ActivityMonopolyLand';
|
import { ActivityMonopolyLandModel, ActivityMonopolyLandModelType } from '../db/ActivityMonopolyLand';
|
||||||
import { pinus } from 'pinus';
|
import { pinus } from 'pinus';
|
||||||
import { resResult } from '../pubUtils/util';
|
import { resResult } from '../pubUtils/util';
|
||||||
|
import { checkOrderWX } from './pay/weixinPay';
|
||||||
|
import { addRechargeMoney } from './activity/rechargeMoneyService';
|
||||||
|
import { addVipRechargeMoney } from './activity/vipRechargeMoneyService';
|
||||||
|
import { checkActivityTask } from './taskService';
|
||||||
|
import { checkOrderALI } from './pay/aliPay';
|
||||||
|
import { getRoleOnlineInfo } from './redisService';
|
||||||
|
import { PayCallback37Data } from '../domain/sdk';
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 结算账单
|
* 结算账单
|
||||||
* @param localOrderID 本地订单号
|
* @param localOrderID 本地订单号
|
||||||
*/
|
*/
|
||||||
export async function makeOrder(localOrderID: string, sid: string, orderInfo: UserOrderModelType) {
|
export async function makeOrder(orderInfo: UserOrderModelType, sid: string) {
|
||||||
// let orderInfo = await UserOrderModel.findOrder(localOrderID);
|
|
||||||
|
|
||||||
//商品价格信息
|
//商品价格信息
|
||||||
let productInfo = dicRMB.get(orderInfo.productID)
|
let productInfo = dicRMB.get(orderInfo.productID)
|
||||||
@@ -144,4 +147,118 @@ export async function makeOrder(localOrderID: string, sid: string, orderInfo: Us
|
|||||||
}), [{ uid: roleId, sid }]);
|
}), [{ uid: roleId, sid }]);
|
||||||
|
|
||||||
return rewardResult
|
return rewardResult
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function settleOrder(order: UserOrderModelType, serverId: number, sid?: string) {
|
||||||
|
if(!sid) {
|
||||||
|
let onlineUser = await getRoleOnlineInfo(order.roleId);
|
||||||
|
sid = onlineUser.sid;
|
||||||
|
}
|
||||||
|
//结算奖励
|
||||||
|
let result = await makeOrder(order, sid);
|
||||||
|
if (result.code !== 0) {//结算失败
|
||||||
|
console.log(`支付失败..... ${JSON.stringify(result)}`)
|
||||||
|
return resResult(result);
|
||||||
|
}
|
||||||
|
//推送
|
||||||
|
console.log('*****', order.roleId, sid)
|
||||||
|
if(!!sid) {
|
||||||
|
pinus.app.channelService.pushMessageByUids('onOrder', resResult(STATUS.SUCCESS, {
|
||||||
|
...result.data,
|
||||||
|
price: order.price,
|
||||||
|
state: order.state,
|
||||||
|
localOrderID: order.localOrderID
|
||||||
|
}), [{ uid: order.roleId, sid }]);
|
||||||
|
}
|
||||||
|
//活动统计
|
||||||
|
await addRechargeMoney(order.roleId, serverId, order.price);
|
||||||
|
await addVipRechargeMoney(order.roleId, serverId, order.price);
|
||||||
|
//成长任务
|
||||||
|
await checkActivityTask(serverId, sid, order.roleId, TASK_TYPE.ACTIVITY_RMB, order.price, { activityId: order.activityId })
|
||||||
|
|
||||||
|
return result.data;
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function settleOrderWx(order: UserOrderModelType, serverId: number, sid: string) {
|
||||||
|
|
||||||
|
if (order.state == ORDER_STATE.RESULT_SUCCESS) {
|
||||||
|
return STATUS.DUPLICATE_ORDER;
|
||||||
|
}
|
||||||
|
order = await UserOrderModel.check(order.roleId, order.localOrderID);
|
||||||
|
if (!order) {
|
||||||
|
return STATUS.DUPLICATE_ORDER;
|
||||||
|
}
|
||||||
|
|
||||||
|
let weixinResult = await checkOrderWX(order.localOrderID);
|
||||||
|
if (weixinResult.code == 0) {
|
||||||
|
console.log('微信订单查询失败')
|
||||||
|
return STATUS.ORDER_ERROR;
|
||||||
|
}
|
||||||
|
if (parseInt(weixinResult.data.total_fee) / 100 != order.price) {
|
||||||
|
console.log('订单价格错误')
|
||||||
|
return STATUS.PRICE_ERROR;
|
||||||
|
}
|
||||||
|
if (weixinResult.data.trade_state != "SUCCESS" ||
|
||||||
|
weixinResult.data.result_code != "SUCCESS" ||
|
||||||
|
weixinResult.data.return_code != "SUCCESS") {
|
||||||
|
return STATUS.NO_PAY;
|
||||||
|
}
|
||||||
|
|
||||||
|
let result = await settleOrder(order, serverId, sid);
|
||||||
|
order = await UserOrderModel.success(order.roleId, order.localOrderID, result);
|
||||||
|
|
||||||
|
return STATUS.SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function settleOrderAli(order: UserOrderModelType, serverId: number, sid: string) {
|
||||||
|
if (order.state == ORDER_STATE.RESULT_SUCCESS) {
|
||||||
|
return STATUS.DUPLICATE_ORDER;
|
||||||
|
}
|
||||||
|
let aliResult = await checkOrderALI(order.localOrderID);
|
||||||
|
if (aliResult.code == 0) {
|
||||||
|
console.log('支付宝订单查询失败')
|
||||||
|
return STATUS.ORDER_ERROR;
|
||||||
|
}
|
||||||
|
if (parseInt(aliResult.data.total_amount) != order.price) {
|
||||||
|
console.log('订单价格错误')
|
||||||
|
return STATUS.PRICE_ERROR;
|
||||||
|
}
|
||||||
|
if (aliResult.data.trade_status != "TRADE_SUCCESS") {
|
||||||
|
return STATUS.NO_PAY;
|
||||||
|
}
|
||||||
|
let aliOrderID = aliResult.data.trade_no;
|
||||||
|
let result = await settleOrder(order, serverId, sid);
|
||||||
|
await UserOrderModel.saveOrderID(order.roleId, order.localOrderID, aliOrderID, result);
|
||||||
|
|
||||||
|
return STATUS.SUCCESS
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function settleOrderFromRedisPub(message: string) {
|
||||||
|
let params: PayCallback37Data;
|
||||||
|
try {
|
||||||
|
params = JSON.parse(message);
|
||||||
|
} catch(e) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
let order = await UserOrderModel.findOrder(params.order_no);
|
||||||
|
if(!order || order.state != ORDER_STATE.CHECK_ORDER) {
|
||||||
|
console.log('订单状态错误');
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if(order.roleId != params.actor_id) {
|
||||||
|
console.log('订单玩家错误');
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if(order.price.toFixed(2) != params.money.toFixed(2)) {
|
||||||
|
console.log('订单金额错误');
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
let aliOrderID = params.order_id;
|
||||||
|
|
||||||
|
let result = await settleOrder(order, params.sid);
|
||||||
|
await UserOrderModel.saveOrderID(order.roleId, order.localOrderID, aliOrderID, JSON.stringify(result));
|
||||||
|
|
||||||
|
return true
|
||||||
}
|
}
|
||||||
@@ -9,6 +9,9 @@ import { comBtlRanges } from '../pubUtils/data';
|
|||||||
import { setRankRedisFromDb } from './rankService';
|
import { setRankRedisFromDb } from './rankService';
|
||||||
import { ServerlistModel } from '../db/Serverlist';
|
import { ServerlistModel } from '../db/Serverlist';
|
||||||
import moment = require('moment');
|
import moment = require('moment');
|
||||||
|
import { getRedisSubChannel } from '../pubUtils/sdkUtil';
|
||||||
|
import { getRandSingleEelm } from '../pubUtils/util';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 在服务重新启动时,将信息存入redis
|
* 在服务重新启动时,将信息存入redis
|
||||||
*/
|
*/
|
||||||
@@ -466,4 +469,30 @@ export async function removeConnectors(servers: string[]) {
|
|||||||
let hasServer = await redisClient().hgetAsync(REDIS_KEY.SYS_SERVER, server);
|
let hasServer = await redisClient().hgetAsync(REDIS_KEY.SYS_SERVER, server);
|
||||||
if(!!hasServer) await redisClient().hdelAsync(REDIS_KEY.SYS_SERVER, server);
|
if(!!hasServer) await redisClient().hdelAsync(REDIS_KEY.SYS_SERVER, server);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*************** 将connector服插入redis *******/
|
||||||
|
|
||||||
|
|
||||||
|
/*************** 订阅短链接redis *******/
|
||||||
|
|
||||||
|
export function redisClientPub() {
|
||||||
|
const client: Redis.RedisClient = pinus.app.get('redisPub');
|
||||||
|
return client;
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function redisSubScribe() {
|
||||||
|
let env = pinus.app.get('env');
|
||||||
|
if(env == 'development') env = 'local'; // 本地处理
|
||||||
|
let payChannel = getRedisSubChannel(REDIS_KEY.PAY_CHANNEL, env);
|
||||||
|
console.log('*****', payChannel)
|
||||||
|
await redisClientPub().subscribeAsync(payChannel);
|
||||||
|
redisClientPub().on('message', (channel, message) => {
|
||||||
|
if(channel == payChannel) {
|
||||||
|
let orders = pinus.app.getServersByType('order');
|
||||||
|
let server = getRandSingleEelm(orders);
|
||||||
|
pinus.app.rpc.order.orderRemote.settleOrderFromRedisPub.toServer(server.id, message);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
/*************** 订阅短链接redis *******/
|
||||||
@@ -15,7 +15,7 @@ import { HeroModel, HeroType, HeroUpdate } from '../db/Hero';
|
|||||||
import { Figure } from '../domain/dbGeneral';
|
import { Figure } from '../domain/dbGeneral';
|
||||||
import { Rank } from './rankService';
|
import { Rank } from './rankService';
|
||||||
import { checkActivityTask, checkTaskWithHero, pushActivityUpdate, pushTaskUpdate } from './taskService';
|
import { checkActivityTask, checkTaskWithHero, pushActivityUpdate, pushTaskUpdate } from './taskService';
|
||||||
import { CreateHeroParam } from '../domain/roleField/hero';
|
import { CreateHeroParam, HeroShowParam } from '../domain/roleField/hero';
|
||||||
import { HeroSkin } from '../db/Hero';
|
import { HeroSkin } from '../db/Hero';
|
||||||
import { errlogger } from '../util/logger';
|
import { errlogger } from '../util/logger';
|
||||||
import { BAG } from '../pubUtils/dicParam';
|
import { BAG } from '../pubUtils/dicParam';
|
||||||
@@ -476,13 +476,14 @@ export async function createHeroes(roleId: string, roleName: string, sid: string
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
let resultHeroes: HeroType[] = [], resultItems: RewardInter[] = [];
|
let resultHeroes: HeroType[] = [], resultItems: RewardInter[] = [], heroes: HeroShowParam[] = [];
|
||||||
if (infos.size > 0) {
|
if (infos.size > 0) {
|
||||||
let createHero = new CreateHeroes(roleId, roleName, serverId);
|
let createHero = new CreateHeroes(roleId, roleName, serverId);
|
||||||
await createHero.createWithHeroInfo(infos);
|
await createHero.createWithHeroInfo(infos);
|
||||||
await createHero.clearTask(await getActivities())
|
await createHero.clearTask(await getActivities())
|
||||||
await createHero.pushMessage(pinus, sid);
|
await createHero.pushMessage(pinus, sid);
|
||||||
await createHero.updateRedisRank(Rank);
|
await createHero.updateRedisRank(Rank);
|
||||||
|
heroes = createHero.getShowHeroes();
|
||||||
resultHeroes = createHero.getResultHeroes();
|
resultHeroes = createHero.getResultHeroes();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -490,7 +491,7 @@ export async function createHeroes(roleId: string, roleName: string, sid: string
|
|||||||
let goods = await addItems(roleId, roleName, sid, pieces);
|
let goods = await addItems(roleId, roleName, sid, pieces);
|
||||||
resultItems = goods;
|
resultItems = goods;
|
||||||
}
|
}
|
||||||
return { heroes: resultHeroes, goods: resultItems }
|
return { heroes, resultHeroes, goods: resultItems }
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function createHero(roleId: string, roleName: string, sid: string, serverId: number, heroInfo: CreateHeroParam) {
|
export async function createHero(roleId: string, roleName: string, sid: string, serverId: number, heroInfo: CreateHeroParam) {
|
||||||
|
|||||||
@@ -231,6 +231,7 @@ export enum REDIS_KEY {
|
|||||||
HERO_RANK ="heroRank", // 武将排行榜
|
HERO_RANK ="heroRank", // 武将排行榜
|
||||||
SHOW_LINEUP ="showLineup", // 展示阵容
|
SHOW_LINEUP ="showLineup", // 展示阵容
|
||||||
SYS_SERVER ='sysServer', // 全服connector服
|
SYS_SERVER ='sysServer', // 全服connector服
|
||||||
|
PAY_CHANNEL = 'pay', // 支付订阅频道
|
||||||
}
|
}
|
||||||
|
|
||||||
// 各排行榜对应hash的key
|
// 各排行榜对应hash的key
|
||||||
|
|||||||
@@ -448,3 +448,17 @@ export const STATUS = {
|
|||||||
CHANNEL_INFO_NOT_FOUND: { code: 70014, simStr: '未找到玩家渠道数据' },
|
CHANNEL_INFO_NOT_FOUND: { code: 70014, simStr: '未找到玩家渠道数据' },
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export const PAY_37_CALLBACK_CODE = {
|
||||||
|
SUCCESS: { code: 1, simStr: '发货成功' },
|
||||||
|
FAIL: { code: -1, simStr: '发货失败' },
|
||||||
|
USER_NOT_FOUND: { code: -2, simStr: '用户不存在' },
|
||||||
|
IP_LIMIT: { code: -3, simStr: 'IP限制' },
|
||||||
|
MD5_ERR: { code: -4, simStr: 'md5校验错误' },
|
||||||
|
ROLE_NOT_FOUND: { code: -5, simStr: '角色不存在' },
|
||||||
|
TIME_IS_EXPIRED: { code: -6, simStr: 'time时间已过期' },
|
||||||
|
SERVER_IS_BUSY: { code: -7, simStr: '游戏服务器繁忙' },
|
||||||
|
WRONG_PARAM: { code: -8, simStr: '参数错误' },
|
||||||
|
SERVER_NOT_FOUND: { code: -9, simStr: '游戏服不存在' },
|
||||||
|
PAY_ERR: { code: 10, simStr: '充值失败' }
|
||||||
|
}
|
||||||
@@ -18,6 +18,8 @@ export default class UserOrder extends BaseModel {
|
|||||||
@prop({ required: true })
|
@prop({ required: true })
|
||||||
orderID: string; // 平台订单号
|
orderID: string; // 平台订单号
|
||||||
@prop({ required: true })
|
@prop({ required: true })
|
||||||
|
rewardResult: string; // 奖励结果
|
||||||
|
@prop({ required: true })
|
||||||
localOrderID: string; // 本地订单号
|
localOrderID: string; // 本地订单号
|
||||||
@prop({ required: true })
|
@prop({ required: true })
|
||||||
payType: number; // 支付类型 PAY_TYPE
|
payType: number; // 支付类型 PAY_TYPE
|
||||||
@@ -34,9 +36,9 @@ export default class UserOrder extends BaseModel {
|
|||||||
|
|
||||||
|
|
||||||
//保存平台订单号
|
//保存平台订单号
|
||||||
public static async saveOrderID(roleId: string, localOrderID: string, aliOrderID: string) {
|
public static async saveOrderID(roleId: string, localOrderID: string, orderID: string, rewardResult: string) {
|
||||||
let result: UserOrderModelType = await UserOrderModel.findOneAndUpdate({ roleId, localOrderID },
|
let result: UserOrderModelType = await UserOrderModel.findOneAndUpdate({ roleId, localOrderID },
|
||||||
{ $set: { orderID: aliOrderID } },
|
{ $set: { orderID, rewardResult, state: ORDER_STATE.RESULT_SUCCESS } },
|
||||||
{ new: true }).lean(true);
|
{ new: true }).lean(true);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
@@ -58,9 +60,9 @@ export default class UserOrder extends BaseModel {
|
|||||||
}
|
}
|
||||||
|
|
||||||
//订单支付成功
|
//订单支付成功
|
||||||
public static async success(roleId: string, localOrderID: string, message: string = '') {
|
public static async success(roleId: string, localOrderID: string, rewardResult: string, message: string = '') {
|
||||||
let result: UserOrderModelType = await UserOrderModel.findOneAndUpdate({ roleId, localOrderID, state: { $ne: ORDER_STATE.RESULT_SUCCESS } },
|
let result: UserOrderModelType = await UserOrderModel.findOneAndUpdate({ roleId, localOrderID, state: { $ne: ORDER_STATE.RESULT_SUCCESS } },
|
||||||
{ $set: { state: ORDER_STATE.RESULT_SUCCESS, message } },
|
{ $set: { state: ORDER_STATE.RESULT_SUCCESS, rewardResult, message } },
|
||||||
{ new: true }).lean(true);
|
{ new: true }).lean(true);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,20 @@
|
|||||||
|
|
||||||
import { HeroUpdate } from '../../db/Hero';
|
import { HeroType, HeroUpdate } from '../../db/Hero';
|
||||||
export interface CreateHeroParam extends HeroUpdate {
|
export interface CreateHeroParam extends HeroUpdate {
|
||||||
hid: number;
|
hid: number;
|
||||||
count: number;
|
count: number;
|
||||||
|
}
|
||||||
|
|
||||||
|
export class HeroShowParam {
|
||||||
|
hid: number;
|
||||||
|
seqId: number;
|
||||||
|
skinId: number;
|
||||||
|
quality: number;
|
||||||
|
|
||||||
|
constructor(hero: HeroType) {
|
||||||
|
this.hid = hero.hid;
|
||||||
|
this.seqId = hero.seqId;
|
||||||
|
this.skinId = hero.skinId;
|
||||||
|
this.quality = hero.quality;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
+18
-1
@@ -39,4 +39,21 @@ export interface LoginValidataReturn37 {
|
|||||||
data: LoginValidateData37;
|
data: LoginValidateData37;
|
||||||
}
|
}
|
||||||
|
|
||||||
export type ChannelInfo = LoginValidataReturn37|{};
|
export type ChannelInfo = LoginValidataReturn37|{};
|
||||||
|
|
||||||
|
export interface PayCallback37Data {
|
||||||
|
appid: string; // 平台id
|
||||||
|
uid: number; // 37用户id
|
||||||
|
game_id: number; // 游戏id
|
||||||
|
fc_c_game_id: string; // 子游戏id
|
||||||
|
sid: number; // 区服id
|
||||||
|
actor_id: string; // 角色id
|
||||||
|
order_id: string; // 37平台id
|
||||||
|
order_no: string; // 我方订单id
|
||||||
|
money: number; // 订单金额
|
||||||
|
game_coin: number; // 元宝数
|
||||||
|
product_id: string; // 商品id
|
||||||
|
time: number; // 请求时间
|
||||||
|
ext: string; // 扩展参数
|
||||||
|
sign: string;
|
||||||
|
}
|
||||||
@@ -70,7 +70,10 @@ declare module 'redis' {
|
|||||||
smembersAsync(key: string): Promise<string[]>;
|
smembersAsync(key: string): Promise<string[]>;
|
||||||
// 增加集合成员
|
// 增加集合成员
|
||||||
saddAsync(key: string, values: string[]): Promise<string>;
|
saddAsync(key: string, values: string[]): Promise<string>;
|
||||||
|
// 将信息发送到指定的频道
|
||||||
|
publishAsync(channel: string, message: string): Promise<number>;
|
||||||
|
// 订阅给定的一个或多个频道的信息
|
||||||
|
subscribeAsync(...channels: string[]): Promise<number>;
|
||||||
}
|
}
|
||||||
export interface Multi extends Commands<Multi> {
|
export interface Multi extends Commands<Multi> {
|
||||||
execAsync(...args: any[]): Promise<any>;
|
execAsync(...args: any[]): Promise<any>;
|
||||||
|
|||||||
@@ -99,6 +99,7 @@ import { UserTaskHistoryModel } from '../db/UserTaskHistory';
|
|||||||
import { UserTaskRecModel } from '../db/UserTaskRec';
|
import { UserTaskRecModel } from '../db/UserTaskRec';
|
||||||
import { WishPoolReportModel } from '../db/WishPoolReport';
|
import { WishPoolReportModel } from '../db/WishPoolReport';
|
||||||
import { pick } from "underscore";
|
import { pick } from "underscore";
|
||||||
|
import { HeroShowParam } from '../domain/roleField/hero';
|
||||||
|
|
||||||
// 储存在内存中的初始数据
|
// 储存在内存中的初始数据
|
||||||
export function getInitRoleInfo() {
|
export function getInitRoleInfo() {
|
||||||
@@ -341,11 +342,17 @@ export class CreateHeroes extends UpdateHeroes {
|
|||||||
pinus.app.get('channelService').pushMessageByUids('onHeadChange', resResult(STATUS.SUCCESS, { ...figureInfo }), uids);
|
pinus.app.get('channelService').pushMessageByUids('onHeadChange', resResult(STATUS.SUCCESS, { ...figureInfo }), uids);
|
||||||
}
|
}
|
||||||
pinus.app.get('channelService').pushMessageByUids('onHeroSkinChange', resResult(STATUS.SUCCESS, this.skinPushMessages), uids);
|
pinus.app.get('channelService').pushMessageByUids('onHeroSkinChange', resResult(STATUS.SUCCESS, this.skinPushMessages), uids);
|
||||||
|
pinus.app.get('channelService').pushMessageByUids('onHeroUpdate', resResult(STATUS.SUCCESS, { heroes: this.resultHeroes }), uids);
|
||||||
}
|
}
|
||||||
|
|
||||||
public getResultHeroes() {
|
public getResultHeroes() {
|
||||||
|
return this.resultHeroes
|
||||||
|
}
|
||||||
|
|
||||||
|
public getShowHeroes() {
|
||||||
return this.resultHeroes.map(cur => {
|
return this.resultHeroes.map(cur => {
|
||||||
return { ...cur, ce: reduceCe(cur.ce)}
|
let hero = new HeroShowParam(cur);
|
||||||
|
return { ...hero, ce: reduceCe(cur.ce)}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { SDK_37_ADDR, SDK_37_CONST } from '../consts';
|
import { REDIS_KEY, SDK_37_ADDR, SDK_37_CONST } from '../consts';
|
||||||
import { request37 } from './httpUtil';
|
import { request37 } from './httpUtil';
|
||||||
import { nowSeconds } from './timeUtil';
|
import { nowSeconds } from './timeUtil';
|
||||||
import { LoginValidataReturn37 } from '../domain/sdk';
|
import { LoginValidataReturn37 } from '../domain/sdk';
|
||||||
@@ -85,4 +85,8 @@ export function checkVidObjSign(obj: any) {
|
|||||||
|
|
||||||
function treatVid(str) {
|
function treatVid(str) {
|
||||||
return 'vId' + str;
|
return 'vId' + str;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function getRedisSubChannel(key: REDIS_KEY, env: string) {
|
||||||
|
return `${key}:${env}`;
|
||||||
}
|
}
|
||||||
@@ -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 => {
|
module.exports = options => {
|
||||||
return async function parmsDecode(ctx: Context, next) {
|
return async function parmsDecode(ctx: Context, next) {
|
||||||
let m = ctx.request.url.indexOf("/dev");
|
let url = ctx.request.url;
|
||||||
let n = ctx.request.url.indexOf("/web");
|
|
||||||
ctx.logcode = genCode(10);
|
ctx.logcode = genCode(10);
|
||||||
if(m == 0 || n == 0) {
|
if(url.indexOf("/dev") == 0 || url.indexOf("/web") == 0 || url.indexOf("/cb") == 0) {
|
||||||
await next();
|
await next();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -59,7 +58,7 @@ module.exports = options => {
|
|||||||
try{
|
try{
|
||||||
await next();
|
await next();
|
||||||
} catch(e) {
|
} 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;
|
throw e;
|
||||||
}
|
}
|
||||||
const resBody = ctx.body;
|
const resBody = ctx.body;
|
||||||
|
|||||||
@@ -23,4 +23,12 @@ export default (app: Application) => {
|
|||||||
router.post('/gate/queryenter', tokenParser, controller.game.queryEnter);
|
router.post('/gate/queryenter', tokenParser, controller.game.queryEnter);
|
||||||
router.post('/update/getversion', controller.update.getversion);
|
router.post('/update/getversion', controller.update.getversion);
|
||||||
router.post('/web/reloadresource', app.middleware.gmTokenParser(), controller.game.reloadResource);
|
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, '');
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
Generated
+8
-3
@@ -685,6 +685,11 @@
|
|||||||
"integrity": "sha512-I99sngh224D0M7XgW1s120zxCt3VYQ3IQsuw3P3jbq5GG4yc79+ZjyKznyOGIQrflfylLgcfekeZW/vk0yng6A==",
|
"integrity": "sha512-I99sngh224D0M7XgW1s120zxCt3VYQ3IQsuw3P3jbq5GG4yc79+ZjyKznyOGIQrflfylLgcfekeZW/vk0yng6A==",
|
||||||
"dev": true
|
"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": {
|
"@types/yargs": {
|
||||||
"version": "12.0.18",
|
"version": "12.0.18",
|
||||||
"resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-12.0.18.tgz",
|
"resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-12.0.18.tgz",
|
||||||
@@ -11118,9 +11123,9 @@
|
|||||||
"integrity": "sha1-rOEWq1V80Zc4ak6I9GhTeMiy5Po="
|
"integrity": "sha1-rOEWq1V80Zc4ak6I9GhTeMiy5Po="
|
||||||
},
|
},
|
||||||
"underscore": {
|
"underscore": {
|
||||||
"version": "1.12.0",
|
"version": "1.13.1",
|
||||||
"resolved": "https://registry.npmjs.org/underscore/-/underscore-1.12.0.tgz",
|
"resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.1.tgz",
|
||||||
"integrity": "sha512-21rQzss/XPMjolTiIezSu3JAjgagXKROtNrYFEOWK109qY1Uv2tVjPTZ1ci2HgvQDA16gHYSthQIJfB+XId/rQ=="
|
"integrity": "sha512-hzSoAVtJF+3ZtiFX0VgfFPHEDRm7Y/QPjGyNo4TVdnDTdft3tr8hEkD25a1jC+TjTuE7tkHGKkhwCgs9dgBB2g=="
|
||||||
},
|
},
|
||||||
"unescape": {
|
"unescape": {
|
||||||
"version": "1.0.1",
|
"version": "1.0.1",
|
||||||
|
|||||||
@@ -27,6 +27,7 @@
|
|||||||
"lylocal": "cross-env EGG_SERVER_ENV=lylocal npm run dev"
|
"lylocal": "cross-env EGG_SERVER_ENV=lylocal npm run dev"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
"@types/underscore": "^1.11.3",
|
||||||
"crc": "^3.8.0",
|
"crc": "^3.8.0",
|
||||||
"cross-env": "^7.0.3",
|
"cross-env": "^7.0.3",
|
||||||
"csprng": "^0.1.2",
|
"csprng": "^0.1.2",
|
||||||
@@ -42,7 +43,7 @@
|
|||||||
"reflect-metadata": "^0.1.13",
|
"reflect-metadata": "^0.1.13",
|
||||||
"request": "^2.88.2",
|
"request": "^2.88.2",
|
||||||
"request-promise": "^4.2.6",
|
"request-promise": "^4.2.6",
|
||||||
"underscore": "^1.12.0"
|
"underscore": "^1.13.1"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@types/mocha": "^2.2.40",
|
"@types/mocha": "^2.2.40",
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ import 'egg';
|
|||||||
import ExportAccount from '../../../app/controller/account';
|
import ExportAccount from '../../../app/controller/account';
|
||||||
import ExportGame from '../../../app/controller/game';
|
import ExportGame from '../../../app/controller/game';
|
||||||
import ExportHome from '../../../app/controller/home';
|
import ExportHome from '../../../app/controller/home';
|
||||||
|
import ExportSdk from '../../../app/controller/sdk';
|
||||||
import ExportUpdate from '../../../app/controller/update';
|
import ExportUpdate from '../../../app/controller/update';
|
||||||
|
|
||||||
declare module 'egg' {
|
declare module 'egg' {
|
||||||
@@ -12,6 +13,7 @@ declare module 'egg' {
|
|||||||
account: ExportAccount;
|
account: ExportAccount;
|
||||||
game: ExportGame;
|
game: ExportGame;
|
||||||
home: ExportHome;
|
home: ExportHome;
|
||||||
|
sdk: ExportSdk;
|
||||||
update: ExportUpdate;
|
update: ExportUpdate;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+2
@@ -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;
|
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 ExportAuth from '../../../app/service/Auth';
|
||||||
import ExportGame from '../../../app/service/Game';
|
import ExportGame from '../../../app/service/Game';
|
||||||
|
import ExportSdk from '../../../app/service/Sdk';
|
||||||
import ExportTest from '../../../app/service/Test';
|
import ExportTest from '../../../app/service/Test';
|
||||||
import ExportTurboCore from '../../../app/service/TurboCore';
|
import ExportTurboCore from '../../../app/service/TurboCore';
|
||||||
import ExportUpdate from '../../../app/service/Update';
|
import ExportUpdate from '../../../app/service/Update';
|
||||||
@@ -17,6 +18,7 @@ declare module 'egg' {
|
|||||||
interface IService {
|
interface IService {
|
||||||
auth: AutoInstanceType<typeof ExportAuth>;
|
auth: AutoInstanceType<typeof ExportAuth>;
|
||||||
game: AutoInstanceType<typeof ExportGame>;
|
game: AutoInstanceType<typeof ExportGame>;
|
||||||
|
sdk: AutoInstanceType<typeof ExportSdk>;
|
||||||
test: AutoInstanceType<typeof ExportTest>;
|
test: AutoInstanceType<typeof ExportTest>;
|
||||||
turboCore: AutoInstanceType<typeof ExportTurboCore>;
|
turboCore: AutoInstanceType<typeof ExportTurboCore>;
|
||||||
update: AutoInstanceType<typeof ExportUpdate>;
|
update: AutoInstanceType<typeof ExportUpdate>;
|
||||||
|
|||||||
Reference in New Issue
Block a user