PayProc.php 53 KB

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