PayProc.php 52 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054
  1. <?php
  2. namespace loyalsoft;
  3. require_once __DIR__ . '/../service_call/pay/official/pay_op.php'; # 封装渠道支付模块的操作
  4. /**
  5. * 付费、游戏内消费相关处理
  6. * 全部动态交易数据需要保存到db作为[存根]
  7. * @version <br/>
  8. * 6.0.0 第六版: 引入currency字段, 增加出海结算支持. 2022.11
  9. * 5.0.0 第五版: 全部动态交易数据存入mysql. 2021.11
  10. * 4.0.0 第四版: 言灵世界 商城模块. 2020.08
  11. * 2.2.0 第三版: 独立的游戏币<元宝>, 面向多渠道的充值模式, 拉起充值成功后, 给玩家发放元宝. 游戏内部消费元宝,钻石和金币.可以用元宝购买金币和钻石.这一版在上面的PayProc中 * 2015年9月23日 <br/>
  12. * 2.1.0 mn_pay mn_AddUserCash ... 以 mn_ 打头的函数是第二版, 修改为伪托管模式,除了充值的时候跟腾讯通讯,其余时间自己管理游戏币:钻石. * 2015年7月23日 <br/>
  13. * 2.0.1 m_pay m_AddUserCash ... 以 m_ 打头的函数是第一版, 完全按照应用宝官方要求托管游戏币的模式开发的. * 2015年4月23日 <br/>
  14. * 1.0.0 Created at 2016-4-20. by --gwang <br/>
  15. * @author gwang (mail@wanggangzero.cn)
  16. * @copyright © 2016-4-20, SJZ LoyalSoft Corporation & gwang. All rights reserved.
  17. */
  18. class PayProc {
  19. const orderTab = 'tpl_order_tab';
  20. /**
  21. * 逻辑分发
  22. * 所有的Proc中必须有这样一个方法
  23. */
  24. public static function procMain() {
  25. switch (req()->cmd) {
  26. // 支付相关的活动
  27. case CmdCode::cmd_pay_getfirstpaygift: # 8802 领取首充礼包
  28. return PayProc::m_GetFirstPayGift();
  29. case CmdCode::cmd_pay_resetFirstRechargeUI_OpenTip: # 8803 重置弹框
  30. return PayProc::resetFirstRechargeUI_OpenTip();
  31. case CmdCode::cmd_pay_accumulateRechargeRewardReceived: # 8804 累计充值领取奖励
  32. return PayProc::accumulateRechargeRewardReceived();
  33. // 游戏内二级货币消费
  34. case CmdCode::cmd_mpay_pay: # 8807 消费..
  35. return self::m_pay(); # ::==> 购买普通商城物品
  36. case CmdCode::cmd_mpay_buyDynamic: # 8809 购买动态商城物品
  37. return self::m_pay_buyDynamic();
  38. case CmdCode::cmd_mpay_getDynamic: # 8810 刷新神秘商城物品
  39. return self::m_pay_getDynamic();
  40. // 充值消费
  41. case CmdCode::cmd_mpay_get_balance: # 8808 刷新账号余额
  42. return self::m_refreshChargeOrders(); # ::==> 刷新订单-领取充值金额
  43. case CmdCode::cmd_mpay_selfCheckOrders: # 8811 自助检查异常订单
  44. return self::selfhelpCheckOrders();
  45. case CmdCode::cmd_mpay_getPayRecords: # 8812 查询订单记录
  46. return self::GetPayRecoreds();
  47. case CmdCode::cmd_mpay_PayDeliverGoods: # 8813 查询订单并发货
  48. return self::PayDeliverGoods();
  49. case CmdCode::cmd_mpay_UserRechargeDrawPrize: # 8814 充值领奖励 2022.10
  50. return self::UserRechargeDrawPrize();
  51. case CmdCode::cmd_mpay_NewFirstRecharge: # 8815 新首充功能 2022.10
  52. return self::NewFirstRecharge();
  53. default:
  54. return Resp::err(ErrCode::cmd_err);
  55. }
  56. }
  57. /**
  58. * 8804 累计充值
  59. */
  60. static function accumulateRechargeRewardReceived() {
  61. list($id) = req()->paras;
  62. $mo = GameConfig::accumulaterecharge_getItem($id); # 用yuanbao做的key
  63. my_Assert($mo != null, ErrCode::err_const_no);
  64. my_Assert(ctx()->baseInfo->accumulateYuanBao >= $id, ErrCode::pay_accumulateYuanBaoNotEnough);
  65. my_Assert(!in_array($id, ctx()->privateState->accumulateRechargeRewardRecord), ErrCode::pay_repeatReceive);
  66. ctx()->privateData(true)->accumulateRechargeRewardRecord[] = $id;
  67. StoreProc::AddMultiItemInStore($mo->reward);
  68. $reset = true;
  69. $dic = GameConfig::accumulaterecharge();
  70. $max_yuanbao = 0;
  71. foreach ($dic as $aMo) {
  72. if (!in_array($aMo->yuanbao, ctx()->privateState->accumulateRechargeRewardRecord)) {
  73. $reset = false;
  74. }
  75. if ($aMo->yuanbao > $max_yuanbao) {
  76. $max_yuanbao = $aMo->yuanbao;
  77. }
  78. }
  79. if ($reset) {
  80. ctx()->privateData(true)->accumulateRechargeRewardRecord = array();
  81. ctx()->baseInfo->accumulateYuanBao -= $max_yuanbao;
  82. if (ctx()->baseInfo->accumulateYuanBao <= 0) {
  83. ctx()->baseInfo->accumulateYuanBao = 0;
  84. }
  85. }
  86. UserProc::updateUserInfo();
  87. return Resp::ok(array('gold' => ctx()->baseInfo->gold,
  88. 'cash' => ctx()->baseInfo->cash,
  89. 'tili' => ctx()->baseInfo->tili,
  90. 'tili_ts' => ctx()->baseInfo->tili_ts,
  91. 'accumulateYuanBao' => ctx()->baseInfo->accumulateYuanBao,
  92. 'store' => ctx()->store,
  93. 'privateState' => ctx()->privateState,
  94. 'reward' => StoreProc::$reward,
  95. 'reward_Gem' => StoreProc::$reward_Gem,
  96. 'reward_equip' => StoreProc::$reward_equip,
  97. ));
  98. }
  99. /**
  100. * 8803 重置弹框
  101. */
  102. static function resetFirstRechargeUI_OpenTip() {
  103. ctx()->privateData(true)->firstRechargeUI_OpenTip = 0;
  104. UserProc::updateUserInfo();
  105. return Resp::ok();
  106. }
  107. static $retArr;
  108. /**
  109. * 8815 新首冲功能5点前不能领取奖励,则该请求只是为了首充开发界面时获得最新时间戳
  110. */
  111. static function NewFirstRecharge() {
  112. UserProc::updateUserInfo();
  113. return Resp::ok(array(
  114. "ret" => 'true',
  115. ));
  116. }
  117. /**
  118. * [8814]领取奖励 (新版2021)
  119. */
  120. static function UserRechargeDrawPrize() {
  121. list($type, $typeId) = req()->paras;
  122. $user = ctx();
  123. self::$retArr = array();
  124. switch ($type) {
  125. case Enum_Recharge::FirstRecharge://首冲
  126. my_Assert($user->pay->firstRechage == 0, ErrCode::shop_firstRechargeNotRepeat);
  127. StoreProc::AddMultiItemInStore(GameConfig::globalsettings()->firstRechargePrizes);
  128. $user->pay->firstRechage = 1;
  129. self::$retArr[] = GameConfig::globalsettings()->firstRechargePrizes;
  130. break;
  131. case Enum_Recharge::DaliySpecialPackages://每日特惠
  132. my_Assert(!in_array($typeId, $user->shopdata->daliySpecialPackages), ErrCode::shop_daliySpecialRewardNotRepeat);
  133. $mo = GameConfig::shop_limit_getItem($typeId);
  134. my_Assert($mo != null, ErrCode::err_const_no);
  135. if ($mo->price != 0) {//购买60元7天特惠,则不是免费的礼包现在也可以领取。这里校验一下
  136. //my_Assert($user->shopdata->daliySpecial_ts!= 0, ErrCode::shop_daliySpecialRewardNotRepeat);
  137. $ts = $user->shopdata->daliySpecial_ts + 7 * 24 * 60 * 60;
  138. my_Assert(now() < $ts, ErrCode::shop_daliySpecialRewardNotRepeat);
  139. }
  140. $itemid = explode(',', $mo->reward)[0];
  141. $itemMO = GameConfig::item_package_getItem($itemid);
  142. my_Assert(null != $itemMO, ErrCode::err_const_no);
  143. StoreProc::AddMultiItemInStore($itemMO->contents);
  144. self::$retArr[] = $itemMO->contents;
  145. $shopdata = new Info_UserShop(ctx()->shopdata);
  146. $shopdata->daliySpecialPackages[] = $typeId;
  147. ctx()->shopdata = $shopdata;
  148. break;
  149. case Enum_Recharge::RechargeRebate://充值返利
  150. $mo = GameConfig::rechargeRebate_getItem(3, $typeId);
  151. my_Assert($mo != null, ErrCode::err_const_no);
  152. my_Assert($user->baseInfo->charge_amt >= $mo->rmb, ErrCode::shop_RechargeRebateRmbNotEnough);
  153. my_Assert(!in_array($typeId, $user->shopdata->rechargeRebateRewardsList), ErrCode::shop_RechargeRebateRewardNotRepeat);
  154. StoreProc::AddMultiItemInStore($mo->rewards);
  155. self::$retArr[] = $mo->rewards;
  156. break;
  157. case Enum_Recharge::LimitBuy://限购中免费礼包领取
  158. $packageCfg = GameConfig::shop_limit_getItem($typeId);
  159. my_Assert(null != $packageCfg, ErrCode::err_const_no);
  160. my_Assert($packageCfg->price == 0, ErrCode::shop_limit_NotFree);
  161. self::checklimitBuyRecharge($typeId);
  162. break;
  163. case Enum_Recharge::Accumulate: # 累充, gwang 2022.10.18
  164. // list($amount, $day) = explode('-', $typeId); # 拆分key1,key2
  165. // $cfg = GameConfig::shop_accumulating_getItem($amount, $day); # 配置对象
  166. // my_Assert(null != $cfg, ErrCode::err_const_no); # 防御null
  167. //
  168. // $acc = new Ins_Accumulate($user->shopdata->shopAccumulateData); # 累充对象
  169. // my_Assert(!$acc->IsDrawed($amount, $day), ErrCode::active_hasgetted); # 防御: 已经领取
  170. // my_Assert($user->baseInfo->rechargeFun_amt >= $cfg->amount, "累充金额不足!"); # 校验: 金额
  171. // my_Assert($acc->EndDay() >= tsDay(), "领取时间已过!"); # 校验: 时间
  172. // StoreProc::AddMultiItemInStore($cfg->goods); # 发放奖品
  173. // $user->shopdata->shopAccumulateData = $acc->SetDrawd($amount, $day); # 更新数据
  174. // self::$retArr[] = $cfg->goods;
  175. $mo = GameConfig::rechargeRebate_getItem(Enum_Recharge::Accumulate, $typeId);
  176. my_Assert($mo != null, ErrCode::err_const_no);
  177. my_Assert($user->baseInfo->charge_amt >= $mo->rmb, ErrCode::shop_RechargeRebateRmbNotEnough);
  178. my_Assert(!in_array($typeId, $user->shopdata->rechargeRebateRewardsList), ErrCode::shop_RechargeRebateRewardNotRepeat);
  179. $user->shopdata->rechargeRebateRewardsList[] = $typeId;
  180. StoreProc::AddMultiItemInStore($mo->rewards);
  181. self::$retArr[] = $mo->rewards;
  182. break;
  183. case Enum_Recharge::FirstRecharge_new:
  184. $mo = GameConfig::shop_accumulating_getItem($typeId);
  185. my_Assert(null != $mo, ErrCode::err_const_no);
  186. $shopdata = new Info_UserShop(ctx()->shopdata);
  187. $amount = $mo->amount;
  188. if (!StlUtil::dictHasProperty($shopdata->fRechargeRecord, $amount)) {
  189. $shopdata->fRechargeRecord->$amount = array();
  190. }
  191. my_Assert(!in_array($typeId, $shopdata->fRechargeRecord->$amount), ErrCode::active_FirstRechargeRewardRepeat);
  192. $shopdata->fRechargeRecord->$amount[] = $typeId;
  193. StoreProc::AddMultiItemInStore($mo->goods); # 发放奖品
  194. ctx()->shopdata = $shopdata;
  195. self::$retArr[] = $mo->goods;
  196. break;
  197. case Enum_Recharge::DayAccumulateRecharge: #每周累计金额奖励
  198. $mo = GameConfig::rechargeRebate_getItem($type, $typeId);
  199. my_Assert($mo != null, ErrCode::err_const_no);
  200. my_Assert($user->shopdata->dayRechargeAmt >= $mo->rmb, ErrCode::shop_RechargeRebateRmbNotEnough);
  201. my_Assert(!in_array($typeId, $user->shopdata->dayRechargeReceived), ErrCode::shop_RechargeRebateRewardNotRepeat);
  202. $user->shopdata->dayRechargeReceived[] = $typeId;
  203. // if ($rechargeType == 1) {
  204. // my_Assert($user->shopdata->dayRechargeAmt >= $mo->rmb, ErrCode::shop_RechargeRebateRmbNotEnough);
  205. // my_Assert(!in_array($rmb, $user->shopdata->dayRechargeReceived), ErrCode::shop_RechargeRebateRewardNotRepeat);
  206. // $user->shopdata->dayRechargeReceived[] = $rmb;
  207. // } else if($rechargeType == 2){
  208. // my_Assert($user->shopdata->weekRechargeAmt >= $mo->rmb, ErrCode::shop_RechargeRebateRmbNotEnough);
  209. // my_Assert(!in_array($rmb, $user->shopdata->weekRechargeReceived), ErrCode::shop_RechargeRebateRewardNotRepeat);
  210. // $user->shopdata->weekRechargeReceived[] = $rmb;
  211. // }
  212. StoreProc::AddMultiItemInStore($mo->rewards);
  213. self::$retArr[] = $mo->rewards;
  214. break;
  215. case Enum_Recharge::WeekAccumulateRecharge: #每周累计金额奖励
  216. $mo = GameConfig::rechargeRebate_getItem($type, $typeId);
  217. my_Assert($mo != null, ErrCode::err_const_no);
  218. my_Assert($user->shopdata->weekRechargeAmt >= $mo->rmb, ErrCode::shop_RechargeRebateRmbNotEnough);
  219. my_Assert(!in_array($typeId, $user->shopdata->weekRechargeReceived), ErrCode::shop_RechargeRebateRewardNotRepeat);
  220. $user->shopdata->weekRechargeReceived[] = $typeId;
  221. StoreProc::AddMultiItemInStore($mo->rewards);
  222. self::$retArr[] = $mo->rewards;
  223. break;
  224. default:
  225. break;
  226. }
  227. ctx($user);
  228. UserProc::updateUserInfo();
  229. return Resp::ok(array(
  230. "ret" => self::$retArr,
  231. "pay" => $user->pay,
  232. "shopdata" => ctx()->shopdata,
  233. "base" => $user->baseInfo,
  234. "store" => $user->store,
  235. ));
  236. }
  237. /**
  238. * 限购礼包--终身礼包--套装礼包--校验
  239. * @param type $packageId
  240. */
  241. private static function checklimitBuyRecharge($packageId) { # 参数; 礼包id
  242. $shopdata = new Info_UserShop(ctx()->shopdata);
  243. $packageCfg = GameConfig::shop_limit_getItem($packageId);
  244. my_Assert(null != $packageCfg, ErrCode::err_const_no);
  245. $arr = array();
  246. if ($packageCfg->goodsType == Enum_Recharge::LifelongGift) {
  247. $shopdata->lifelongGiftReceived[] = $packageId;
  248. $arr = $shopdata->lifelongGiftReceived;
  249. } elseif ($packageCfg->goodsType == Enum_Recharge::SuitGift) {
  250. $ts = now() - $shopdata->suitGiftStartTs;
  251. my_Assert($ts <= $packageCfg->limit_ts, ErrCode::shop_limit_TsMax); # 校验时间
  252. $shopdata->suitGiftReceived[] = $packageId;
  253. $arr = $shopdata->suitGiftReceived;
  254. } else {
  255. switch ((int) $packageCfg->subType) {
  256. case 1:
  257. $shopdata->purchasedDailyLimitPackages[] = $packageId;
  258. $arr = $shopdata->purchasedDailyLimitPackages;
  259. break;
  260. case 2:
  261. $shopdata->purchasedWeeklyLimitPackages[] = $packageId;
  262. $arr = $shopdata->purchasedWeeklyLimitPackages;
  263. break;
  264. case 3:
  265. $shopdata->purchasedMonthlyLimitPackages[] = $packageId;
  266. $arr = $shopdata->purchasedMonthlyLimitPackages;
  267. break;
  268. default:
  269. Err(ErrCode::err_innerfault);
  270. }
  271. }
  272. $hasN = count(array_filter($arr, function ($val)use ($packageId) { # 计数:筛选条件
  273. return $val == $packageId;
  274. }));
  275. my_Assert($hasN <= $packageCfg->limit_num, ErrCode::shop_limit_max); # 校验购买数量
  276. $itemid = explode(',', $packageCfg->reward)[0]; # 奖励礼包Id
  277. $itemMO = GameConfig::item_package_getItem($itemid);
  278. my_Assert(null != $itemMO, ErrCode::err_const_no);
  279. $err = StoreProc::AddMultiItemInStore($itemMO->contents); # 发放奖励
  280. self::$retArr[] = $itemMO->contents;
  281. my_Assert(ErrCode::ok == $err, $err);
  282. ctx()->shopdata = $shopdata; # 回写数据
  283. }
  284. /**
  285. * [8813] 充值发货 (新版2021)
  286. */
  287. static function PayDeliverGoods() {
  288. list($cpOrderId) = req()->paras;
  289. $result = pay_op::CheckAndDrawOrder(req()->uid, $cpOrderId, array(new PayProc, 'distributePayGoods'));
  290. my_Assert($result->err == 0, ErrCode::pay_fail);
  291. $user = ctx();
  292. NormalEventProc::OnPaySuccess();
  293. UserProc::updateUserInfo(); # 回写玩家数据
  294. return Resp::ok(array(
  295. "ret" => self::$retArr, # # 奖励串
  296. "mod" => $result->ret, # # 商品刷新模块名
  297. "baseInfo" => $user->baseInfo,
  298. // "shopdata" => $user->shopdata,
  299. "store" => $user->store,
  300. 'task' => ctx()->task,
  301. 'heros' => ctx()->heros,
  302. 'privateState' => $user->privateState,
  303. ));
  304. }
  305. /**
  306. * 发货
  307. * @param \loyalsoft\pay\dbOrder $order
  308. * @return bool
  309. */
  310. static function distributePayGoods($order = null) {
  311. my_Assert($order->product_id != null, ErrCode::pay_order_product_id);
  312. $user = ctx();
  313. self::$retArr = array();
  314. $shopItem = GameConfig::shop_getItem($order->product_id); # 商城总表中查找下配置数据
  315. $mod = "";
  316. if (null != $shopItem) {
  317. switch ($shopItem->shopItemType) {
  318. case 'cash': # 充值二级货币
  319. $cashMo = GameConfig::shop_cash_getItem($shopItem->shopItemTypeId);
  320. my_Assert(null != $cashMo, ErrCode::err_const_no);
  321. // StoreProc::AddMultiItemInStore($cashMo->reward, "付费");
  322. self::$retArr[] = ShopProc::BuyShop_Cash(EnumShopGift::Cash_Shop, $shopItem->shopItemTypeId, $order->product_count);
  323. break;
  324. case 'monthcard': # 月卡
  325. $monthCardMo = GameConfig::shop_monthcard_getItem($shopItem->shopItemTypeId);
  326. my_Assert(null != $monthCardMo, ErrCode::err_const_no);
  327. ShopProc::BuyShop_MonthCard(EnumShopGift::MonthCard_Shop, $shopItem->shopItemTypeId, $order->product_count);
  328. break;
  329. case 'battlePass_gate':
  330. ctx()->privateData(true)->battlePass_gate_cost_ts = now();
  331. break;
  332. case 'battlePass_activePoint':
  333. ctx()->privateData(true)->battlePass_activePoint_cost_ts = now();
  334. break;
  335. case 'battlePass_tili':
  336. ctx()->privateData(true)->battlePass_tili_cost_ts = now();
  337. break;
  338. case 'box':
  339. case 'daily':
  340. case 'gategift':
  341. case 'gold':
  342. case 'junbei':
  343. case 'supply' :
  344. default:
  345. my_Assert(false, "该道具并非现金充值类!");
  346. break;
  347. }
  348. $mod = $shopItem->shopItemType;
  349. }
  350. // <editor-fold defaultstate="collapsed" desc="已废弃逻辑">
  351. // else if ($order->product_id == 1) {
  352. // $user->base(true)->Add_Cash($order->product_count);
  353. // self::$retArr[] = "2," . $order->product_count;
  354. // } else if ($order->product_id >= 6 && $order->product_id <= 1000) {//充值表
  355. // $mo = GameConfig::recharge_getItem($order->product_id);
  356. // my_Assert($mo != null, ErrCode::err_const_no);
  357. //
  358. // if (!StlUtil::dictHasProperty($user->shopdata, 'rechargeRecordList')) {
  359. // $user->shopdata->rechargeRecordList = array();
  360. // }
  361. //
  362. // $cash = $mo->rmd * 10;
  363. // if (!in_array($order->product_id, $user->shopdata->rechargeRecordList)) {
  364. // $cash = $mo->rmd * 10 * $mo->firstDouble;
  365. // $user->shopdata->rechargeRecordList[] = $order->product_id;
  366. // }
  367. // $user->base(true)->Add_Cash($cash);
  368. // self::$retArr[] = "2," . $cash;
  369. // } elseif ($order->product_id >= 801001 && $order->product_id <= 803999) {//限购
  370. // self::checklimitBuyRecharge($order->product_id);
  371. //
  372. // $mo = GameConfig::shop_limit_getItem($order->product_id);
  373. // if ($mo->subType == 1) {
  374. // $user->shopdata->dayRechargeAmt += $order->amount;
  375. // } else if ($mo->subType == 2) {
  376. // $user->shopdata->weekRechargeAmt += $order->amount;
  377. // }
  378. // } elseif ($order->product_id >= 804001 && $order->product_id <= 804999) {//每日特惠
  379. // $mo = GameConfig::shop_limit_getItem($order->product_id);
  380. // my_Assert($mo != null, ErrCode::err_const_no);
  381. // if ($mo->price == 60) {
  382. // $user->shopdata->daliySpecial_ts = now();
  383. // } else {
  384. // $itemid = explode(',', $mo->reward)[0];
  385. // $itemMO = GameConfig::item_package_getItem($itemid);
  386. // my_Assert(null != $itemMO, ErrCode::err_const_no);
  387. // StoreProc::AddMultiItemInStore($itemMO->contents);
  388. // $user->shopdata->daliySpecialPackages[] = $mo->typeId;
  389. // self::$retArr[] = $itemMO->contents;
  390. // }
  391. // } elseif ($order->product_id >= 805001 && $order->product_id <= 805999) {//限时
  392. // $mo = GameConfig::shop_limit_getItem($order->product_id);
  393. // my_Assert($mo != null, ErrCode::err_const_no);
  394. // my_Assert(!in_array($order->product_id, $user->shopdata->limitTsActiveRewardsList), ErrCode::err_const_no);
  395. //
  396. // $user->shopdata->limitTsActiveRewardsList[] = $mo->typeId;
  397. // $itemid = explode(',', $mo->reward)[0];
  398. // $itemMO = GameConfig::item_package_getItem($itemid);
  399. // my_Assert(null != $itemMO, ErrCode::err_const_no);
  400. // StoreProc::AddMultiItemInStore($itemMO->contents); //领取奖励
  401. // self::$retArr[] = $itemMO->contents;
  402. // } elseif ($order->product_id >= 806001 && $order->product_id <= 806999) {//首充【2022-10-19新的首充功能】
  403. // $mo = GameConfig::shop_accumulating_getItem($order->product_id);
  404. // my_Assert($mo != null, ErrCode::err_const_no);
  405. // $shopdata = new Info_UserShop(ctx()->shopdata);
  406. // $amount = $mo->amount;
  407. // if (!StlUtil::dictHasProperty($shopdata->fRechargeTime, $amount)) {
  408. // $shopdata->fRechargeTime->$amount = TimeUtil::tsDay();
  409. // }
  410. // $cost = 0;
  411. // $dic = GameConfig::shop_accumulating();
  412. // foreach ($dic as $k => $item) {
  413. // if ($cost <= $item->amount) {
  414. // $cost = $item->amount;
  415. // }
  416. // }
  417. // if ($cost <= $amount && $shopdata->suitGiftStartTs == 0) {
  418. // $shopdata->suitGiftStartTs = now();
  419. // }
  420. // ctx()->shopdata = $shopdata;
  421. // //self::$retArr[] = $mo->goods;
  422. // } elseif ($order->product_id >= 807001 && $order->product_id <= 807999) {//终身礼包
  423. // self::checklimitBuyRecharge($order->product_id);
  424. // } elseif ($order->product_id >= 808001 && $order->product_id <= 808999) {//套装礼包
  425. // self::checklimitBuyRecharge($order->product_id);
  426. // } elseif ($order->product_id >= 901001 && $order->product_id <= 999999) {//月卡
  427. // $shopdata = new Info_UserShop(ctx()->shopdata);
  428. // $packageCfg = GameConfig::shop_monthVIP_getItem($order->product_id);
  429. // my_Assert(null != $packageCfg, ErrCode::err_const_no);
  430. // if ($packageCfg->subType == 4) {
  431. // my_Assert($shopdata->monthlyVIP1_ts + $packageCfg->ExpireTs * 3600 * 24 < now(), ErrCode::shop_monthlyvip_buyed);
  432. // } elseif ($packageCfg->subType == 5) {
  433. // my_Assert($shopdata->monthlyVIP2_ts + $packageCfg->ExpireTs * 3600 * 24 < now(), ErrCode::shop_monthlyvip_buyed);
  434. // }
  435. // $err = StoreProc::AddMultiItemInStore($packageCfg->pri_reward); # 发放一次性奖励
  436. // self::$retArr[] = $packageCfg->pri_reward;
  437. // my_Assert(ErrCode::ok == $err, $err);
  438. // if ($packageCfg->subType == 4) {
  439. // $shopdata->monthlyVIP1_ts = 3600 * 24 * (totalDays() + 1) - 1;
  440. // } elseif ($packageCfg->subType == 5) {
  441. // $shopdata->monthlyVIP2_ts = 3600 * 24 * (totalDays() + 1) - 1;
  442. // }
  443. //
  444. // EmailProc::SendMonthlyVIPDailyReward(req()->zoneid, req()->uid, $packageCfg->name, $packageCfg->daily_reward);
  445. //
  446. // ctx()->shopdata = $shopdata;
  447. // }
  448. // </editor-fold>
  449. $user->baseInfo->charge_amt += $order->amount; # 统计下累充金额
  450. ctx($user);
  451. return [true, $mod];
  452. }
  453. static function suitGiftCheck() {
  454. $shopdata = new Info_UserShop(ctx()->shopdata);
  455. $cost = 0;
  456. $dic = GameConfig::shop_accumulating();
  457. foreach ($dic as $k => $item) {
  458. if ($cost <= $item->amount) {
  459. $cost = $item->amount;
  460. }
  461. }
  462. if (StlUtil::dictHasProperty($shopdata->fRechargeTime, $cost)) {
  463. if ($shopdata->suitGiftStartTs == 0) {
  464. $shopdata->suitGiftStartTs = now();
  465. }
  466. } else {
  467. $shopdata->suitGiftStartTs = 0;
  468. }
  469. ctx()->shopdata = $shopdata;
  470. }
  471. static function checkAmount($order) {
  472. my_Assert($order->product_id != null, ErrCode::pay_order_product_id);
  473. if ($order->product_id >= 6 && $order->product_id <= 1000) {//充值表
  474. $mo = GameConfig::recharge_getItem($order->product_id);
  475. my_Assert($mo != null, ErrCode::err_const_no);
  476. my_Assert($order->amount == $mo->rmd, ErrCode::pay_price_err);
  477. } elseif ($order->product_id >= 801001 && $order->product_id <= 801999) {//限购
  478. //该功能暂时没有开发
  479. } elseif ($order->product_id >= 804001 && $order->product_id <= 804999) {//每日特惠
  480. $mo = GameConfig::shop_limit_getItem($order->product_id);
  481. my_Assert($mo->price == $order->amount, ErrCode::pay_price_err);
  482. } elseif ($order->product_id >= 805001 && $order->product_id <= 805999) {//限时
  483. //该功能暂时没有开发
  484. } elseif ($order->product_id >= 901001 && $order->product_id <= 999999) {//月卡
  485. $packageCfg = GameConfig::shop_monthVIP_getItem($order->product_id);
  486. my_Assert(null != $packageCfg, ErrCode::err_const_no);
  487. my_Assert($packageCfg->price == $order->amount, ErrCode::pay_price_err);
  488. }
  489. return true;
  490. }
  491. /**
  492. * 礼包有了的第一次登录记录
  493. */
  494. static function SuitGiftTsRecord() {
  495. $shopdata = new Info_UserShop(ctx()->shopdata);
  496. if (!StlUtil::dictHasProperty($shopdata, 'suitGiftStartTs')) {
  497. $shopdata->suitGiftStartTs = 0;
  498. }
  499. if ($shopdata->suitGiftStartTs == 0) {
  500. $shopdata->suitGiftStartTs = now();
  501. }
  502. ctx()->shopdata = $shopdata;
  503. }
  504. /**
  505. * 8812 查询充值记录
  506. */
  507. static function GetPayRecoreds() {
  508. $uid = req()->uid;
  509. $table = "tpl_order_tab";
  510. $arr = daoInst()->select(" cpOrderId as '订单' ,product_name as '道具',amount as '金额' ,from_unixtime(order_ts) as '时间' ")->from($table)
  511. ->where("uid")->eq($uid)
  512. ->andWhere("status")->eq(1)
  513. ->fetchall();
  514. return Resp::ok($arr);
  515. }
  516. //
  517. // <editor-fold defaultstate="collapsed" desc=" 移动支付 - 刷新订单 ">
  518. /**
  519. * 刷新充值订单(领取充值结果)
  520. */
  521. public static function m_refreshChargeOrders() {
  522. # 客户端参数解析
  523. $uid = req()->uid; # userID
  524. $zoneid = req()->zoneid; # 分区Id
  525. if (count(req()->paras) <= 0) { # 参数为空, 执行自检逻辑
  526. return self::selfhelpCheckOrders();
  527. }
  528. $cpOrderId = req()->paras[0]; # 后台订单编号
  529. if (!$uid || ($zoneid < 1) || strlen($cpOrderId) != 16) { # 订单编号长16位
  530. return Resp::err(ErrCode::paras_err);
  531. }
  532. $order = daoInst()->select()->from(self::orderTab) # 取订单数据
  533. ->where('cpOrderId')->eq($cpOrderId)
  534. ->limit(1)->fetch();
  535. if (!$order) {
  536. // var_dump($order);
  537. CLog::pay(' 订单不存在! ' . $cpOrderId);
  538. return Resp::err(ErrCode::pay_order_no);
  539. }
  540. if (false === strpos($uid, $order->uid)) { # UID不符
  541. return Resp::err(ErrCode::pay_order_uid);
  542. }
  543. if ($order->status != 1) {
  544. CLog::pay(' 订单尚未完成支付!');
  545. return Resp::err(ErrCode::pay_order_paystatus);
  546. }
  547. if ($order->drawed_ts > 0) { # 定单已经发过货了
  548. CLog::pay(' 订单重复请求发货!' . $cpOrderId);
  549. return Resp::err(ErrCode::pay_order_drawed);
  550. }
  551. // 准备发货
  552. $product_id = $order->product_id;
  553. $product_count = $order->product_count;
  554. $typid = substr("$product_id", 0, 3); # 提取商品编号前缀
  555. switch ($typid) {
  556. case '802': # 神秘商城物品
  557. $item = GameConfig::secretshop_typeId_getItem($product_id);
  558. break;
  559. case '801': # 商城物品
  560. $item = GameConfig::shop_getItem($product_id);
  561. break;
  562. default :
  563. return Resp::err(ErrCode::pay_systembusy_err);
  564. }
  565. my_Assert(isset($item), ErrCode::pay_shopItem_cosnt_goods_err);
  566. if ($item->pricetype != 0) {
  567. CLog::pay(" 道具付费类型异常:" . $product_id);
  568. return Resp::err(ErrCode::pay_m_type_err);
  569. }
  570. for ($i = 0; $i < $product_count; $i++) { # 默认为1,还没有设计为n的情况
  571. StoreProc::AddMultiItemInStore($item->goods, 5); # 发货
  572. }
  573. $n = daoInst()->update(self::orderTab)
  574. ->data(array('drawed_ts' => now()))
  575. ->where('cpOrderId')->eq($cpOrderId)
  576. ->exec();
  577. my_Assert($n > 0, ErrCode::err_db); # 数据库操作失败
  578. ctx()->baseInfo->charge_amt += $order->amount; # 历史充值记录(单位分)
  579. UserProc::updateUserInfo(); # 更新玩家数据信息
  580. Event::trigger('pay', array('amt' => $order->amount)); # 触发充值事件
  581. CLog::pay("订单发货成功: $cpOrderId");
  582. return Resp::ok(# 返回
  583. array('cash' => ctx()->baseInfo->cash, # # 直接将游戏币的最新值返回给客户端
  584. 'charge_amt' => ctx()->baseInfo->charge_amt, # 充值总记录
  585. 'store' => ctx()->store, # # 背包
  586. 'goods' => $item->goods, # # 发货内容
  587. 'count' => $product_count, # # 发货数量
  588. )
  589. );
  590. }
  591. /**
  592. * 检查删档内测订单
  593. */
  594. static function checkDeltest() {
  595. $uid = req()->uid;
  596. if (ctx()->privateState->deltest == 1) {
  597. $orders = daoInst()->select()->from('tpl_order_tab_deltest')
  598. ->where('uid')->eq($uid)
  599. ->andwhere('status')->eq(1)
  600. ->fetchall();
  601. if (count($orders) > 0) { # 有充值记录
  602. foreach ($orders as $order) {
  603. // 翻倍发放砖石
  604. isEditor() and $order = new pay\dbOrder();
  605. $rmb = intval($order->amount / 100); # 计算充值金额(元)
  606. EmailProc::SendDelTestMail(req()->zoneid, $uid, $rmb);
  607. CLog::pay(req()->uid . '发送删档内侧补偿邮件' . $order->cpOrderId);
  608. }
  609. }
  610. ctx()->privateData(true)->deltest = 0;
  611. }
  612. // CLog::pay('删档内测补偿检查');
  613. }
  614. /**
  615. * 检查异常订单, 补发道具
  616. */
  617. public static function selfhelpCheckOrders() {
  618. $uid = req()->uid;
  619. $orders = daoInst()->select()
  620. ->from('tpl_order_tab')
  621. ->where('uid')->eq($uid)
  622. ->andWhere('status')->eq(1)
  623. ->andWhere('drawed_ts')->le(0)
  624. ->fetchAll();
  625. if (count($orders) > 0) {
  626. foreach ($orders as $order) {
  627. // 准备补发
  628. $product_id = $order->product_id;
  629. $product_count = $order->product_count;
  630. $typid = substr("$product_id", 0, 3); # 提取商品编号前缀
  631. $goods = '';
  632. switch ($typid) {
  633. case '802': # 神秘商城物品
  634. $item = GameConfig::secretshop_typeId_getItem($product_id);
  635. break;
  636. case '801': # 商城物品
  637. $item = GameConfig::shop_getItem($product_id);
  638. break;
  639. default :
  640. return Resp::err(ErrCode::pay_systembusy_err);
  641. }
  642. if (!$item) {
  643. return Resp::err(ErrCode::pay_shopItem_cosnt_goods_err);
  644. }
  645. if ($item->pricetype != 0) { # 并非人民币定价
  646. CLog::pay(" 道具付费类型异常:" . $product_id);
  647. return Resp::err(ErrCode::pay_m_type_err);
  648. }
  649. for ($i = 0; $i < $product_count; $i++) { # 默认为1,还没有设计为n的情况
  650. StoreProc::AddMultiItemInStore($item->goods, 5); # 发货
  651. }
  652. $goods .= $item->goods;
  653. $n = daoInst()->update(self::orderTab) # 更新订单状态
  654. ->data(array('drawed_ts' => now()))
  655. ->where('cpOrderId')->eq($order->cpOrderId)
  656. ->exec();
  657. if (!$n) { # 影响条数应为1
  658. CLog::pay(req()->uid . ' 登录补发订单失败 ' . $order->cpOrderId);
  659. return Resp::err(ErrCode::err_db); # 数据库操作失败
  660. }
  661. ctx()->baseInfo->charge_amt += $order->amount; # 历史充值记录(单位分)
  662. UserProc::updateUserInfo(); # 回写玩家数据
  663. CLog::pay(req()->uid . ' 登录补发订单 ' . $order->cpOrderId);
  664. }
  665. return Resp::ok(# 返回
  666. array('cash' => ctx()->baseInfo->cash, # # 直接将游戏币的最新值返回给客户端
  667. 'store' => ctx()->store, # # 背包
  668. 'goods' => $goods, # # 发货内容
  669. 'count' => count($orders), # # 发货数量
  670. 'msg' => "找到并处理" . count($orders) . "条未发货订单."
  671. ));
  672. }
  673. return Resp::ok('ok'); # everything is ok!
  674. }
  675. // </editor-fold>
  676. //
  677. // <editor-fold defaultstate="collapsed" desc=" 移动支付 - 商城购买 ">
  678. /**
  679. * 8810 免费或利用【游戏内货币】获取神秘商城物品
  680. * 刷新规则: 根据玩家拥有的英雄、装备、道具等数据进行刷新。(因英雄、道具、装备数量不足以支撑该刷新规则,目前先按照随机刷新做,几率平等)
  681. */
  682. public static function m_pay_getDynamic() {
  683. $user = ctx();
  684. $userSecretshop = new Info_UserSecretshop($user->userSecretshop);
  685. // 参数提取
  686. $refreshType = req()->paras[0]; # 刷新类型(参数)0,不刷,1,免费刷,2,钻石刷
  687. switch ($refreshType) {
  688. case 1: # 免费刷
  689. if (now() < $userSecretshop->lastRefreshTs + glc()->secretshop_refresh_interval) { // 检查是否达到免费刷新时间了, 执行自动更新
  690. return Resp::err(ErrCode::pay_secretshopt_freeRefresh_Time);
  691. }
  692. break;
  693. case 2: # 钻石刷
  694. if (glc()->secretshop_refresh_maxtimes <= $userSecretshop->refreshedTimes) { // 检查刷新次数, 已达上限, 返回错误信息
  695. return Resp::err(ErrCode::pay_refresh_times);
  696. } # 可以继续刷新,
  697. $cishu = $userSecretshop->refreshedTimes + 1; # 下次
  698. $amt = GameConfig::secretshop_refresh_getItem($cishu)->price;
  699. if (!$user->base(true)->Consume_Cash($amt)) { # 扣除本次所需费用, 余额不足, 返回错误信息
  700. return Resp::err(ErrCode::notenough_cash_msg);
  701. }
  702. $userSecretshop->refreshedTimes++; # 增加当天付费刷新计数
  703. break;
  704. case 0: # 不刷
  705. default : # 默认不刷
  706. // do nothing.
  707. break;
  708. }
  709. if ($refreshType != 0) { # 是否刷新
  710. $err = self::refreshDynamicShopItems($userSecretshop); # 更新物品表
  711. if ($err) {
  712. return Resp::err($err);
  713. }
  714. $user->userSecretshop = $userSecretshop;
  715. ctx($user);
  716. UserProc::updateUserInfo();
  717. }
  718. // 返回最新物品表
  719. return Resp::ok(array(# # 成功后将最新的玩家数据返回给客户端
  720. 'gold' => $user->baseInfo->gold,
  721. 'tili' => $user->baseInfo->tili,
  722. 'cash' => $user->baseInfo->cash,
  723. 'uss' => $userSecretshop, # # 当前神秘商城数据
  724. ));
  725. }
  726. /**
  727. * 更新神秘商城物品
  728. * @param Info_UserSecretshop $userSecretshop Description
  729. */
  730. private static function refreshDynamicShopItems(&$userSecretshop) {
  731. $userSecretshop->lastRefreshTs = now();
  732. // todo: 这里补完更新物品的函数, // 第一版: 随机
  733. $userSecretshop->currentItems = ObjectInit();
  734. for ($i = 1; $i <= 3; $i++) { # 3种类型的商品
  735. $arr = GameConfig::secretshop_goodsType_getItem($i);
  736. if (count($arr) > 0) {
  737. $err = self::Dice(GameConfig::secretshop_goodsType_getItem($i), 1, $userSecretshop); # 一个种类一次1个物品
  738. if ($err) {
  739. return $err;
  740. }
  741. }
  742. }
  743. return ErrCode::ok;
  744. }
  745. /**
  746. * 投骰子
  747. * @param assoc_array $arr 奖池物品
  748. * @param int $number 提取数量
  749. * @return string itemid,num;itemid,num;...
  750. */
  751. private static function Dice($arr, $number, &$userSecretshop) {
  752. $max = 0; # 计算物品权重总和
  753. array_walk($arr, function ($value) use (&$max) {
  754. $max += $value->probability;
  755. });
  756. if (!$max) { # 配置数据有问题
  757. return ErrCode::err_const_no;
  758. }
  759. for ($i = 0; $i < $number; $i++) {
  760. $rnd = CommUtil::random(1, $max); # 投骰子
  761. $start = 0;
  762. $rew = null;
  763. foreach ($arr as $item) { # 循环判断落入那个物品上
  764. if (CommUtil::isPropertyExists($item, 'probability') // #
  765. && $start < $rnd && $rnd <= $start + $item->probability) { # 落入区间
  766. $rew = $item; # 记录物品
  767. break;
  768. }
  769. $start += $item->probability; # 继续判断是否落入下一物品的区间
  770. } # foreach end
  771. if (!$rew) {
  772. return ErrCode::lottery_noselecteditem;
  773. }
  774. $id = $rew->typeId;
  775. $userSecretshop->currentItems->$id = 0;
  776. } # for end
  777. return ErrCode::ok;
  778. }
  779. /**
  780. * 清理每日各种上限
  781. */
  782. private static function clearDailyLimits() {
  783. $userSecretshop = new Info_UserSecretshop(ctx()->userSecretshop);
  784. $userSecretshop->refreshedTimes = 0;
  785. ctx()->userSecretshop = $userSecretshop;
  786. }
  787. /**
  788. * [8809]【游戏内货币】购买神秘商城物品
  789. * 规则: 商城物品会刷新
  790. */
  791. public static function m_pay_buyDynamic() {
  792. $user = new Data_UserGame(ctx());
  793. $userSecretshop = new Info_UserSecretshop($user->userSecretshop);
  794. $itemId = req()->paras[0]; # 商品id (点一次购买一个)
  795. $num = 1; # 暂时固定为一次购买一个
  796. #
  797. my_Assert(CommUtil::isPropertyExists($userSecretshop->currentItems, $itemId), ErrCode::pay_secretshop_noitem_err);
  798. $cishu = $userSecretshop->currentItems->$itemId; # 购买次数
  799. my_Assert($cishu < glc()->secretshop_itembuy_maxtimes, ErrCode::pay_secretshop_buytimes); # 判断购买次数
  800. $shopItem = GameConfig::secretshop_typeId_getItem($itemId); # 常量数据
  801. $amt = $shopItem->price * pow(2, $cishu); # 计算价格
  802. switch ($shopItem->pricetype) {
  803. case 1:
  804. my_Assert($user->base(true)->Consume_Cash($amt), ErrCode::notenough_cash_msg); # 扣除钻石
  805. break;
  806. case 2:
  807. my_Assert($user->base(true)->Consume_Gold($amt), ErrCode::notenough_gold_msg); # 扣除金币
  808. break;
  809. default :
  810. return Resp::err(ErrCode::pay_m_type_err);
  811. }
  812. // 道具解包/发货
  813. $err = self::expendSecretShopItem($shopItem, $num); # 发放商品
  814. if ($err != ErrCode::ok) { # 发货失败
  815. return Resp::err($err);
  816. }
  817. $userSecretshop->currentItems->$itemId += 1; # 购买次数+1
  818. $user->userSecretshop = $userSecretshop;
  819. ctx($user);
  820. UserProc::updateUserInfo(); # 回写数据
  821. // StatProc::secretShopbuy($req->zoneid, $req->uid, $itemId, $num); # 统计/监控数据
  822. return Resp::ok(array(# # 成功后将最新的玩家数据返回给客户端
  823. 'gold' => $user->baseInfo->gold,
  824. 'tili' => $user->baseInfo->tili,
  825. 'cash' => $user->baseInfo->cash,
  826. 'store' => $user->baseInfo->store, # # 背包,(装备、碎片、。。)
  827. 'heros' => $user->baseInfo->heros # # 角色
  828. ));
  829. //
  830. }
  831. /**
  832. * [8807]【游戏内货币】购买普通商城物品
  833. */
  834. public static function m_pay() {
  835. $user = ctx(); # user引用
  836. my_Assert(count(req()->paras) >= 3, ErrCode::parasnotenough_msg); # 参数不足
  837. list($paytype, $itemId, $num) = req()->paras; # 付费类型, 1.钻石, 2.金币 ,道具ID ,数量, 默认为1
  838. my_Assert($num >= 1, ErrCode::paras_err); # 参数非法,
  839. $shopItem = GameConfig::shop_getItem($itemId); # 取商品的常量数据
  840. my_Assert(isset($shopItem), ErrCode::err_const_no); # 检测是否存在道具的常量数据
  841. my_Assert($shopItem->pricetype == $paytype, ErrCode::pay_price_err); # 商品定价类型检查
  842. $amt = $shopItem->price; # 道具价格(钻石)
  843. my_Assert($amt > 0, ErrCode::pay_price_err); # 商品定价数值检查
  844. $bDeal = false; # 成交标志位
  845. switch ($paytype) { # 1. 钻石, 2. 金币, other:非法
  846. case 1: # 钻石
  847. $bDeal = ctx()->base(true)->Consume_Cash($amt); # 更新(扣除)玩家游戏币(钻石)余额
  848. my_Assert($bDeal, ErrCode::notenough_cash_msg); # 防范扣除失败
  849. break;
  850. case 2: # 金币
  851. $bDeal = $user->base(true)->Consume_Gold($amt * $num); # 更新玩家金币余额
  852. my_Assert($bDeal, ErrCode::notenough_gold_msg); # 防范扣除失败
  853. break;
  854. default : # 未知的支付类型
  855. return Resp::err(ErrCode::pay_m_type_err);
  856. }
  857. my_Assert($bDeal, ErrCode::err_innerfault); # 交易失败
  858. $err = self::expendShopItem($shopItem, $num); # 发放商品(普通商城只有金币和体力)
  859. my_Assert(ErrCode::ok == $err, $err); # 防范发货失败
  860. UserProc::updateUserInfo(); # 回写数据
  861. // StatProc::shopbuy($zoneid, $uid, $itemId, $num); # 统计/监控数据
  862. return Resp::ok(array(# # 成功后将最新的玩家数据返回给客户端
  863. 'gold' => $user->baseInfo->gold,
  864. 'tili' => $user->baseInfo->tili,
  865. 'cash' => $user->baseInfo->cash,
  866. 'store' => $user->store
  867. ));
  868. }
  869. /**
  870. * 解包商城物品并发货
  871. * @param sm_Shop $shopItem
  872. * @param int $num 数量
  873. */
  874. private static function expendShopItem($shopItem, $num) {
  875. for ($i = 0; $i < $num; $i++) {
  876. $err = StoreProc::AddMultiItemInStore($shopItem->goods, '商城');
  877. my_Assert(ErrCode::ok == $err, $err);
  878. }
  879. return ErrCode::ok;
  880. }
  881. /**
  882. * 道具解包并发货(神秘商城)
  883. * @param sm_secretshop $shopItem
  884. * @param type $num
  885. */
  886. private static function expendSecretShopItem($shopItem, $num) {
  887. for ($i = 0; $i < $num; $i++) {
  888. $err = StoreProc::AddMultiItemInStore($shopItem->goods, '神秘商城');
  889. if ($err) {
  890. return $err;
  891. }
  892. }
  893. return ErrCode::ok;
  894. }
  895. // </editor-fold>
  896. //
  897. //
  898. // <editor-fold defaultstate="collapsed" desc=" 支付活动 - 首付礼包">
  899. /**
  900. * [8802] 领取首付礼包
  901. */
  902. public static function m_GetFirstPayGift() {
  903. //list($day) = req()->paras;
  904. // $itemId = glc()->FirstPay_ItemId;
  905. // $privateState = ctx()->privateState;
  906. //
  907. // if (CommUtil::isPropertyExists($privateState, "firstPayGift") #
  908. // && $privateState->firstPayGift) { # 如果已经领取首付礼包
  909. // return Resp::err(ErrCode::pay_firstpaygetted);
  910. // }
  911. // my_Assert(ctx()->baseInfo->charge_amt > 0, ErrCode::pay_firstpayno_err); # 如果尚未完成首付
  912. //
  913. // $itemModel = GameConfig::shop_getItem($itemId); # 取商品常量
  914. // if ($itemModel == null) { # 检测首付礼包是否存在
  915. // return Resp::err(ErrCode::err_const_no);
  916. // }
  917. // ctx()->privateState->firstPayGift = true; # 设置首付标志
  918. my_Assert(ctx()->baseInfo->charge_amt != 0, ErrCode::pay_firstpayno_err);
  919. //my_Assert(!in_array($day, ctx()->privateState->firstRechargeRewardRecord), ErrCode::pay_repeatReceive);
  920. // $ts = TimeUtil::totalDays(ctx()->privateState->firstRechargeTs);
  921. // $sTs = $ts + $day -1;
  922. // my_Assert(TimeUtil::totalDays() >= $sTs, ErrCode::pay_rewardReceive_ts_limit);
  923. for ($i = 1; $i <= ctx()->privateState->firstRecharge_receiveTag; $i++) {
  924. if (!in_array($i, ctx()->privateState->firstRechargeRewardRecord)) {
  925. ctx()->privateData(true)->firstRechargeRewardRecord[] = $i;
  926. $mo = GameConfig::firstrecharge_reward_getItem($i);
  927. my_Assert($mo != null, ErrCode::err_const_no);
  928. StoreProc::AddMultiItemInStore($mo->reward); # 发放首付礼包到玩家仓库
  929. }
  930. }
  931. ctx()->privateData(true)->firstRechargeUI_OpenTip = 0;
  932. UserProc::updateUserInfo(); # 更新玩家数据
  933. return Resp::ok(array('gold' => ctx()->baseInfo->gold,
  934. 'cash' => ctx()->baseInfo->cash,
  935. 'tili' => ctx()->baseInfo->tili,
  936. 'tili_ts' => ctx()->baseInfo->tili_ts,
  937. 'accumulateYuanBao' => ctx()->baseInfo->accumulateYuanBao,
  938. 'store' => ctx()->store,
  939. 'privateState' => ctx()->privateState,
  940. 'reward' => StoreProc::$reward,
  941. 'reward_Gem' => StoreProc::$reward_Gem,
  942. 'reward_equip' => StoreProc::$reward_equip,
  943. ));
  944. }
  945. public static function setFirstRechargeLoginTag() {
  946. if (ctx()->baseInfo->charge_amt == 0) {
  947. return;
  948. }
  949. if (ctx()->privateState->firstRecharge_receiveTag == 3) {
  950. return;
  951. }
  952. if (ctx()->privateState->firstRecharge_receiveTag < 1) {
  953. return;
  954. }
  955. ctx()->privateData(true)->firstRecharge_receiveTag += 1;
  956. }
  957. // </editor-fold>
  958. //
  959. //
  960. //
  961. }