支付回调

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
+124 -7
View File
@@ -1,5 +1,5 @@
import { UserOrderModelType } from '../db/UserOrder';
import { ACTIVITY_TYPE, STATUS } from '../consts';
import { UserOrderModel, UserOrderModelType } from '../db/UserOrder';
import { ACTIVITY_TYPE, ORDER_STATE, STATUS, TASK_TYPE } from '../consts';
import { dicRMB } from '../pubUtils/dictionary/DicRMB';
import { makeYuanbaoShopReward } from './activity/yuanbaoService';
import { RoleModel } from '../db/Role';
@@ -19,17 +19,20 @@ import { ActivityMonopolyModel, ActivityMonopolyModelType } from '../db/Activity
import { ActivityMonopolyLandModel, ActivityMonopolyLandModelType } from '../db/ActivityMonopolyLand';
import { pinus } from 'pinus';
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 本地订单号
*/
export async function makeOrder(localOrderID: string, sid: string, orderInfo: UserOrderModelType) {
// let orderInfo = await UserOrderModel.findOrder(localOrderID);
export async function makeOrder(orderInfo: UserOrderModelType, sid: string) {
//商品价格信息
let productInfo = dicRMB.get(orderInfo.productID)
@@ -144,4 +147,118 @@ export async function makeOrder(localOrderID: string, sid: string, orderInfo: Us
}), [{ uid: roleId, sid }]);
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
}
+30 -1
View File
@@ -9,6 +9,9 @@ import { comBtlRanges } from '../pubUtils/data';
import { setRankRedisFromDb } from './rankService';
import { ServerlistModel } from '../db/Serverlist';
import moment = require('moment');
import { getRedisSubChannel } from '../pubUtils/sdkUtil';
import { getRandSingleEelm } from '../pubUtils/util';
/**
* 在服务重新启动时,将信息存入redis
*/
@@ -466,4 +469,30 @@ export async function removeConnectors(servers: string[]) {
let hasServer = await redisClient().hgetAsync(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 *******/
+4 -3
View File
@@ -15,7 +15,7 @@ import { HeroModel, HeroType, HeroUpdate } from '../db/Hero';
import { Figure } from '../domain/dbGeneral';
import { Rank } from './rankService';
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 { errlogger } from '../util/logger';
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) {
let createHero = new CreateHeroes(roleId, roleName, serverId);
await createHero.createWithHeroInfo(infos);
await createHero.clearTask(await getActivities())
await createHero.pushMessage(pinus, sid);
await createHero.updateRedisRank(Rank);
heroes = createHero.getShowHeroes();
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);
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) {