PayProc.php 50 KB

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