支付:代金券功能

This commit is contained in:
luying
2022-07-11 18:08:00 +08:00
parent b9af56fd07
commit ae369f7bf2
14 changed files with 179 additions and 93 deletions
@@ -101,7 +101,7 @@ export class GmOrderHandler {
continue;
}
let paramStr = await getParamStr(activityData, productID, role);
let orderInfo = await UserOrderModel.applyOrder(serverId, roleId, productID, localOrderID, orderID, price, payType, activityId, paramStr, message);
let orderInfo = await UserOrderModel.applyOrder(serverId, roleId, productID, localOrderID, orderID, price, payType, activityId, paramStr, message, false);
//订单成功
if(!orderInfo) {
@@ -1,16 +1,19 @@
import { Application, BackendSession, HandlerService, } from 'pinus';
import { genCode, resResult } from '../../../pubUtils/util';
import { ACTIVITY_TYPE, DEBUG_MAGIC_WORD, DEBUG_PRICE, ORDER_STATE, PAY_TYPE, STATUS, TASK_TYPE, TA_EVENT } from '../../../consts';
import { ACTIVITY_TYPE, DEBUG_MAGIC_WORD, DEBUG_PRICE, ITEM_CHANGE_REASON, ORDER_STATE, PAY_TYPE, STATUS, TASK_TYPE, TA_EVENT } from '../../../consts';
import { dicRMB } from '../../../pubUtils/dictionary/DicRMB';
import { UserOrderModel } from '../../../db/UserOrder';
import _ = require('underscore');
import { applyOrderWX } from '../../../services/pay/weixinPay';
import { applyOrderALI } from '../../../services/pay/aliPay';
import { applyOrder37 } from '../../../services/pay/37Pay';
import { checkOrderCanBuy, settleOrder, settleOrderAli, settleOrderWx } from '../../../services/orderService';
import { checkOrderCanBuy, settleOrder, settleOrderAli, settleOrderFromHandler, settleOrderWx } from '../../../services/orderService';
import { getActivityById } from '../../../services/activity/activityService';
import { reportTAEvent } from '../../../services/sdkService';
import { isDebugPay } from '../../../pubUtils/sdkUtil';
import { canPay, isDebugPay } from '../../../pubUtils/sdkUtil';
import { isDevelopEnv } from '../../../services/utilService';
import { getVoucherObject, handleCost } from '../../../services/role/rewardService';
import { CheckMeterial } from '../../../services/role/checkMaterial';
export default function (app: Application) {
new HandlerService(app, {});
@@ -29,17 +32,21 @@ export class orderHandler {
* @param {BackendSession} session
* @memberof orderHandler
*/
async applyOrder(msg: { productID: string, payType: number, activityId: number, paramStr: string }, session: BackendSession) {
const { productID, payType, activityId, paramStr } = msg;
async applyOrder(msg: { productID: string, payType: number, activityId: number, paramStr: string, useVoucher: boolean }, session: BackendSession) {
const { productID, payType, activityId, paramStr, useVoucher } = msg;
const roleId = session.get('roleId');
const serverId = session.get('serverId');
const ip = session.get('ip');
//如果有特殊情况,activityId可为0
if (!productID || !_.isString(productID) || !payType || !_.isNumber(payType)) {
if (!productID || !_.isString(productID) || !_.isNumber(payType)) {
return resResult(STATUS.WRONG_PARMS);
}
if(!canPay()) {
return resResult(STATUS.PAY_NOT_OPEN)
}
//商品价格信息
let productInfo = dicRMB.get(productID)
if (!productInfo) {
@@ -53,51 +60,65 @@ export class orderHandler {
let localOrderID = genCode(32);//本地订单号
let orderID = '';//平台订单号
let sdkOrderInfo = null;//客户端需要的平台订单信息
switch (payType) {
case PAY_TYPE.THREE_SEVEN:
case PAY_TYPE.THREE_SEVEN_IOS:
{
let pay37Order = await applyOrder37(localOrderID, roleId, productInfo);
if (pay37Order.code == -1) {
console.log('37下单失败')
return pay37Order.resData;
}
sdkOrderInfo = pay37Order.data;
orderID = ''
break;
}
case PAY_TYPE.WX:
{
let weixinOrder = await applyOrderWX(localOrderID, price * 100, message);
if (weixinOrder.code == -1) {
console.log('微信下单失败')
return resResult(STATUS.APPLY_ORDER_ERROR);
}
sdkOrderInfo = weixinOrder.data;
orderID = weixinOrder.data.prepayid;//微信订单号
break;
}
case PAY_TYPE.ALI:
{
let aliOrder = await applyOrderALI(localOrderID, price, message);
if (aliOrder.code == -1) {
console.log('支付宝下单失败')
return resResult(STATUS.APPLY_ORDER_ERROR);
}
sdkOrderInfo = aliOrder.data;
orderID = aliOrder.data;//支付宝订单
break;
}
case PAY_TYPE.TEST:
case PAY_TYPE.APPLE:
{
break;
}
default:
console.log('未知支付类型');
return resResult(STATUS.NO_PAY_TYPE);
if(useVoucher) {
let voucher = getVoucherObject(price);
let check = new CheckMeterial(roleId);
let isEnough = await check.decrease([voucher]);
if (!isEnough) return resResult(STATUS.VOUCHER_NOT_ENOUGH);
} else {
switch (payType) {
case PAY_TYPE.THREE_SEVEN:
case PAY_TYPE.THREE_SEVEN_IOS:
{
let pay37Order = await applyOrder37(localOrderID, roleId, productInfo);
if (pay37Order.code == -1) {
console.log('37下单失败')
return pay37Order.resData;
}
sdkOrderInfo = pay37Order.data;
orderID = ''
break;
}
case PAY_TYPE.WX:
{
let weixinOrder = await applyOrderWX(localOrderID, price * 100, message);
if (weixinOrder.code == -1) {
console.log('微信下单失败')
return resResult(STATUS.APPLY_ORDER_ERROR);
}
sdkOrderInfo = weixinOrder.data;
orderID = weixinOrder.data.prepayid;//微信订单号
break;
}
case PAY_TYPE.ALI:
{
let aliOrder = await applyOrderALI(localOrderID, price, message);
if (aliOrder.code == -1) {
console.log('支付宝下单失败')
return resResult(STATUS.APPLY_ORDER_ERROR);
}
sdkOrderInfo = aliOrder.data;
orderID = aliOrder.data;//支付宝订单
break;
}
case PAY_TYPE.TEST:
{
if(!isDevelopEnv()) {
return resResult(STATUS.NO_PAY_TYPE);
}
break;
}
case PAY_TYPE.APPLE:
{
break;
}
default:
console.log('未知支付类型');
return resResult(STATUS.NO_PAY_TYPE);
}
}
if(activityId > 0) {
@@ -107,7 +128,7 @@ 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, useVoucher);
reportTAEvent(roleId, TA_EVENT.RECHARGE, {
pay_id: localOrderID, chargeId: productID, pay_name: message, pay_amount: price, pay_channel: payType
}, ip)
@@ -125,7 +146,7 @@ export class orderHandler {
*/
async checkOrder(msg: { localOrderID: string }, session: BackendSession) {
const { localOrderID } = msg;
// const roleId = session.get('roleId');
const roleId = session.get('roleId');
const serverId = session.get('serverId');
const sid = session.get('sid');
const roleName = session.get('roleName');
@@ -145,35 +166,55 @@ export class orderHandler {
return resResult(STATUS.NO_PRODUCT_ID);
}
switch (orderInfo.payType) {
case PAY_TYPE.TEST:
case PAY_TYPE.THREE_SEVEN:
case PAY_TYPE.APPLE:
{
break;
}
case PAY_TYPE.WX:
{
let res = await settleOrderWx(orderInfo, serverId, sid);
if(res.code != 0) {
return resResult(res);
}
orderInfo = await UserOrderModel.findOrder(localOrderID);
break;
}
case PAY_TYPE.ALI:
{
let res = await settleOrderAli(orderInfo, serverId, sid);
if(res.code != 0) {
return resResult(res);
}
orderInfo = await UserOrderModel.findOrder(localOrderID);
break;
}
if(orderInfo.useVoucher) {
let voucher = getVoucherObject(productInfo.price);
let result = await handleCost(roleId, roleName, [voucher], ITEM_CHANGE_REASON.USE_VOUCHER);
if(!result) return resResult(STATUS.VOUCHER_NOT_ENOUGH);
default:
console.log('未知支付类型');
return resResult(STATUS.NO_PAY_TYPE);
let res = await settleOrderFromHandler(localOrderID, roleId, serverId, sid);
if(res.code != 0) {
return resResult(res);
}
orderInfo = await UserOrderModel.findOrder(localOrderID);
} else {
switch (orderInfo.payType) {
case PAY_TYPE.TEST:
{
let res = await settleOrderFromHandler(localOrderID, roleId, serverId, sid);
if(res.code != 0) {
return resResult(res);
}
orderInfo = await UserOrderModel.findOrder(localOrderID);
break;
}
case PAY_TYPE.THREE_SEVEN:
case PAY_TYPE.APPLE:
{
break;
}
case PAY_TYPE.WX:
{
let res = await settleOrderWx(orderInfo, serverId, sid);
if(res.code != 0) {
return resResult(res);
}
orderInfo = await UserOrderModel.findOrder(localOrderID);
break;
}
case PAY_TYPE.ALI:
{
let res = await settleOrderAli(orderInfo, serverId, sid);
if(res.code != 0) {
return resResult(res);
}
orderInfo = await UserOrderModel.findOrder(localOrderID);
break;
}
default:
console.log('未知支付类型');
return resResult(STATUS.NO_PAY_TYPE);
}
}
//订单成功
@@ -245,7 +286,7 @@ export class orderHandler {
let check = await checkOrderCanBuy(roleId, serverId, activityData, productID, paramStr);
if(!check) return resResult(STATUS.ORDER_CANNOT_BUY)
let orderInfo = await UserOrderModel.applyOrder(serverId, roleId, productID, localOrderID, orderID, price, payType, activityId, paramStr, message);
let orderInfo = await UserOrderModel.applyOrder(serverId, roleId, productID, localOrderID, orderID, price, payType, activityId, paramStr, message, false);
//订单成功
if(!orderInfo) {
+19 -2
View File
@@ -175,7 +175,7 @@ export async function settleOrder(order: UserOrderModelType, serverId: number, s
let result = await makeOrder(order, sid);
if (result.code !== 0) {//结算失败
console.log(`支付失败..... ${JSON.stringify(result)}`)
reportTAEvent(order.roleId, TA_EVENT.RECHARGE_FAIL, { pay_id: order.localOrderID, charge_id: order.productID, pay_name: order.message, pay_amount: order.price, pay_channel: order.payType })
reportTAEvent(order.roleId, TA_EVENT.RECHARGE_FAIL, { pay_id: order.localOrderID, charge_id: order.productID, pay_name: order.message, pay_amount: order.price, pay_channel: order.payType, pay_type: order.useVoucher? "现金": "代金券" })
savePayLog(order);
return resResult(result);
}
@@ -188,7 +188,7 @@ export async function settleOrder(order: UserOrderModelType, serverId: number, s
//成长任务
await checkTask(serverId, order.roleId, sid, TASK_TYPE.ACTIVITY_RMB, { count: order.price });
if(order.payType != PAY_TYPE.TEST) {
reportTAEvent(order.roleId, TA_EVENT.RECHARGE_SUCCESS, { pay_id: order.localOrderID, charge_id: order.productID, pay_name: order.message, pay_amount: order.price, pay_channel: order.payType })
reportTAEvent(order.roleId, TA_EVENT.RECHARGE_SUCCESS, { pay_id: order.localOrderID, charge_id: order.productID, pay_name: order.message, pay_amount: order.price, pay_channel: order.payType, pay_type: order.useVoucher? "现金": "代金券" })
reportTAUserSet(TA_USERSET_TYPE.SET_ONCE, order.roleId, { first_pay_time: new Date() });
reportTAUserSet(TA_USERSET_TYPE.SET, order.roleId, { last_pay_time: new Date() });
reportTAUserSet(TA_USERSET_TYPE.ADD, order.roleId, { total_revenue: order.price });
@@ -291,6 +291,23 @@ export async function settleOrderFromRedisPub(message: string) {
return true
}
export async function settleOrderFromHandler(localOrderID: string, roleId: string, serverId: number, sid: string ) {
let order = await UserOrderModel.findOrder(localOrderID);
if(!order || order.state != ORDER_STATE.APPLY) {
return STATUS.DUPLICATE_ORDER;
}
if(order.roleId != roleId) {
console.log('订单玩家错误');
return STATUS.ORDER_STATUS_ERROR;
}
let result = await settleOrder(order, serverId, sid);
await UserOrderModel.saveOrderID(order.roleId, order.localOrderID, '', JSON.stringify(result));
return STATUS.SUCCESS
}
export async function refundOrderFromRedisPub(message: string) {
console.log('**********refundOrderFromRedisPub*******')
console.log('message: ', message);
@@ -474,6 +474,15 @@ export function getHonourObject(count: number) {
return { id: CURRENCY_BY_TYPE.get(CURRENCY_TYPE.HONOUR), count };
}
/**
* @description 获取代金券物品 { id, count }
* @param count 元宝数量
*/
export function getVoucherObject(count: number) {
return { id: CURRENCY_BY_TYPE.get(CURRENCY_TYPE.VOUCHER), count };
}
/**
* 返回 解锁头像/相框
* @param conditions 解锁条件
+1 -1
View File
@@ -1,6 +1,6 @@
import { pinus } from "pinus";
export function isDevelopEnv() {
const envs = ['development', 'monitor']
const envs = ['development', 'monitor', 'alpha', 'dev'];
return envs.indexOf(pinus.app.get('env')) != -1;
}