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