mem; $v3 = CV3Init(); $private = $req->userInfo->game->privateState; //客户端参数解析 $openid = $req->uid; $zoneid = $req->zoneid; $openkey = $req->paras[0]; $pf = $req->paras[1]; $pfkey = $req->paras[2]; $itemPriceYuan = $req->paras[3]; //ID=Q点价格=元宝价格 $itemPriceDot = $itemPriceYuan * 10; $itemID = $itemPriceDot; $itemPrice = $itemPriceDot; $itemName = $itemPriceDot . '元宝'; $itemDes = $itemName; $ts = now(); $goodsurl = self::_getGoodsImgUrl($itemModel); $v3PayRet = $v3->pay_buy_goods($openid, $openkey, $pf, $pfkey, # $ts, $itemID, $itemPrice, $itemName, $itemDes, $goodsurl, $zoneid - 1); if ($v3PayRet->ret == 1002) { //假如玩家未登录 $resp = Resp::err(ErrCode::user_login_err); } elseif ($v3PayRet->ret != 0) { // $resp = Resp::err($v3PayRet->ret); $resp->result = $v3PayRet; } else { $tokenInfo = self::getTokenInfo($mem, $zoneid, $openid); if ($tokenInfo == null) { $resp = Resp::err(ErrCode::user_no_err); } else { self::insToken($tokenInfo, $v3PayRet->token); self::updateTokenInfo($mem, $zoneid, $openid, $tokenInfo); $resp = Resp::ok($v3PayRet); } } $v3->close(); return $resp; } /** * 客户端确认支付 * @param type $req * @return \ResponseVo */ public static function confirmDelivery($req) { $resp = new Resp(); $v3 = CV3Init(); self::confirmPay($req, $v3); $resp = Resp::ok("succeed!"); $v3->close(); return $resp; } /** * 领取首付礼包 * @param Req $req * @return Resp */ public static function getFirstPayGift($req) { $resp = new Resp(); $map = $req->userInfo->game->map; $privateState = $req->userInfo->game->privateState; // 如果已经领取首付礼包 if (!CommUtil::isPropertyExists($privateState, "firstPayGift")) { $resp = Resp::err(ErrCode::pay_firstpaygetted); } elseif (!$privateState->firstPayGift) { // 如果尚未完成首付 $resp = Resp::err(ErrCode::pay_firstpayno_err); } else { $itemModel = ConstProc::getGoodsItemConst(ITEM_FIRSTPAY); // 检测首付礼包是否存在 if ($itemModel == null) { $resp = Resp::err(ErrCode::const_no_err); } else { unset($privateState->firstPayGift); # .剔除首付标志 StoreProc::addSeprateItem($itemModel, $req); # .发放首付礼包 $result = array(# 把玩家最新的仓库数据发给客户端 'store' => $map->store, ); // 7.回送成功信息 $resp = Resp::ok($result); // 成就触发--获取金币 AchievementProc::dealAchievementState($req, $resp, AchievementProc::Gold); UserProc::updateUserInfo($req); # 更新玩家数据 } } return $resp; } /** * 获取黄钻新手礼包 * @param Req $req * @return type */ public static function getVipNewerGift($req) { $user = $req->userInfo->game->user; $map = $req->userInfo->game->map; $privateState = $req->userInfo->game->privateState; //客户端参数解析 $itemId = ITEM_VIPNEWER; # 新手礼包是个常量 $item = ConstProc::getGoodsItemConst($itemId); $isYellowYear = $user->is_yellow_year_vip; $itemYear = null; if ($isYellowYear) { $itemIdYear = ITEM_YEARVIPNEWER; $itemYear = ConstProc::getGoodsItemConst($itemIdYear); if ($itemYear == null) { $resp = Resp::err(ErrCode::const_no_err); return; } } //1.检测是否存在道具的常量数据 if ($item == null) { $resp = Resp::err(ErrCode::const_no_err); } else {//2.检测是否可以领取黄钻新手礼包 if (!WebPayProc::tryVipNewerGift($user, $privateState)) { $resp = Resp::err(ErrCode::pay_vipnewerno); } else { StoreProc::addSeprateItem($item, $req); if ($itemYear) { StoreProc::addSeprateItem($itemYear, $req); } $result = array( 'store' => $map->store, ); $resp = Resp::ok($result); # 返回值 //成就触发--获取金币 AchievementProc::dealAchievementState($req, $resp, AchievementProc::Gold); UserProc::updateUserInfo($req); # 回写数据 } } return $resp; } /** * 开通包月送礼包 * @param Req $req */ public static function getVipOpenGift($req) { $mem = $req->mem; $v3 = CV3Init(); //客户端参数解析 $openid = $req->uid; $openkey = $req->paras[0]; $pf = $req->paras[1]; $pfkey = $req->paras[2]; $ts = now(); $v3Ret = $v3->pay_gift_get_token($openid, $openkey, $pf, $pfkey, "1", ACT_VIP_OPEN, $ts); if ($v3Ret->ret == 1001) { $resp = Resp::err($v3Ret->ret); $resp->result = $v3Ret->msg; } elseif ($v3Ret->ret == 1099) { $resp = Resp::err(ErrCode::pay_systembusy_err); $resp->result = $v3Ret->msg; } elseif ($v3Ret->ret != 0) { $resp = Resp::err(ErrCode::pay_systembusy_err); $resp->result = $v3Ret; } else { //v3成功返回 $tokenInfo = WebPayProc::getTokenInfo($mem, $req->zoneid, $openid); if ($tokenInfo == null) { $resp = Resp::err(ErrCode::user_no_err); } else { WebPayProc::insToken($tokenInfo, $v3Ret->token); WebPayProc::updateTokenInfo($mem, $req->zoneid, $openid, $tokenInfo); // 开通包月送礼包活动号,腾讯分配 $v3Ret->actid = ACT_VIP_OPEN; // 将actid插入返回值中一块儿发送给客户端 $v3Ret->zoneid = 0; // fusionAPI 需要 $resp = Resp::ok($v3Ret); } } $v3->close(); return $resp; } /** * 领取黄钻每日礼包 * @param Req $req */ public static function getVipDayGift($req) { $mem = $req->mem; $zoneid = $req->zoneid; $v3 = CV3Init(); $user = $req->userInfo->game->user; //客户端参数解析 $openid = $req->uid; $openkey = $req->paras[0]; $pf = $req->paras[1]; $pfkey = $req->paras[2]; $ts = now(); CLog::giftlog("getVipDayGift $zoneid|$openid|$openkey|$pf"); $v3Ret = $v3->pay_gift_get_token($openid, $openkey, $pf, $pfkey, "1", ACT_VIP_DAY, $ts, $zoneid - 1); if ($v3Ret->ret == 1001) { $resp = Resp::err($v3Ret->ret); $resp->result = $v3Ret->msg; } elseif ($v3Ret->ret == 1099) { $resp = Resp::err(ErrCode::pay_systembusy_err); $resp->result = $v3Ret->msg; } elseif ($v3Ret->ret != 0) { $resp = Resp::err(ErrCode::pay_systembusy_err); $resp->result = $v3Ret; } else { //v3成功返回 $tokenInfo = WebPayProc::getTokenInfo($mem, $zoneid, $openid); if ($tokenInfo == null) { $resp = Resp::err(ErrCode::user_no_err); } else { WebPayProc::insToken($tokenInfo, $v3Ret->token); if ($user->is_yellow_vip) { WebPayProc::insToken($tokenInfo, $v3Ret->token . "-year"); } WebPayProc::updateTokenInfo($mem, $zoneid, $openid, $tokenInfo); $v3Ret->actid = ACT_VIP_DAY; //将actid 插入返回值中一块儿发送给客户端 $resp = Resp::ok($v3Ret); } } $v3->close(); return $resp; } // ---------------- -------------------- /** * 领取黄钻升级礼包 * @param type $user */ public static function getVipLvGift($mem, & $user, &$map) { } /** * 获取玩家token校验表 * @param type $mem * @param int $zoneid * @param type $uid * @return type */ public static function getTokenInfo($mem, $zoneid, $uid) { return $mem->get(MemKey_User::TokenInfo($zoneid, $uid)); } /** * 更新玩家token校验表 * @param type $mem * @param int $zoneid * @param type $uid * @param type $tokenInfo */ public static function updateTokenInfo($mem, $zoneid, $uid, $tokenInfo) { $mem->set(MemKey_User::TokenInfo($zoneid, $uid), $tokenInfo); } /** * 新增token * @param type $mem * @param type $oid * @param type $token */ public static function insToken(& $tokenInfo, $token) { $tokenInfo->$token = now(); } /** * 读取token * @param type $mem * @param type $oid * @param type $token * @return null */ public static function getToken($tokenInfo, $token) { if (!CommUtil::isPropertyExists($tokenInfo, $token)) { return null; } else { return $tokenInfo->$token; } } /** * 删除token * @param type $mem * @param type $oid * @param type $token */ public static function delToken(& $tokenInfo, $token) { if (CommUtil::isPropertyExists($tokenInfo, $token)) { unset($tokenInfo->$token); } } /** * 添加付费道具到挂起列表 * @param CMemBase $mem * @param int $zoneid * @param string $uid * @param type $itemId */ public static function addPayStoreItem($mem, $zoneid, $uid, $itemId) { $payStore = $mem->get(MemKey_User::PayOrders($zoneid, $uid)); if ($payStore == null) { $payStore = ArrayInit(); } $payStore[] = $itemId; $mem->set(MemKey_User::PayOrders($zoneid, $uid), $payStore); } /** * 添加营销礼包到挂起列表 * @param CMemBase $mem * @param int $zoneid * @param string $uid * @param type $itemId */ public static function addGiftStoreItem($mem, $zoneid, $uid, $itemId) { $giftStore = $mem->get(MemKey_User::GiftStore($zoneid, $uid)); CLog::pay("WebGift addGiftStoreItem1 giftStore:$giftStore|itemId:$itemId|oid:$uid"); if ($giftStore == null) { $giftStore = ArrayInit(); } $giftStore[] = $itemId; CLog::pay("WebGift addGiftStoreItem1 giftStore:$giftStore|itemId:$itemId|oid:$uid"); $mem->set(MemKey_User::GiftStore($zoneid, $uid), $giftStore); } /** * 刷新挂起列表中的付费道具到仓库 * @param Req $req */ public static function refreshPayStoreItem($req) { $mem = $req->mem; $oid = $req->uid; $privateState = $req->userInfo->game->privateState; $payGodpetItems = ArrayInit(); $payStore = $mem->get(MemKey_User::PayOrders($req->zoneid, $oid)); if ($payStore != null) { foreach ($payStore as $payItemId) { $itemModel = ConstProc::getGoodsItemConst($payItemId); if ($itemModel != null) { $payGodpetItems[] = $payItemId; if (CommUtil::isPropertyExists($privateState, "firstPayGift") // && !$privateState->firstPayGift) { $privateState->firstPayGift = true; } $properties = JsonUtil::decode($itemModel->properties); if (CommUtil::isPropertyExists($properties, "isActive")) { $activeList = $privateState->activeList; $activeId = $properties->isActive; $activeList[] = $activeId; $privateState->activeList = $activeList; } StoreProc::addSeprateItem($itemModel, $req); } } $mem->delete(MemKey_User::PayOrders($req->zoneid, $oid)); } return $payGodpetItems; } /** * 刷新挂起列表中的营销礼包到仓库 * @param Req $req */ public static function refreshGiftStoreItem($req) { $oid = $req->uid; $mem = $req->mem; $giftStore = $mem->get(MemKey_User::GiftStore($req->zoneid, $oid)); CLog::pay("WebGift refreshGiftStoreItem giftStore:$giftStore|oid:$oid"); if ($giftStore != null) { foreach ($giftStore as $giftItemId) { $itemModel = ConstProc::getGoodsItemConst($giftItemId); CLog::pay("WebGift refreshGiftStoreItem2 giftItemId:$giftItemId"); if ($itemModel != null) { StoreProc::addSeprateItem($itemModel, $req); } else { CLog::pay("WebGift refreshGiftStoreItem3 ERR giftItemId:$giftItemId"); } } $mem->delete(MemKey_User::GiftStore($req->zoneid, $oid)); } } /** * 尝试领取黄钻新手礼包 * @param type $user * @param type $privateState * @return boolean */ public static function tryVipNewerGift($user, &$privateState) { //1.检查是否为黄钻 if ($user->is_yellow_vip) { # //2.检查是否含有新手礼包标志 if (CommUtil::isPropertyExists($privateState, "vipNewerGift")) { if ($privateState->vipNewerGift) {# //3.检查是否能够领取 unset($privateState->vipNewerGift); # //4.剔除新手礼包标志 return true; //5.返回成功 } } } return false; } /** * 尝试领取黄钻每日礼包 * @param type $user * @param type $privateState * @return boolean */ public static function tryVipDayGift($user, &$privateState) { if ($user->is_yellow_vip) {//1.检查是否为黄钻 if (CommUtil::isPropertyExists($privateState, "vipDayGift")) {//2.检查黄钻礼包标志是否为真 if ($privateState->vipDayGift) {//3.检查是否能够领取 $privateState->vipDayGift = false; //4.修改黄钻每日礼包标志 return true; //5.返回成功 } } } return false; } /** * 客户端确认支付 * @param type $req * @return \ResponseVo */ public static function confirmPay($req, $v3) { $paydb = CPayInit(); $openid = $req->uid; //客户端参数解析 $billArray = $paydb->fetch_array(sprintf(self::PAY_BILL_SELECT, $openid)); if (count($billArray) > 0) { foreach ($billArray as $billRecord) { $id = $billRecord['id']; $ts = now(); $payitem = $billRecord['payitem']; $token = $billRecord['token']; $billno = $billRecord['billno']; $amt = $billRecord['amt']; if (GAME_ONLINE) { $ret = $v3->pay_confirm_delivery($openid, $openkey, $pf, $ts, // $payitem, $token, $billno, $amt); if ($ret->ret == 0 || $ret->ret == 1069) {// 订单确认的情况 $dbRet = $paydb->query(sprintf(self::PAY_BILL_DELETE, $id)); $sqlConfirm = sprintf(self::PAY_BILL_CONFIRM, $openid, $billno, $amt, $payitem, $token); $dbRet = $paydb->query($sqlConfirm); // 写订单支付日志 $log = $billno . "|" . $ret->msg . "[" . $openid . "]已确认支付!"; $dbRet = WebPayProc::_paylog($paydb, $log); }// 订单丢失的情况 else if ($ret->ret == 1060 || $ret->ret == 1063 || $ret->ret == 1068) { $dbRet = $paydb->query(sprintf(self::PAY_BILL_DELETE, $id)); $sqlLost = sprintf(self::PAY_BILL_LOST, $openid, $billno, $amt, $payitem, $token, $ret->msg); $dbRet = $paydb->query($sqlLost); // 写订单支付日志 $log = $billno . "|" . $ret->msg . "[" . $openid . "]已确认丢失!"; $dbRet = WebPayProc::_paylog($paydb, $log); } } else { $dbRet = $paydb->query(sprintf(self::PAY_BILL_DELETE, $id)); $sqlConfirm = sprintf(self::PAY_BILL_CONFIRM, $openid, $billno, $amt, $payitem, $token); $dbRet = $paydb->query($sqlConfirm); // 写订单支付日志 $log = $billno . "|" . $ret->msg . "[" . $openid . "]已确认支付!"; $dbRet = WebPayProc::_paylog($paydb, $log); } } } $paydb->close(); } /** * 插入日志 * @param CDBUtil $paydb * @param string $log * @return mixed */ static function _paylog($paydb, $log) { return $paydb->query(sprintf(self::PAY_LOG_INSERT, $log)); } /** * 获取指定道具的图片Url * @param GoodsItemModel $item * @return String 返回字符串 */ private static function _getGoodsImgUrl($item) { return CDN_HOST . "res/yuanbao3.png"; } }