WebPayProc.php 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513
  1. <?php
  2. namespace loyalsoft;
  3. /**
  4. * Qzone页游支付处理代码
  5. */
  6. class WebPayProc {
  7. const PAY_BILL_SELECT = "SELECT * FROM `tab_billrecord` where `openid`='%s' and `state`='0' order by id;"; // 筛选尚未确认支付的订单
  8. const PAY_BILL_DELETE = "DELETE FROM `tab_billrecord` where id = '%d';"; // 删除未确认的支付订单
  9. const PAY_BILL_CONFIRM = "INSERT INTO `tab_billconfirm` (`openid`,`billno`,`amt`,`payitem`,`token`,`state`,`msg`) VALUES ('%s','%s','%d','%s','%s','1','OK');"; // 变更订单确认支付状态字
  10. const PAY_BILL_LOST = "INSERT INTO `tab_billconfirm` (`openid`,`billno`,`amt`,`payitem`,`token`,`state`,`msg`) VALUES ('%s','%s','%d','%s','%s','-1','%s');"; // 变更订单支付丢失状态字
  11. const PAY_LOG_INSERT = "INSERT INTO `tab_paylog` (`msg`) VALUES ('%s');"; // 新增支付日志
  12. /**
  13. * 【PC端】购买付费道具
  14. * @param Req $req
  15. * @return type
  16. */
  17. public static function buyGoods($req) {
  18. $resp = new Resp();
  19. $mem = $req->mem;
  20. $v3 = CV3Init();
  21. $private = $req->userInfo->game->privateState;
  22. //客户端参数解析
  23. $openid = $req->uid;
  24. $zoneid = $req->zoneid;
  25. $openkey = $req->paras[0];
  26. $pf = $req->paras[1];
  27. $pfkey = $req->paras[2];
  28. $itemPriceYuan = $req->paras[3];
  29. //ID=Q点价格=元宝价格
  30. $itemPriceDot = $itemPriceYuan * 10;
  31. $itemID = $itemPriceDot;
  32. $itemPrice = $itemPriceDot;
  33. $itemName = $itemPriceDot . '元宝';
  34. $itemDes = $itemName;
  35. $ts = now();
  36. $goodsurl = self::_getGoodsImgUrl($itemModel);
  37. $v3PayRet = $v3->pay_buy_goods($openid, $openkey, $pf, $pfkey, #
  38. $ts, $itemID, $itemPrice, $itemName, $itemDes, $goodsurl, $zoneid - 1);
  39. if ($v3PayRet->ret == 1002) { //假如玩家未登录
  40. $resp = Resp::err(ErrCode::user_login_err);
  41. } elseif ($v3PayRet->ret != 0) { //
  42. $resp = Resp::err($v3PayRet->ret);
  43. $resp->result = $v3PayRet;
  44. } else {
  45. $tokenInfo = self::getTokenInfo($mem, $zoneid, $openid);
  46. if ($tokenInfo == null) {
  47. $resp = Resp::err(ErrCode::user_no_err);
  48. } else {
  49. self::insToken($tokenInfo, $v3PayRet->token);
  50. self::updateTokenInfo($mem, $zoneid, $openid, $tokenInfo);
  51. $resp = Resp::ok($v3PayRet);
  52. }
  53. }
  54. $v3->close();
  55. return $resp;
  56. }
  57. /**
  58. * 客户端确认支付
  59. * @param type $req
  60. * @return \ResponseVo
  61. */
  62. public static function confirmDelivery($req) {
  63. $resp = new Resp();
  64. $v3 = CV3Init();
  65. self::confirmPay($req, $v3);
  66. $resp = Resp::ok("succeed!");
  67. $v3->close();
  68. return $resp;
  69. }
  70. /**
  71. * 领取首付礼包
  72. * @param Req $req
  73. * @return Resp
  74. */
  75. public static function getFirstPayGift($req) {
  76. $resp = new Resp();
  77. $map = $req->userInfo->game->map;
  78. $privateState = $req->userInfo->game->privateState;
  79. // 如果已经领取首付礼包
  80. if (!CommUtil::isPropertyExists($privateState, "firstPayGift")) {
  81. $resp = Resp::err(ErrCode::pay_firstpaygetted);
  82. } elseif (!$privateState->firstPayGift) { // 如果尚未完成首付
  83. $resp = Resp::err(ErrCode::pay_firstpayno_err);
  84. } else {
  85. $itemModel = ConstProc::getGoodsItemConst(ITEM_FIRSTPAY);
  86. // 检测首付礼包是否存在
  87. if ($itemModel == null) {
  88. $resp = Resp::err(ErrCode::err_const_no);
  89. } else {
  90. unset($privateState->firstPayGift); # .剔除首付标志
  91. StoreProc::addSeprateItem($itemModel, $req); # .发放首付礼包
  92. $result = array(# 把玩家最新的仓库数据发给客户端
  93. 'store' => $map->store,
  94. );
  95. // 7.回送成功信息
  96. $resp = Resp::ok($result);
  97. // 成就触发--获取金币
  98. AchievementProc::dealAchievementState($req, $resp, AchievementProc::Gold);
  99. UserProc::updateUserInfo($req); # 更新玩家数据
  100. }
  101. }
  102. return $resp;
  103. }
  104. /**
  105. * 获取黄钻新手礼包
  106. * @param Req $req
  107. * @return type
  108. */
  109. public static function getVipNewerGift($req) {
  110. $user = $req->userInfo->game->user;
  111. $map = $req->userInfo->game->map;
  112. $privateState = $req->userInfo->game->privateState;
  113. //客户端参数解析
  114. $itemId = ITEM_VIPNEWER; # 新手礼包是个常量
  115. $item = ConstProc::getGoodsItemConst($itemId);
  116. $isYellowYear = $user->is_yellow_year_vip;
  117. $itemYear = null;
  118. if ($isYellowYear) {
  119. $itemIdYear = ITEM_YEARVIPNEWER;
  120. $itemYear = ConstProc::getGoodsItemConst($itemIdYear);
  121. if ($itemYear == null) {
  122. $resp = Resp::err(ErrCode::err_const_no);
  123. return;
  124. }
  125. }
  126. //1.检测是否存在道具的常量数据
  127. if ($item == null) {
  128. $resp = Resp::err(ErrCode::err_const_no);
  129. } else {//2.检测是否可以领取黄钻新手礼包
  130. if (!WebPayProc::tryVipNewerGift($user, $privateState)) {
  131. $resp = Resp::err(ErrCode::pay_vipnewerno);
  132. } else {
  133. StoreProc::addSeprateItem($item, $req);
  134. if ($itemYear) {
  135. StoreProc::addSeprateItem($itemYear, $req);
  136. }
  137. $result = array(
  138. 'store' => $map->store,
  139. );
  140. $resp = Resp::ok($result); # 返回值
  141. //成就触发--获取金币
  142. AchievementProc::dealAchievementState($req, $resp, AchievementProc::Gold);
  143. UserProc::updateUserInfo($req); # 回写数据
  144. }
  145. }
  146. return $resp;
  147. }
  148. /**
  149. * 开通包月送礼包
  150. * @param Req $req
  151. */
  152. public static function getVipOpenGift($req) {
  153. $mem = $req->mem;
  154. $v3 = CV3Init();
  155. //客户端参数解析
  156. $openid = $req->uid;
  157. $openkey = $req->paras[0];
  158. $pf = $req->paras[1];
  159. $pfkey = $req->paras[2];
  160. $ts = now();
  161. $v3Ret = $v3->pay_gift_get_token($openid, $openkey, $pf, $pfkey, "1", ACT_VIP_OPEN, $ts);
  162. if ($v3Ret->ret == 1001) {
  163. $resp = Resp::err($v3Ret->ret);
  164. $resp->result = $v3Ret->msg;
  165. } elseif ($v3Ret->ret == 1099) {
  166. $resp = Resp::err(ErrCode::pay_systembusy_err);
  167. $resp->result = $v3Ret->msg;
  168. } elseif ($v3Ret->ret != 0) {
  169. $resp = Resp::err(ErrCode::pay_systembusy_err);
  170. $resp->result = $v3Ret;
  171. } else { //v3成功返回
  172. $tokenInfo = WebPayProc::getTokenInfo($mem, $req->zoneid, $openid);
  173. if ($tokenInfo == null) {
  174. $resp = Resp::err(ErrCode::user_no_err);
  175. } else {
  176. WebPayProc::insToken($tokenInfo, $v3Ret->token);
  177. WebPayProc::updateTokenInfo($mem, $req->zoneid, $openid, $tokenInfo);
  178. // 开通包月送礼包活动号,腾讯分配
  179. $v3Ret->actid = ACT_VIP_OPEN; // 将actid插入返回值中一块儿发送给客户端
  180. $v3Ret->zoneid = 0; // fusionAPI 需要
  181. $resp = Resp::ok($v3Ret);
  182. }
  183. }
  184. $v3->close();
  185. return $resp;
  186. }
  187. /**
  188. * 领取黄钻每日礼包
  189. * @param Req $req
  190. */
  191. public static function getVipDayGift($req) {
  192. $mem = $req->mem;
  193. $zoneid = $req->zoneid;
  194. $v3 = CV3Init();
  195. $user = $req->userInfo->game->user;
  196. //客户端参数解析
  197. $openid = $req->uid;
  198. $openkey = $req->paras[0];
  199. $pf = $req->paras[1];
  200. $pfkey = $req->paras[2];
  201. $ts = now();
  202. CLog::giftlog("getVipDayGift $zoneid|$openid|$openkey|$pf");
  203. $v3Ret = $v3->pay_gift_get_token($openid, $openkey, $pf, $pfkey, "1", ACT_VIP_DAY, $ts, $zoneid - 1);
  204. if ($v3Ret->ret == 1001) {
  205. $resp = Resp::err($v3Ret->ret);
  206. $resp->result = $v3Ret->msg;
  207. } elseif ($v3Ret->ret == 1099) {
  208. $resp = Resp::err(ErrCode::pay_systembusy_err);
  209. $resp->result = $v3Ret->msg;
  210. } elseif ($v3Ret->ret != 0) {
  211. $resp = Resp::err(ErrCode::pay_systembusy_err);
  212. $resp->result = $v3Ret;
  213. } else { //v3成功返回
  214. $tokenInfo = WebPayProc::getTokenInfo($mem, $zoneid, $openid);
  215. if ($tokenInfo == null) {
  216. $resp = Resp::err(ErrCode::user_no_err);
  217. } else {
  218. WebPayProc::insToken($tokenInfo, $v3Ret->token);
  219. if ($user->is_yellow_vip) {
  220. WebPayProc::insToken($tokenInfo, $v3Ret->token . "-year");
  221. }
  222. WebPayProc::updateTokenInfo($mem, $zoneid, $openid, $tokenInfo);
  223. $v3Ret->actid = ACT_VIP_DAY; //将actid 插入返回值中一块儿发送给客户端
  224. $resp = Resp::ok($v3Ret);
  225. }
  226. }
  227. $v3->close();
  228. return $resp;
  229. }
  230. // ---------------- --------------------
  231. /**
  232. * 领取黄钻升级礼包
  233. * @param type $user
  234. */
  235. public static function getVipLvGift($mem, & $user, &$map) {
  236. }
  237. /**
  238. * 获取玩家token校验表
  239. * @param type $mem
  240. * @param int $zoneid
  241. * @param type $uid
  242. * @return type
  243. */
  244. public static function getTokenInfo($mem, $zoneid, $uid) {
  245. return $mem->get(MemKey_User::TokenInfo($zoneid, $uid));
  246. }
  247. /**
  248. * 更新玩家token校验表
  249. * @param type $mem
  250. * @param int $zoneid
  251. * @param type $uid
  252. * @param type $tokenInfo
  253. */
  254. public static function updateTokenInfo($mem, $zoneid, $uid, $tokenInfo) {
  255. $mem->set(MemKey_User::TokenInfo($zoneid, $uid), $tokenInfo);
  256. }
  257. /**
  258. * 新增token
  259. * @param type $mem
  260. * @param type $oid
  261. * @param type $token
  262. */
  263. public static function insToken(& $tokenInfo, $token) {
  264. $tokenInfo->$token = now();
  265. }
  266. /**
  267. * 读取token
  268. * @param type $mem
  269. * @param type $oid
  270. * @param type $token
  271. * @return null
  272. */
  273. public static function getToken($tokenInfo, $token) {
  274. if (!CommUtil::isPropertyExists($tokenInfo, $token)) {
  275. return null;
  276. } else {
  277. return $tokenInfo->$token;
  278. }
  279. }
  280. /**
  281. * 删除token
  282. * @param type $mem
  283. * @param type $oid
  284. * @param type $token
  285. */
  286. public static function delToken(& $tokenInfo, $token) {
  287. if (CommUtil::isPropertyExists($tokenInfo, $token)) {
  288. unset($tokenInfo->$token);
  289. }
  290. }
  291. /**
  292. * 添加付费道具到挂起列表
  293. * @param CMemBase $mem
  294. * @param int $zoneid
  295. * @param string $uid
  296. * @param type $itemId
  297. */
  298. public static function addPayStoreItem($mem, $zoneid, $uid, $itemId) {
  299. $payStore = $mem->get(MemKey_User::PayOrders($zoneid, $uid));
  300. if ($payStore == null) {
  301. $payStore = ArrayInit();
  302. }
  303. $payStore[] = $itemId;
  304. $mem->set(MemKey_User::PayOrders($zoneid, $uid), $payStore);
  305. }
  306. /**
  307. * 添加营销礼包到挂起列表
  308. * @param CMemBase $mem
  309. * @param int $zoneid
  310. * @param string $uid
  311. * @param type $itemId
  312. */
  313. public static function addGiftStoreItem($mem, $zoneid, $uid, $itemId) {
  314. $giftStore = $mem->get(MemKey_User::GiftStore($zoneid, $uid));
  315. CLog::pay("WebGift addGiftStoreItem1 giftStore:$giftStore|itemId:$itemId|oid:$uid");
  316. if ($giftStore == null) {
  317. $giftStore = ArrayInit();
  318. }
  319. $giftStore[] = $itemId;
  320. CLog::pay("WebGift addGiftStoreItem1 giftStore:$giftStore|itemId:$itemId|oid:$uid");
  321. $mem->set(MemKey_User::GiftStore($zoneid, $uid), $giftStore);
  322. }
  323. /**
  324. * 刷新挂起列表中的付费道具到仓库
  325. * @param Req $req
  326. */
  327. public static function refreshPayStoreItem($req) {
  328. $mem = $req->mem;
  329. $oid = $req->uid;
  330. $privateState = $req->userInfo->game->privateState;
  331. $payGodpetItems = ArrayInit();
  332. $payStore = $mem->get(MemKey_User::PayOrders($req->zoneid, $oid));
  333. if ($payStore != null) {
  334. foreach ($payStore as $payItemId) {
  335. $itemModel = ConstProc::getGoodsItemConst($payItemId);
  336. if ($itemModel != null) {
  337. $payGodpetItems[] = $payItemId;
  338. if (CommUtil::isPropertyExists($privateState, "firstPayGift") //
  339. && !$privateState->firstPayGift) {
  340. $privateState->firstPayGift = true;
  341. }
  342. $properties = JsonUtil::decode($itemModel->properties);
  343. if (CommUtil::isPropertyExists($properties, "isActive")) {
  344. $activeList = $privateState->activeList;
  345. $activeId = $properties->isActive;
  346. $activeList[] = $activeId;
  347. $privateState->activeList = $activeList;
  348. }
  349. StoreProc::addSeprateItem($itemModel, $req);
  350. }
  351. }
  352. $mem->delete(MemKey_User::PayOrders($req->zoneid, $oid));
  353. }
  354. return $payGodpetItems;
  355. }
  356. /**
  357. * 刷新挂起列表中的营销礼包到仓库
  358. * @param Req $req
  359. */
  360. public static function refreshGiftStoreItem($req) {
  361. $oid = $req->uid;
  362. $mem = $req->mem;
  363. $giftStore = $mem->get(MemKey_User::GiftStore($req->zoneid, $oid));
  364. CLog::pay("WebGift refreshGiftStoreItem giftStore:$giftStore|oid:$oid");
  365. if ($giftStore != null) {
  366. foreach ($giftStore as $giftItemId) {
  367. $itemModel = ConstProc::getGoodsItemConst($giftItemId);
  368. CLog::pay("WebGift refreshGiftStoreItem2 giftItemId:$giftItemId");
  369. if ($itemModel != null) {
  370. StoreProc::addSeprateItem($itemModel, $req);
  371. } else {
  372. CLog::pay("WebGift refreshGiftStoreItem3 ERR giftItemId:$giftItemId");
  373. }
  374. }
  375. $mem->delete(MemKey_User::GiftStore($req->zoneid, $oid));
  376. }
  377. }
  378. /**
  379. * 尝试领取黄钻新手礼包
  380. * @param type $user
  381. * @param type $privateState
  382. * @return boolean
  383. */
  384. public static function tryVipNewerGift($user, &$privateState) {
  385. //1.检查是否为黄钻
  386. if ($user->is_yellow_vip) {
  387. # //2.检查是否含有新手礼包标志
  388. if (CommUtil::isPropertyExists($privateState, "vipNewerGift")) {
  389. if ($privateState->vipNewerGift) {# //3.检查是否能够领取
  390. unset($privateState->vipNewerGift); # //4.剔除新手礼包标志
  391. return true; //5.返回成功
  392. }
  393. }
  394. }
  395. return false;
  396. }
  397. /**
  398. * 尝试领取黄钻每日礼包
  399. * @param type $user
  400. * @param type $privateState
  401. * @return boolean
  402. */
  403. public static function tryVipDayGift($user, &$privateState) {
  404. if ($user->is_yellow_vip) {//1.检查是否为黄钻
  405. if (CommUtil::isPropertyExists($privateState, "vipDayGift")) {//2.检查黄钻礼包标志是否为真
  406. if ($privateState->vipDayGift) {//3.检查是否能够领取
  407. $privateState->vipDayGift = false; //4.修改黄钻每日礼包标志
  408. return true; //5.返回成功
  409. }
  410. }
  411. }
  412. return false;
  413. }
  414. /**
  415. * 客户端确认支付
  416. * @param type $req
  417. * @return \ResponseVo
  418. */
  419. public static function confirmPay($req, $v3) {
  420. $paydb = CPayInit();
  421. $openid = $req->uid; //客户端参数解析
  422. $billArray = $paydb->fetch_array(sprintf(self::PAY_BILL_SELECT, $openid));
  423. if (count($billArray) > 0) {
  424. foreach ($billArray as $billRecord) {
  425. $id = $billRecord['id'];
  426. $ts = now();
  427. $payitem = $billRecord['payitem'];
  428. $token = $billRecord['token'];
  429. $billno = $billRecord['billno'];
  430. $amt = $billRecord['amt'];
  431. if (GAME_ONLINE) {
  432. $ret = $v3->pay_confirm_delivery($openid, $openkey, $pf, $ts, //
  433. $payitem, $token, $billno, $amt);
  434. if ($ret->ret == 0 || $ret->ret == 1069) {// 订单确认的情况
  435. $dbRet = $paydb->query(sprintf(self::PAY_BILL_DELETE, $id));
  436. $sqlConfirm = sprintf(self::PAY_BILL_CONFIRM, $openid, $billno, $amt, $payitem, $token);
  437. $dbRet = $paydb->query($sqlConfirm); // 写订单支付日志
  438. $log = $billno . "|" . $ret->msg . "[" . $openid . "]已确认支付!";
  439. $dbRet = WebPayProc::_paylog($paydb, $log);
  440. }// 订单丢失的情况
  441. else if ($ret->ret == 1060 || $ret->ret == 1063 || $ret->ret == 1068) {
  442. $dbRet = $paydb->query(sprintf(self::PAY_BILL_DELETE, $id));
  443. $sqlLost = sprintf(self::PAY_BILL_LOST, $openid, $billno, $amt, $payitem, $token, $ret->msg);
  444. $dbRet = $paydb->query($sqlLost); // 写订单支付日志
  445. $log = $billno . "|" . $ret->msg . "[" . $openid . "]已确认丢失!";
  446. $dbRet = WebPayProc::_paylog($paydb, $log);
  447. }
  448. } else {
  449. $dbRet = $paydb->query(sprintf(self::PAY_BILL_DELETE, $id));
  450. $sqlConfirm = sprintf(self::PAY_BILL_CONFIRM, $openid, $billno, $amt, $payitem, $token);
  451. $dbRet = $paydb->query($sqlConfirm); // 写订单支付日志
  452. $log = $billno . "|" . $ret->msg . "[" . $openid . "]已确认支付!";
  453. $dbRet = WebPayProc::_paylog($paydb, $log);
  454. }
  455. }
  456. }
  457. $paydb->close();
  458. }
  459. /**
  460. * 插入日志
  461. * @param CDBUtil $paydb
  462. * @param string $log
  463. * @return mixed
  464. */
  465. static function _paylog($paydb, $log) {
  466. return $paydb->query(sprintf(self::PAY_LOG_INSERT, $log));
  467. }
  468. /**
  469. * 获取指定道具的图片Url
  470. * @param GoodsItemModel $item
  471. * @return String 返回字符串
  472. */
  473. private static function _getGoodsImgUrl($item) {
  474. return CDN_HOST . "res/yuanbao3.png";
  475. }
  476. }