import { Application, BackendSession } from 'pinus'; import { genCode, resResult } from '../../../pubUtils/util'; import { ACTIVITY_TYPE, ORDER_STATE, PAY_TYPE, STATUS } from '../../../consts'; import { RoleModel } from '../../../db/Role'; import { addReward, stringToRewardParam, useGiftPackage } from '../../../services/giftPackageService'; 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 }} msg * @param {BackendSession} session * @memberof orderHandler */ async applyOrder(msg: { productID: string, payType: number }, session: BackendSession) { const { productID, payType } = msg; const roleId = session.get('roleId'); const serverId = session.get('serverId'); 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); 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); console.log('结算完成', localOrderID) return resResult(STATUS.SUCCESS, result); } return resResult(STATUS.DUPLICATE_ORDER); } }