YuanBaoPayProc.php 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252
  1. <?php
  2. namespace loyalsoft;
  3. /*
  4. * 支付日志模块
  5. * 2016.10.13 gwang 提取
  6. */
  7. /**
  8. * 支付日志类
  9. */
  10. class YuanBaoPayProc {
  11. /**
  12. * 【多平台】扣除玩家游戏币(Ps.发货逻辑最后执行此步骤)
  13. * @param UserModel $user
  14. * @param Req $req Description
  15. * @param int $amt 扣除数量
  16. * @param string $source (string)备注,扣除来源(模块)
  17. * @return int ErrCode
  18. */
  19. public static function mn_SaveUserYuanbao($req, $amt, $source = "") {
  20. $err = ErrCode::ok;
  21. if ($amt > 0) { // 防御,数量不可能小于0
  22. $user = $req->userInfo->game->baseInfo;
  23. $zoneid = $req->zoneid; // 分区Id
  24. if ($user->yuanbao < $amt) { // 余额不足
  25. CLog::err("[Cheating] mn_SaveUserYuanbao:" . $req->uid, __CLASS__);
  26. $err = ErrCode::notenought_yuanbao;
  27. } else {// 更新玩家游戏币余额
  28. $user->yuanbao -= $amt;
  29. self::$m_billno = date("Y-m-d H:i:is");
  30. }
  31. self::_mPayLog($zoneid, $req->uid, MLogType::Save, $err, #
  32. $amt, $user->yuanbao, $user->cash, $user->gift_cash, $user->charge_amt, $source);
  33. }
  34. return $err;
  35. }
  36. /**
  37. * 新版支付(引入元宝这种货币)
  38. * @param Req $req
  39. * @return type
  40. */
  41. public static function m_payByYuanbao($req) {
  42. $resp = Resp::err(ErrCode::err_method_notimplement);
  43. $user = $req->userInfo->game->baseInfo; # user引用
  44. $privateState = $req->userInfo->game->privateState;
  45. // 客户端参数解析
  46. $paytype = $req->paras[0]; // 付费类型 3.元宝, 2. 钻石, 1. 金币,
  47. $itemId = $req->paras[1]; // 道具ID
  48. $itemModel = CGameConfig::item_getItem($itemId); # 取道具的常量数据
  49. if ($itemModel == null) { //1.检测是否存在道具的常量数据
  50. $resp = Resp::err(ErrCode::err_const_no);
  51. } else {
  52. $properties = JsonUtil::decode($itemModel->properties);
  53. if (CommUtil::isPropertyExists($properties, "isActive") # 活动物品
  54. && StlUtil::arrayIn($privateState->activeList, $properties->isActive)) {
  55. $resp = Resp::err(Errcode::active_hasgetted); # 已领过
  56. } else {
  57. if ($paytype == 3) {# 元宝
  58. if ($user->yuanbao < $itemModel->cost) { # 元宝不足
  59. CLog::err("[Cheating] m_payByYuanbao:" . $req->uid, __CLASS__);
  60. $resp = Resp::err(ErrCode::notenought_yuanbao);
  61. } else { # 发货
  62. StoreProc::addSeprateItem($itemModel, $req);
  63. $amt = $itemModel->cost;
  64. $source = "商城购买-" . $itemModel->name;
  65. self::mn_SaveUserYuanbao($req, $amt, $source); // 更新玩家游戏币余额
  66. UserProc::updateUserInfo(); // 直接将$user的最新值返回给客户端
  67. $resp = Resp::ok("success");
  68. }
  69. } else { # 钻石、金币
  70. $prize = JsonUtil::decode($itemModel->prize); # 价格
  71. if (property_exists($prize, "c") && $prize->c > 0) {// 钻石购买
  72. $amt = self::_getItemCashPrize($itemModel); // 道具价格(钻石)
  73. if ($amt <= 0) {
  74. $resp = Resp::err(ErrCode::pay_price_err);
  75. } else {
  76. if ($user->cash < $amt) { // 余额不足
  77. $resp = Resp::err(ErrCode::notenough_cash_msg);
  78. } else { // 发货
  79. StoreProc::addSeprateItem($itemModel, $req); // 更新玩家游戏币余额
  80. // $user->cash -= $amt;
  81. self::mn_SaveUserCash($req, $amt, "商城购买-花钻", $itemId);
  82. UserProc::updateUserInfo(); // 直接将$user的最新值返回给客户端
  83. $resp = Resp::ok($user);
  84. }
  85. }
  86. }// 金币购买
  87. else if (CommUtil::isPropertyExists($prize, "g") && $prize->g > 0) {
  88. if ($req->userInfo->game->baseInfo->gold < $prize->g) {
  89. $resp = Resp::err(ErrCode::notenough_gold_msg);
  90. } else {// 发货
  91. StoreProc::addSeprateItem($itemModel, $req); // 更新玩家金币余额
  92. UserModel::Comsume_Gold($user, $prize->g); // 更新玩家数据信息
  93. UserProc::updateUserInfo(); // 直接将$user的最新值返回给客户端
  94. $resp = Resp::ok($user);
  95. }
  96. } else { # 未知的支付类型
  97. $resp = Resp::err(ErrCode::pay_m_type_err);
  98. }
  99. }
  100. }
  101. }
  102. return $resp;
  103. }
  104. /**
  105. * 缓存一个账单号,如果代码执行过程中出现错误,直接取消扣除游戏币
  106. * 注意,若是逻辑不是在一次Request内完成的,那么次订单号需要进行存储
  107. * @var string
  108. */
  109. static $m_billno;
  110. /**
  111. * 【多平台版】刷新充值订单(领取充值结果)
  112. * @param Req $req
  113. */
  114. public static function m_refreshChargeOrders($req) {
  115. if (!$req) {
  116. $resp = Resp::err(ErrCode::err_method_notimplement);
  117. return $resp;
  118. }
  119. $userinfo = $req->userInfo;
  120. if (!$userinfo) {
  121. $resp = Resp::err(ErrCode::user_no_err);
  122. return $resp;
  123. }
  124. $user = $userinfo->game->baseInfo;
  125. if (!$user) {
  126. $resp = Resp::err(ErrCode::user_no_err);
  127. return $resp;
  128. }
  129. // 客户端参数解析
  130. $uid = $req->uid; // userID
  131. $zoneid = $req->zoneid; // 分区Id
  132. if (!$uid || ($zoneid < 1)) {
  133. $resp = Resp::err(ErrCode::paras_err);
  134. return $resp;
  135. }
  136. $mem = $req->mem;
  137. if (!$mem) {
  138. $resp = Resp::err(ErrCode::err_method_notimplement);
  139. return $resp;
  140. }
  141. # 取挂起的订单数据
  142. $orders = $mem->get(MemKey_User::PayOrders($zoneid, $uid));
  143. $amt = 0;
  144. $num = 0;
  145. if ($orders == null) { # 订单为空
  146. $orders = ArrayInit();
  147. }
  148. foreach ($orders as $order) { # 多张订单合并
  149. $amt += $order->price;
  150. $num += $order->amt;
  151. }
  152. $user->yuanbao += $num; #
  153. $user->charge_amt += $amt; # 历史充值记录(单位分)
  154. if ($amt > 0 # 充值金额大于0,且首付标志为false才可以
  155. && isset($req->userInfo->game->privateState->firstPayGift) # 无此字段代表已经领取礼包
  156. && !$req->userInfo->game->privateState->firstPayGift) {
  157. $req->userInfo->game->privateState->firstPayGift = true;
  158. }
  159. $orders = ArrayInit(); # 清空
  160. $mem->set(MemKey_User::PayOrders($zoneid, $uid), $orders); # 清理已经处理过的订单
  161. UserProc::updateUserInfo(); // 更新玩家数据信息
  162. $resp = Resp::ok($user->yuanbao); // 直接将$user的最新值返回给客户端
  163. # todo: 这里可以再加一条订单记录
  164. self::_mPayLog($zoneid, $uid, MLogType::Inquire, 0, #
  165. $num, $user->yuanbao, $user->cash, $user->gift_cash, $user->charge_amt, "刷新订单");
  166. return $resp;
  167. }
  168. /**
  169. * 取物品的价格(钻石)
  170. * @param GoodsItemModel $itemModel
  171. */
  172. private static function _getItemCashPrize($itemModel) {
  173. $c = 0;
  174. $prize = JsonUtil::decode($itemModel->prize);
  175. if (CommUtil::isPropertyExists($prize, "c")) {
  176. $c = $prize->c;
  177. }
  178. return $c;
  179. }
  180. /**
  181. * 【移动端】增加玩家游戏币
  182. * @param UserModel $user
  183. * @param Req $req Description
  184. * @param int $amt 增加数量
  185. * @param string $source (string)备注,增加来源(模块)
  186. * @return int ErrCode
  187. */
  188. public static function m_AddUserYuanbao($req, $amt, $source = "") {
  189. $err = ErrCode::ok;
  190. if ($amt > 0) { // 防御,数量不可能小于0
  191. $user = $req->userInfo->game->baseInfo;
  192. $zoneid = $req->zoneid; // 分区Id
  193. // 更新玩家游戏币余额
  194. $user->yuanbao += $amt;
  195. self::$m_billno = date("Y-m-d H:i:is");
  196. self::_mPayLog($zoneid, $req->uid, MLogType::Present, $err, #
  197. $amt, $user->yuanbao, $user->cash, $user->gift_cash, $user->charge_amt, $source);
  198. }
  199. return $err;
  200. }
  201. // <editor-fold defaultstate="collapsed" desc="==== 移动支付 插入日志 ====">
  202. /**
  203. * Sql语句移动支付插入一条log日志。
  204. * @var string
  205. */
  206. const SQL_M_LOG = "INSERT INTO `tab_mpaylog_%s` (zoneid,type,result,amt,balance,cash,giftedcash,chargedcash,source,oid,itemid) VALUES (%d,%d,%d,%d,%d,%d,%d,%d,'%s','%s','%s')";
  207. /**
  208. * 移动支付插入一条记录
  209. * @param int $zoneid
  210. * @param string $oid
  211. * @param int $type
  212. * @param int $amt
  213. * @param int $balance
  214. * @param int $cash 钻石
  215. * @param int $giftedcash
  216. * @param int $chargedcash
  217. * @param int $source
  218. */
  219. public static function _mPayLog($zoneid, $oid, $type, $result, $amt, $balance, $cash, $giftedcash, $chargedcash, $source = "srcUnKnown", $itemid = "") {
  220. // $month = date("Ym");
  221. // $sql = sprintf(self::SQL_M_LOG, $month, $zoneid, $type, $result, $amt, $balance, $cash, $giftedcash, $chargedcash, $source, $oid, $itemid);
  222. // $paydb = CPayInit();
  223. // $paydb->query($sql);
  224. // $paydb->close();
  225. }
  226. // </editor-fold>
  227. // <editor-fold defaultstate="collapsed" desc="WEB支付日志">
  228. // 在自己的模块里面呆着吧
  229. // </editor-fold>
  230. // <editor-fold defaultstate="collapsed" desc="yyb支付日志">
  231. // </editor-fold>
  232. }