import { StatisticsCurrencyModel, ECurrencyWhy, GStatisticsCurrency } from './StatisticsCurrency'; import { GExtUserSer } from './ExtUserService'; import { EErrorCode } from '../Config/_error_'; import { GLog } from 'cgserver'; import { GHttpTool } from 'cgserver'; import { MongoBaseModel } from 'cgserver'; import { MongoBaseService } from 'cgserver'; import CryptoJS from 'crypto-js'; import { GOrderCfg, ProductItem } from '../../Platform/HallWebServer/Config/OrderConfig'; import { GHallCfg } from '../../Platform/HallWebServer/Config/HallConfig'; import { GBagSer } from './BagService'; export enum EOrderState { Init=0,//初始化 Cancel,//用户取消 Verifying,//验证中 Failed,//验证失败 Ok//验证成功,订单完成 } export enum EOrderFrom { Ios,//ios应用商店 Google, Wechat,//微信 Alipay,//支付宝 Android_Sft,//盛付通 IOS_Sft//盛付通 } export class OrderModel extends MongoBaseModel { user_id:number=-1 product_id:string=""//商品id(mahjong@product@0) money:number=-1 from:EOrderFrom=-1//充值来源 create_time:number=-1 state:EOrderState=EOrderState.Init } export let GOrderSer:OrderService = null class OrderService extends MongoBaseService { async createNewOrder(user_id:number,from:EOrderFrom,product_id:string,money:number) { let time = Date.now() let om = new OrderModel() om.user_id = user_id om.product_id = product_id om.money = money om.from = from om.create_time = time om.state = EOrderState.Init let sr = await this.insert(om) om._id=sr.rs.insertedId return om } async onComplete(order_id:string,money:number) { let rs={user_id:-1,crystal:0,coin:0,vip_exp:0,errcode:null} let order = await this.get(null,{_id:order_id}) if(!order) { rs.errcode = EErrorCode.No_Order return rs } if(order.state==EOrderState.Ok) { rs.errcode = EErrorCode.Order_Complete return rs } let pd = GOrderCfg.getProduct(order.product_id) if(money>0&&pd.money!=money) { rs.errcode = EErrorCode.Order_Verify_Failed GLog.error("充值金额和产品金额不同,可能遭受恶意充值!order_id="+order_id) return rs } money=pd.money let model={state:EOrderState.Ok} let sr = await this.updateOne(model,{_id:order_id}) if(sr.errcode) { GLog.error(sr.errcode.des+" id="+order.id+"user_id="+order.user_id) rs.errcode = sr.errcode return rs } sr = await GExtUserSer.updateOne({$inc:{crystal:pd.crystal+pd.give_crystal}},{id:order.user_id}) if(sr.errcode) { rs.errcode = sr.errcode return rs } let rm = await GExtUserSer.getById(order.user_id) sr = await await GExtUserSer.updateOne({$inc:{coin:rm.coin+pd.give_coin}},{id:order.user_id}) if(sr.errcode) { rs.errcode = sr.errcode return rs } rs.crystal = rm.crystal+pd.crystal+pd.give_crystal rs.coin = rm.coin+pd.coin+pd.give_coin rs.user_id = order.user_id rs.vip_exp = rm.vip_exp+pd.vip_exp //充值统计 let scm = new StatisticsCurrencyModel() scm.from_id = order.user_id scm.create_time = Date.now() scm.game_name = "order" scm.why = ECurrencyWhy.Charge scm.money = money scm.crystal = pd.crystal+pd.give_crystal scm.coin = pd.coin+pd.give_coin GStatisticsCurrency.insert(scm) return rs } async cancelOrder(id:string,user_id:number) { let order = await this.get(id) if(!order) { return EErrorCode.No_Order } if(order.user_id!=user_id) { return EErrorCode.Order_Not_Yours } if(order.state==EOrderState.Ok) { return EErrorCode.Order_Complete } let model={state:EOrderState.Cancel} let sr = await this.updateOne(model,{_id:id}) if(sr.errcode) { GLog.error(sr.errcode.des+" id="+id+"user_id"+user_id) return sr.errcode } return null } async completeOrder(id:string,transaction?:string,receipt?:string) { let rs = {product:null,errcode:null} let order:OrderModel = await this.get({_id:id}) if(!order) { rs.errcode = EErrorCode.No_Order return rs } if(order.state==EOrderState.Ok) { let product = GOrderCfg.getProduct(order.product_id) //rs.errcode = EErrorCode.Order_Complete rs.product=product return rs } //验证 //todo 暂时屏蔽了验证有bug,让他始终验证通过吧 let is_ok=true//this._verify(order,transaction,receipt) if(!is_ok) { rs.errcode = EErrorCode.Order_Verify_Failed return rs } let product = GOrderCfg.getProduct(order.product_id) let sr = await GExtUserSer.updateOne({$inc:{coin:product.coin+product.give_coin,crystal:product.crystal+product.give_crystal}},{id:order.user_id}) rs.errcode = sr.errcode if(product.id==GHallCfg.first_pay.pay) { await GBagSer.addItems(order.user_id,GHallCfg.first_pay.items) } return rs } protected async _verify(order:OrderModel,transaction,receipt) { if(order.from==EOrderFrom.Ios) { let data = CryptoJS.enc.Base64.parse(receipt).toString() let is_sandbox = false if(data.indexOf("Sandbox")>0) { is_sandbox = true } //"": "(编码后的数据)" let is_ok=false if(!is_sandbox) { let rs=await GHttpTool.httpPost("https://buy.itunes.apple.com/verfyReceipt",{"receipt-data":receipt}) if(!rs.error&&rs.body.status==0) { is_ok=true } } else { let rs=await GHttpTool.httpPost("https://sandbox.itunes.apple.com/verifyReceipt",{"receipt-data":receipt}) if(!rs.error&&rs.body.status==0) { is_ok=true } } return is_ok } return false } } GOrderSer = new OrderService("orders",OrderModel)