YYBPay.php 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556
  1. <?php
  2. namespace loyalsoft;
  3. /**
  4. * Description of YYBPay
  5. * @version
  6. * 1.0.0 Created at 2016-4-20. by --gwang
  7. * @author gwang (mail@wanggangzero.cn)
  8. * @copyright © 2016-4-20, SJZ LoyalSoft Corporation & gwang. All rights reserved.
  9. */
  10. class YYBPay {
  11. //put your code here
  12. }
  13. /**
  14. * 移动支付
  15. * @history
  16. * 1. m_pay m_AddUserCash ... 以 m_ 打头的函数是第一版, 完全按照应用宝官方要求托管游戏币的模式开发的. * 2015年4月23日
  17. * 2. mn_pay mn_AddUserCash ... 以 mn_ 打头的函数是第二版, 修改为伪托管模式,除了充值的时候跟腾讯通讯,其余时间自己管理游戏币:钻石. * 2015年7月23日
  18. * 3. 第三版: 独立的游戏币<元宝>, 面向多渠道的充值模式, 拉起充值成功后, 给玩家发放元宝. 游戏内部消费元宝,钻石和金币.
  19. * 可以用元宝购买金币和钻石.这一版在上面的PayProc中 * 2015年9月23日
  20. *
  21. */
  22. class MobilePayProc {
  23. /**
  24. * Sql语句移动支付插入一条log日志。
  25. * @var string
  26. */
  27. 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')";
  28. /**
  29. * 【移动端】查询账户游戏币余额(v3)
  30. * @param Req $req
  31. * @param string $source 来源
  32. */
  33. public static function v3_m_get_Balance($req, $source = "") {
  34. if ($req->userInfo->isTest) {
  35. return Resp::myRetResponse($req, $req->userInfo->game->user);
  36. }
  37. $resp = new Resp();
  38. $sdkUser = $req->userInfo->sdkUserKey;
  39. $user = $req->userInfo->game->user;
  40. // 客户端参数解析
  41. $openid = $req->uid; // openid
  42. $zoneid = $req->zoneid; // 分区Id
  43. $openkey = $sdkUser->access_token; // openkey|accesstoken
  44. $pf = $sdkUser->pf; // pf
  45. $pfkey = $sdkUser->pf_key; // pfkey
  46. $paytoken = $sdkUser->pay_token; // 手Q客户端获取,微信传空
  47. $v3 = CV3Init();
  48. $appid = V3_APPID; # 支付模块,微信和手Q统一使用手Q的appid
  49. $ts = now();
  50. $v3PayRet = $v3->m_get_balance($sdkUser->platform, $openid, $openkey, $pf, $paytoken, $appid, $pfkey, $ts, $zoneid);
  51. $v3->close();
  52. $amt = 0;
  53. if ($v3PayRet->ret != 0) { //v3其他错误
  54. $resp = Resp::err($v3PayRet->ret);
  55. $resp->result = $v3PayRet;
  56. } else {
  57. $amt = $v3PayRet->save_amt - $user->charge_amt; # 本次充值金额
  58. $user->cash = $v3PayRet->balance;
  59. $user->charge_amt = $v3PayRet->save_amt; # 历史
  60. $user->gift_cash = $v3PayRet->gen_balance; // 赠送的宝石数量
  61. if ($amt > 0 # 充值金额大于0,且首付标志为false才可以 /* 其实腾讯有返 isfirstpay字段 */
  62. && isset($req->userInfo->game->privateState->firstPayGift) # 无此字段代表已经领取礼包
  63. && !$req->userInfo->game->privateState->firstPayGift) {
  64. $req->userInfo->game->privateState->firstPayGift = true;
  65. }
  66. // self::m_FixUserCash($req); # 修复(特定)用户钻石数据(端午节系统邮件失误)
  67. UserProc::updateUserInfo($req); // 更新玩家数据信息
  68. $resp = Resp::myRetResponse($req, $user); // 直接将$user的最新值返回给客户端
  69. }
  70. self::_mPayLog($zoneid, $openid, MLogType::Inquire, $v3PayRet->ret, #
  71. $amt, $user->yuanbao, $user->cash, $user->gift_cash, $user->charge_amt, $source);
  72. return $resp;
  73. }
  74. /**
  75. * 【移动端】扣除游戏币购买道具(V3)
  76. * @param Req $req
  77. */
  78. public static function v3_m_pay($req) {
  79. $resp = new Resp();
  80. $user = $req->userInfo->game->user; # user引用
  81. // 客户端参数解析
  82. $openid = $req->uid; // openid
  83. $zoneid = $req->zoneid; // 分区id
  84. $openkey = $req->paras[0]; // openkey|accesstoken
  85. $pf = $req->paras[1]; // pf
  86. $pfkey = $req->paras[2]; // pfkey
  87. $paytoken = $req->paras[3]; // 手Q客户端获取 微信传空
  88. $itemId = $req->paras[4]; // 道具ID
  89. $v3 = CV3Init();
  90. $appid = V3_APPID; # 支付模块,微信和手Q统一使用手Q的appid
  91. $ts = now();
  92. $itemModel = ConstProc::getGoodsItemConst($itemId); // 取道具的常量数据
  93. if ($itemModel == null) { //1.检测是否存在道具的常量数据
  94. $resp = Resp::myErrResponse($req, ErrCode::err_const_no);
  95. } else {
  96. $prize = JsonUtil::decode($itemModel->prize); # 价格
  97. if (property_exists($prize, "c") && $prize->c > 0) {// 钻石购买
  98. $amt = self::_getItemCashPrize($itemModel); // 道具价格(钻石)
  99. $remark = $itemModel->name;
  100. if ($amt <= 0) {
  101. $resp = Resp::myErrResponse($req, ErrCode::pay_vipnewerno);
  102. } else {
  103. if ($req->userInfo->isTest) { # 测试用,直接模拟一个支付返回值
  104. $v3PayRet = json_decode(json_encode(array(
  105. 'ret' => 0,
  106. 'balance' => $user->cash -= $amt
  107. )));
  108. } else {
  109. $v3PayRet = $v3->m_pay($req->userInfo->sdkUserKey->platform, #
  110. $openid, $openkey, $pf, $paytoken, #
  111. $appid, $pfkey, $ts, $zoneid, $amt, $itemId, $remark);
  112. }
  113. $v3->close();
  114. if ($v3PayRet->ret == 1004) { // 余额不足
  115. $resp = Resp::myErrResponse($req, ErrCode::notenough_cash_msg);
  116. } elseif ($v3PayRet->ret != 0) { //v3其他错误
  117. $resp = Resp::myErrResponse($req, $v3PayRet->ret);
  118. $resp->result = $v3PayRet;
  119. } else { // 发货
  120. StoreProc::addSeprateItem($itemModel, $req); // 更新玩家游戏币余额
  121. UserModel::set_Cash($user, $v3PayRet->balance); // 更新玩家数据信息
  122. UserProc::updateUserInfo($req); // 直接将$user的最新值返回给客户端
  123. $resp = Resp::myRetResponse($req, $user);
  124. }
  125. $source = "商城购买-" . $itemModel->name;
  126. self::_mPayLog($req->zoneid, $req->uid, MLogType::Shop, $resp->err, #
  127. $amt, $user->yuanbao, $user->cash, $user->gift_cash, $user->charge_amt, $source, $itemId);
  128. }
  129. }// 金币购买
  130. else if (CommUtil::isPropertyExists($prize, "g") && $prize->g > 0) {
  131. if ($req->userInfo->game->user->gold < $prize->g) {
  132. $resp = Resp::myErrResponse($req, ErrCode::notenough_gold_msg);
  133. } else {// 发货
  134. StoreProc::addSeprateItem($itemModel, $req); // 更新玩家金币余额
  135. UserModel::Comsume_Gold($user, $prize->g); // 更新玩家数据信息
  136. UserProc::updateUserInfo($req); // 直接将$user的最新值返回给客户端
  137. $resp = Resp::myRetResponse($req, $user);
  138. }
  139. }// 除了金币和钻石以外还有荣誉点。
  140. else if (CommUtil::isPropertyExists($prize, "h") && $prize->h > 0) {
  141. if ($user->honour < $prize->h) {
  142. $resp = Resp::myErrResponse($req, ErrCode::notenough_honour);
  143. } else {// 发货
  144. StoreProc::addSeprateItem($itemModel, $req); // 更新玩家荣誉值余额
  145. $user->honour -= $prize->h; // 更新玩家数据信息
  146. UserProc::updateUserInfo($req); // 直接将$user的最新值返回给客户端
  147. $resp = Resp::myRetResponse($req, $user);
  148. }
  149. }
  150. }
  151. return $resp;
  152. }
  153. /**
  154. * 领取首付礼包
  155. * @param Req $req
  156. * @return Resp
  157. */
  158. public static function m_GetFirstPayGift($req) {
  159. $resp = new Resp();
  160. $privateState = $req->userInfo->game->privateState;
  161. # 客户端参数解析
  162. $itemId = glc()->FirstPay_ItemId;
  163. // 如果已经领取首付礼包
  164. if (!CommUtil::isPropertyExists($privateState, "firstPayGift")) {
  165. $resp = Resp::myErrResponse($req, ErrCode::pay_firstpaygetted);
  166. } elseif ($req->userInfo->game->user->charge_amt <= 0) { // 如果尚未完成首付
  167. $resp = Resp::myErrResponse($req, ErrCode::pay_firstpayno_err);
  168. } else {
  169. $itemModel = ConstProc::getGoodsItemConst($itemId); # 取物品常量
  170. if ($itemModel == null) {// 检测首付礼包是否存在
  171. $resp = Resp::myErrResponse($req, ErrCode::err_const_no);
  172. } else {
  173. unset($privateState->firstPayGift); # .剔除首付标志
  174. StoreProc::addSeprateItem($itemModel, $req); # .发放首付礼包
  175. $result = array(# 把玩家最新的仓库数据发给客户端
  176. 'itemid' => $itemId
  177. );
  178. // 7.回送成功信息
  179. $resp = Resp::myRetResponse($req, $result);
  180. // 成就触发--获取金币
  181. AchievementProc::dealAchievementState($req, $resp, AchievementProc::Gold);
  182. UserProc::updateUserInfo($req); # 更新玩家数据
  183. }
  184. }
  185. return $resp;
  186. }
  187. //----------- 以下是辅助方法 -------------
  188. /**
  189. * 【移动端】调用V3函数给玩家账号直接增加(赠送)游戏币(钻石),
  190. * 赠送的游戏币不参与分成结算,若是造成收入损失,自负。
  191. * @param Req $req Description
  192. * @param type $amt 数量
  193. * @param string $source 来源
  194. */
  195. public static function v3_m_AddUserCash($req, $amt, $source = "") {
  196. $err = ErrCode::ok;
  197. if ($req->userInfo->isTest) { // 跳过支付api
  198. $req->userInfo->game->user->cash += $amt;
  199. return $err;
  200. }
  201. if ($amt > 0) {// 防御,若是给出错误数值直接返回
  202. $user = $req->userInfo->game->user;
  203. $sdkUser = $req->userInfo->sdkUserKey;
  204. // 参数准备
  205. $zoneid = $req->zoneid; # 分区Id
  206. $openid = $sdkUser->open_id;
  207. $openkey = $sdkUser->access_token;
  208. $pf = $sdkUser->pf;
  209. $paytoken = $sdkUser->pay_token;
  210. $pfkey = $sdkUser->pf_key;
  211. $ts = now();
  212. $v3 = CV3Init();
  213. $appid = V3_APPID; // 微信和QQ统一使用手Q的appId
  214. $v3PayRet = $v3->m_present($sdkUser->platform, $openid, $openkey, $pf, # 调用后台接口
  215. $paytoken, $appid, $pfkey, #
  216. $ts, $zoneid, PAY_PRESENTCASH_ACTID, PAY_PRESENTCSAH_GIFTID, $amt);
  217. $v3->close();
  218. if ($v3PayRet->ret != ErrCode::ok) { //v3其他错误
  219. $err = $v3PayRet->ret;
  220. } else {
  221. self::$m_billno = $v3PayRet->billno; // 账单号,扣费后其他逻辑失败的话,调用取消扣费接口
  222. // 更新玩家游戏币余额, 老版本的文档中有balance字段,新的没有说明
  223. if (isset($v3PayRet->balance)) {
  224. UserModel::set_Cash($user, $v3PayRet->balance);
  225. } else {
  226. UserModel::set_Cash($user, $user->cash + $amt);
  227. }
  228. # 日志
  229. self::_mPayLog($req->zoneid, $req->uid, MLogType::Present, $err, #
  230. $amt, $user->yuanbao, $user->cash, $user->gift_cash, $user->charge_amt, $source);
  231. }
  232. }
  233. return $err;
  234. }
  235. /**
  236. * 【移动端】扣除玩家游戏币(V3)(Ps.发货逻辑最后执行此步骤)
  237. * @param Req $req Description
  238. * @param int $amt 扣除数量
  239. * @param string $source (string)备注,扣除来源(模块)
  240. * @param string $itemid (option)相关物品id
  241. * @return int ErrCode
  242. */
  243. public static function v3_m_SaveUserCash($req, $amt, $source = "", $itemid = "0") {
  244. if ($req->userInfo->isTest) { # 跳过腾讯api(子豪)
  245. $req->userInfo->game->user->cash -= $amt;
  246. return ErrCode::ok;
  247. }
  248. if ($amt <= 0) { // 防御,数量不可能小于0
  249. return ErrCode::ok;
  250. }
  251. $user = $req->userInfo->game->user;
  252. $sdkUser = $req->userInfo->sdkUserKey;
  253. $v3 = CV3Init();
  254. $appid = V3_APPID; # 支付模块,微信和手Q统一使用手Q的appid
  255. $ts = now();
  256. $zoneid = $req->zoneid; // 分区Id
  257. // 调用腾讯api
  258. $v3PayRet = $v3->m_pay($sdkUser->platform, $sdkUser->open_id, $sdkUser->access_token, $sdkUser->pf, //
  259. $sdkUser->pay_token, $appid, $sdkUser->pf_key, $ts, $zoneid, //
  260. $amt, $itemid, $source);
  261. $v3->close(); // 关闭
  262. $err = ErrCode::ok;
  263. if ($v3PayRet->ret == 1004) { // 余额不足
  264. $err = ErrCode::notenough_cash_msg;
  265. } elseif ($v3PayRet->ret != 0) { //v3其他错误
  266. $err = $v3PayRet->ret;
  267. } else {
  268. self::$m_billno = $v3PayRet->billno; // 账单号,扣费后其他逻辑失败的话,调用取消扣费接口
  269. // 更新玩家游戏币余额, 老版本的文档中有balance字段,新的没有说明
  270. if (property_exists($v3PayRet, "balance")) {
  271. UserModel::set_Cash($user, $v3PayRet->balance);
  272. } else {
  273. UserModel::set_Cash($user, $user->cash - $amt);
  274. }
  275. $err = ErrCode::ok;
  276. }
  277. self::_mPayLog($zoneid, $req->uid, MLogType::Save, $err, #
  278. $amt, $user->yuanbao, $user->cash, $user->gift_cash, $user->charge_amt, $source);
  279. return $err;
  280. }
  281. /**
  282. * 缓存一个账单号,如果代码执行过程中出现错误,直接取消扣除游戏币
  283. * 注意,若是逻辑不是在一次Request内完成的,那么次订单号需要进行存储
  284. * @var string
  285. */
  286. static $m_billno;
  287. /**
  288. * 【移动端】取消扣除玩家游戏币(V3)
  289. * @param Req $req
  290. * @param UserModel $user
  291. * @param CstSDK_UserModel $sdkUser
  292. * @param int $amt
  293. * @return int
  294. */
  295. public static function v3_m_CancelConsumCash($req, $amt) {
  296. if ($req->userInfo->isTest) { // 跳过腾讯api
  297. $user->cash += $amt;
  298. return ErrCode::ok;
  299. }
  300. $user = $req->userInfo->game->user;
  301. $sdkUser = $req->userInfo->sdkUserKey;
  302. $appid = V3_APPID; # 支付模块,微信和手Q统一使用手Q的appid
  303. $ts = now();
  304. $zoneid = $req->zoneid; # 分区Id
  305. $v3 = CV3Init();
  306. $v3PayRet = $v3->m_cancel_pay($sdkUser->platform, $sdkUser->open_id, $sdkUser->access_token, #
  307. $sdkUser->pf, $sdkUser->pay_token, $appid, $sdkUser->pf_key, $ts, //
  308. $zoneid, $amt, self::$m_billno);
  309. $v3->close(); // 关闭
  310. if ($v3PayRet->ret != 0) { //v3其他错误
  311. return $v3PayRet->ret;
  312. } else {
  313. // 更新玩家游戏币余额, 老版本的文档中有balance字段,新的没有说明
  314. if (property_exists($v3PayRet, "balance")) {
  315. UserModel::set_Cash($user, $v3PayRet->balance);
  316. } else {
  317. UserModel::set_Cash($user, $user->cash + $amt);
  318. }
  319. return ErrCode::ok;
  320. }
  321. }
  322. /**
  323. * 取物品的价格(钻石)
  324. * @param GoodsItemModel $itemModel
  325. */
  326. private static function _getItemCashPrize($itemModel) {
  327. $c = 0;
  328. $prize = JsonUtil::decode($itemModel->prize);
  329. if (CommUtil::isPropertyExists($prize, "c")) {
  330. $c = $prize->c;
  331. }
  332. return $c;
  333. }
  334. /**
  335. * 插入一条记录
  336. * @param int $zoneid
  337. * @param string $oid
  338. * @param int $type
  339. * @param int $amt
  340. * @param int $balance
  341. * @param int $cash 钻石
  342. * @param int $giftedcash
  343. * @param int $chargedcash
  344. * @param int $source
  345. */
  346. public static function _mPayLog($zoneid, $oid, $type, $result, $amt, $balance, $cash, $giftedcash, $chargedcash, $source = "srcUnKnown", $itemid = "") {
  347. // var_dump(func_get_args());
  348. // CLogUtil::print_stack_trace();
  349. $month = date("Ym");
  350. $sql = sprintf(self::SQL_M_LOG, $month, $zoneid, $type, $result, $amt, $balance, $cash, $giftedcash, $chargedcash, $source, $oid, $itemid);
  351. $paydb = CPayInit();
  352. $paydb->query($sql);
  353. $paydb->close();
  354. }
  355. // ----------------new pay proc -------------------------
  356. // 腾讯支付修改版,不再让钻石存储在腾讯端
  357. /**
  358. * 【移动端】取消扣除玩家游戏币,无v3调用
  359. * @param Req $req
  360. * @param UserModel $user
  361. * @param CstSDK_UserModel $sdkUser
  362. * @param int $amt
  363. * @return int
  364. */
  365. public static function mn_CancelConsumCash($req, $amt) {
  366. $err = ErrCode::ok;
  367. $user = $req->userInfo->game->user;
  368. $zoneid = $req->zoneid; # 分区Id
  369. if ($amt > 0) { // 更新玩家游戏币余额, 老版本的文档中有balance字段,新的没有说明
  370. UserModel::set_Cash($user, $user->cash + $amt);
  371. # 记录日志
  372. self::_mPayLog($zoneid, $user->oId, MLogType::Present, $err, $amt, $user->yuanbao, #
  373. $user->cash, $user->gift_cash, $user->charge_amt, "<取消订单>" . self::$m_billno);
  374. }
  375. return $err;
  376. }
  377. /**
  378. * 【移动端】扣除玩家游戏币,无V3调用(Ps.发货逻辑最后执行此步骤)
  379. * @param Req $req Description
  380. * @param int $amt 扣除数量
  381. * @param string $source (string)备注,扣除来源(模块)
  382. * @param string $itemid (option)相关物品id
  383. * @return int ErrCode
  384. */
  385. public static function mn_SaveUserCash($req, $amt, $source = "", $itemid = "0") {
  386. $err = ErrCode::ok;
  387. if ($amt > 0) { // 防御,数量不可能小于0
  388. $user = $req->userInfo->game->user;
  389. $zoneid = $req->zoneid; // 分区Id
  390. if ($user->cash < $amt) { // 余额不足
  391. $err = ErrCode::notenough_cash_msg;
  392. } else {// 更新玩家游戏币余额
  393. UserModel::set_Cash($user, $user->cash - $amt);
  394. self::$m_billno = date("Y-m-d H:i:is");
  395. }
  396. self::_mPayLog($zoneid, $req->uid, MLogType::Save, $err, #
  397. $amt, $user->yuanbao, $user->cash, $user->gift_cash, $user->charge_amt, $source);
  398. }
  399. return $err;
  400. }
  401. /**
  402. * 【移动端】给玩家账号直接增加(赠送)游戏币(钻石)(无V3),
  403. * 赠送的游戏币不参与分成结算,若是造成收入损失,自负。
  404. * @param Req $req Description
  405. * @param type $amt 数量
  406. */
  407. public static function mn_AddUserCash($req, $amt, $source = "") {
  408. $err = ErrCode::ok;
  409. if ($amt > 0) {// 防御,若是给出错误数值直接返回
  410. $user = $req->userInfo->game->user;
  411. UserModel::set_Cash($user, $user->cash + $amt);
  412. if ($user->cash < 0) {
  413. # 输出日志-wqq
  414. }
  415. # 记录日志
  416. self::_mPayLog($req->zoneid, $req->uid, MLogType::Present, $err, #
  417. $amt, $user->yuanbao, $user->cash, $user->gift_cash, $user->charge_amt, $source);
  418. }
  419. return ErrCode::ok;
  420. }
  421. // /**
  422. // * 【移动端】扣除游戏币购买道具
  423. // * @param RequestVo $req
  424. // */
  425. // static function mn_pay($req) {
  426. // $resp = new ResponseVo();
  427. // $user = $req->userInfo->user; # user引用
  428. //// 客户端参数解析
  429. // $itemId = $req->paras[4]; // 道具ID
  430. //
  431. // $itemModel = ConstProc::getItemConst($req->mem, $itemId); // 取道具的常量数据
  432. // if ($itemModel == null) { //1.检测是否存在道具的常量数据
  433. // $resp = ResponseVo::myErrResponse($req, ErrCode::err_msg_itemnoconst);
  434. // } else {
  435. // $prize = JsonUtil::decode($itemModel->prize); # 价格
  436. // if (property_exists($prize, "c") && $prize->c > 0) {// 钻石购买
  437. // $amt = self::_getItemCashPrize($itemModel); // 道具价格(钻石)
  438. // if ($amt <= 0) {
  439. // $resp = ResponseVo::myErrResponse($req, ErrCode::err_pay_vipnewerno);
  440. // } else {
  441. // if ($user->cash < $amt) { // 余额不足
  442. // $resp = ResponseVo::myErrResponse($req, ErrCode::err_msg_cashnotenough);
  443. // } else { // 发货
  444. // StoreProc::addSeprateItem($itemModel, $req); // 更新玩家游戏币余额
  445. // UserModel::set_Cash($user, $user->cash - $amt); // 更新玩家数据信息
  446. // UserProc::updateUserInfo($req); // 直接将$user的最新值返回给客户端
  447. // $resp = ResponseVo::myRetResponse($req, $user);
  448. //# 记录日志
  449. // $source = "商城购买-" . $itemModel->name;
  450. // self::_mPayLog($req->zoneid, $req->oid, MLogType::Shop, $resp->err, #
  451. // $amt, $user->yuanbao, $user->cash, $user->gift_cash, $user->charge_amt, $source, $itemId);
  452. // }
  453. // }
  454. // }// 金币购买
  455. // else if (CommUtil::isPropertyExists($prize, "g") && $prize->g > 0) {
  456. // if ($req->userInfo->user->gold < $prize->g) {
  457. // $resp = ResponseVo::myErrResponse($req, ErrCode::err_msg_goldnotenough);
  458. // } else {// 发货
  459. // StoreProc::addSeprateItem($itemModel, $req); // 更新玩家金币余额
  460. // UserModel::Comsume_Gold($user, $prize->g); // 更新玩家数据信息
  461. // UserProc::updateUserInfo($req); // 直接将$user的最新值返回给客户端
  462. // $resp = ResponseVo::myRetResponse($req, $user);
  463. // }
  464. // }// 除了金币和钻石以外还有荣誉点。
  465. // else if (CommUtil::isPropertyExists($prize, "h") && $prize->h > 0) {
  466. // if ($user->honour < $prize->h) {
  467. // $resp = ResponseVo::myErrResponse($req, ErrCode::err_msg_honournotenough);
  468. // } else {// 发货
  469. // StoreProc::addSeprateItem($itemModel, $req); // 更新玩家荣誉值余额
  470. // $user->honour-=$prize->h; // 更新玩家数据信息
  471. // UserProc::updateUserInfo($req); // 直接将$user的最新值返回给客户端
  472. // $resp = ResponseVo::myRetResponse($req, $user);
  473. // }
  474. // }
  475. // }
  476. // return $resp;
  477. // }
  478. //
  479. // /**
  480. // * 【移动端】查询账户游戏币余额
  481. // * @history
  482. // * 2015-7-6 改动思路, 不直接拿api返回值中的balance更新玩家的钻石余额,
  483. // * 采用计算相对值的方法计算距离上次更新,玩家是否有新的充值,
  484. // * $amt>0,则代表有新的充值,将$amt更新到玩家账户.
  485. // * @param RequestVo $req
  486. // * @param string $source 来源
  487. // */
  488. // static function mn_get_Balance($req, $source = "") {
  489. // if ($req->userInfo->isTest) {
  490. // return ResponseVo::myRetResponse($req, $req->userInfo->user);
  491. // }
  492. // $resp = new ResponseVo();
  493. // $sdkUser = $req->userInfo->sdkUserKey;
  494. // $user = $req->userInfo->user;
  495. //// 客户端参数解析
  496. // $openid = $req->oid; // openid
  497. // $zoneid = $req->zoneid; // 分区Id
  498. // $openkey = $sdkUser->access_token; // openkey|accesstoken
  499. // $pf = $sdkUser->pf; // pf
  500. // $pfkey = $sdkUser->pf_key; // pfkey
  501. // $paytoken = $sdkUser->pay_token; // 手Q客户端获取,微信传空
  502. // $v3 = CV3Init();
  503. // $appid = V3_APPID; # 支付模块,微信和手Q统一使用手Q的appid
  504. // $ts = TimeUtil::tsCurrent();
  505. // $v3PayRet = $v3->m_get_balance($sdkUser->platform, $openid, $openkey, $pf, $paytoken, $appid, $pfkey, $ts, $zoneid);
  506. // $v3->close();
  507. // $amt = 0;
  508. // if ($v3PayRet->ret != 0) { //v3其他错误
  509. // $resp = ResponseVo::errResponse($req->oid, $req->msgid, $v3PayRet->ret);
  510. // $resp->result = $v3PayRet;
  511. // } else {
  512. // $amt = $v3PayRet->save_amt - $user->charge_amt; # 本次充值金额 = v3提供的历史充值金额 - 玩家记录的历史充值金额
  513. // if ($amt > 0) {
  514. // $user->cash +=$amt; # $v3PayRet->balance;
  515. // $user->charge_amt = $v3PayRet->save_amt; # 更新历史充值金额
  516. // $user->gift_cash = $v3PayRet->gen_balance; // 赠送的宝石数量
  517. // if (isset($req->userInfo->game->privateState->firstPayGift) # 无此字段代表已经领取礼包
  518. // && !$req->userInfo->game->privateState->firstPayGift) {
  519. // $req->userInfo->game->privateState->firstPayGift = true;
  520. // }
  521. // }
  522. //// self::m_FixUserCash($req); # 修复(特定)用户钻石数据(端午节系统邮件失误)
  523. // UserProc::updateUserInfo($req); // 更新玩家数据信息
  524. // $resp = ResponseVo::myRetResponse($req, $user); // 直接将$user的最新值返回给客户端
  525. // }
  526. // self::_mPayLog($zoneid, $openid, MLogType::Inquire, $v3PayRet->ret, #
  527. // $amt, $user->yuanbao, $user->cash, $user->gift_cash, $user->charge_amt, $source);
  528. // return $resp;
  529. // }
  530. }