185 lines
8.1 KiB
TypeScript
185 lines
8.1 KiB
TypeScript
import { Application, BackendSession } from 'pinus';
|
||
import { genCode, resResult } from '../../../pubUtils/util';
|
||
import { ACTIVITY_TYPE, ORDER_STATE, PAY_TYPE, STATUS } from '../../../consts';
|
||
import { dicRMB } from '../../../pubUtils/dictionary/DicRMB';
|
||
import { UserOrderModel } from '../../../db/UserOrder';
|
||
import _ = require('underscore');
|
||
import { applyOrderWX, checkOrderWX } from '../../../services/pay/weixinPay';
|
||
import { applyOrderALI, checkOrderALI } from '../../../services/pay/aliPay';
|
||
import { makeOrder } from '../../../services/orderService';
|
||
|
||
export default function (app: Application) {
|
||
return new orderHandler(app);
|
||
}
|
||
|
||
export class orderHandler {
|
||
constructor(private app: Application) {
|
||
}
|
||
|
||
/************************订单****************************/
|
||
|
||
/**
|
||
* @description 获取订单号
|
||
* @param {{productID:string, payType:number ,activityId: number }} msg
|
||
* @param {BackendSession} session
|
||
* @memberof orderHandler
|
||
*/
|
||
async applyOrder(msg: { productID: string, payType: number, activityId: number }, session: BackendSession) {
|
||
const { productID, payType, activityId } = msg;
|
||
const roleId = session.get('roleId');
|
||
const serverId = session.get('serverId');
|
||
|
||
//如果有特殊情况,activityId可为0
|
||
if (!productID || !_.isString(productID) || !payType || !_.isNumber(payType)) {
|
||
return resResult(STATUS.WRONG_PARMS);
|
||
}
|
||
|
||
//商品价格信息
|
||
let productInfo = dicRMB.get(productID)
|
||
if (!productInfo) {
|
||
return resResult(STATUS.NO_PRODUCT_ID);
|
||
}
|
||
|
||
let price = productInfo.price;//价格
|
||
let productType = productInfo.type;//类型
|
||
let message = productInfo.message;//商品信息
|
||
let localOrderID = genCode(32);//本地订单号
|
||
let orderID = '';//平台订单号
|
||
let sdkOrderInfo = null;//客户端需要的平台订单信息
|
||
switch (payType) {
|
||
case PAY_TYPE.WX:
|
||
{
|
||
let weixinOrder = await applyOrderWX(localOrderID, price * 100, message);
|
||
if (weixinOrder.code == 0) {
|
||
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 == 0) {
|
||
console.log('支付宝下单失败')
|
||
return resResult(STATUS.APPLY_ORDER_ERROR);
|
||
}
|
||
sdkOrderInfo = aliOrder.data;
|
||
orderID = aliOrder.data;//支付宝订单
|
||
|
||
break;
|
||
}
|
||
|
||
case PAY_TYPE.APPLE:
|
||
{
|
||
break;
|
||
}
|
||
default:
|
||
console.log('未知支付类型');
|
||
return resResult(STATUS.NO_PAY_TYPE);
|
||
}
|
||
await UserOrderModel.applyOrder(serverId, roleId, productID, localOrderID, orderID, price, payType, activityId);
|
||
return resResult(STATUS.SUCCESS, { orderInfo: sdkOrderInfo, productInfo, localOrderID });
|
||
}
|
||
|
||
/**
|
||
* @description 查询订单,结算奖励
|
||
* @param {{ localOrderID: string}} msg
|
||
* @param {BackendSession} session
|
||
* @memberof firstGiftHandler
|
||
*/
|
||
async checkOrder(msg: { localOrderID: string }, session: BackendSession) {
|
||
const { localOrderID } = msg;
|
||
// const roleId = session.get('roleId');
|
||
const serverId = session.get('serverId');
|
||
const sid = session.get('sid');
|
||
const roleName = session.get('roleName');
|
||
const funcs: number[] = session.get('funcs');
|
||
if (!localOrderID || !_.isString(localOrderID)) {
|
||
return resResult(STATUS.WRONG_PARMS);
|
||
}
|
||
let orderInfo = await UserOrderModel.findOrder(localOrderID);
|
||
if (!orderInfo) {
|
||
return resResult(STATUS.NO_ORDER);
|
||
}
|
||
if (orderInfo.state == ORDER_STATE.RESULT_SUCCESS) {
|
||
return resResult(STATUS.DUPLICATE_ORDER);
|
||
}
|
||
|
||
//商品价格信息
|
||
let productInfo = dicRMB.get(orderInfo.productID)
|
||
if (!productInfo) {
|
||
return resResult(STATUS.NO_PRODUCT_ID);
|
||
}
|
||
|
||
let productType = productInfo.type;//类型
|
||
let price = orderInfo.price;//下单时的价格
|
||
let payType = orderInfo.payType;//支付类型
|
||
let roleId = orderInfo.roleId;//角色
|
||
|
||
orderInfo = await UserOrderModel.check(roleId, localOrderID);
|
||
if (!orderInfo) {
|
||
return resResult(STATUS.DUPLICATE_ORDER);
|
||
}
|
||
switch (payType) {
|
||
case PAY_TYPE.WX:
|
||
{
|
||
let weixinResult = await checkOrderWX(localOrderID);
|
||
if (weixinResult.code == 0) {
|
||
console.log('微信订单查询失败')
|
||
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;
|
||
}
|
||
case PAY_TYPE.ALI:
|
||
{
|
||
let aliResult = await checkOrderALI(localOrderID);
|
||
if (aliResult.code == 0) {
|
||
console.log('支付宝订单查询失败')
|
||
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;
|
||
}
|
||
|
||
case PAY_TYPE.APPLE:
|
||
{
|
||
break;
|
||
}
|
||
default:
|
||
console.log('未知支付类型');
|
||
return resResult(STATUS.NO_PAY_TYPE);
|
||
}
|
||
|
||
//订单成功
|
||
orderInfo = await UserOrderModel.success(roleId, localOrderID);
|
||
if (orderInfo) {
|
||
//结算奖励
|
||
let result = await makeOrder(localOrderID, sid);
|
||
console.log('结算完成', localOrderID)
|
||
return resResult(STATUS.SUCCESS, result);
|
||
}
|
||
|
||
return resResult(STATUS.DUPLICATE_ORDER);
|
||
}
|
||
|
||
}
|