, 面向多渠道的充值模式, 拉起充值成功后, 给玩家发放元宝. 游戏内部消费元宝,钻石和金币. // * 可以用元宝购买金币和钻石.这一版在上面的PayProc中 * 2015年9月23日 // * // */ //class MobilePayProc { // // /** // * Sql语句移动支付插入一条log日志。 // * @var string // */ // 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')"; // // /** // * 【移动端】查询账户游戏币余额(v3) // * @param Req $req // * @param string $source 来源 // */ // public static function v3_m_get_Balance($req, $source = "") { // if ($req->userInfo->isTest) { // return Resp::myRetResponse($req, $req->userInfo->game->user); // } // $resp = new Resp(); // $sdkUser = $req->userInfo->sdkUserKey; // $user = $req->userInfo->game->user; //// 客户端参数解析 // $openid = $req->uid; // openid // $zoneid = $req->zoneid; // 分区Id // $openkey = $sdkUser->access_token; // openkey|accesstoken // $pf = $sdkUser->pf; // pf // $pfkey = $sdkUser->pf_key; // pfkey // $paytoken = $sdkUser->pay_token; // 手Q客户端获取,微信传空 // $v3 = CV3Init(); // $appid = V3_APPID; # 支付模块,微信和手Q统一使用手Q的appid // $ts = now(); // $v3PayRet = $v3->m_get_balance($sdkUser->platform, $openid, $openkey, $pf, $paytoken, $appid, $pfkey, $ts, $zoneid); // $v3->close(); // $amt = 0; // if ($v3PayRet->ret != 0) { //v3其他错误 // $resp = Resp::err($v3PayRet->ret); // $resp->result = $v3PayRet; // } else { // $amt = $v3PayRet->save_amt - $user->charge_amt; # 本次充值金额 // $user->cash = $v3PayRet->balance; // $user->charge_amt = $v3PayRet->save_amt; # 历史 // // $user->gift_cash = $v3PayRet->gen_balance; // 赠送的宝石数量 // if ($amt > 0 # 充值金额大于0,且首付标志为false才可以 /* 其实腾讯有返 isfirstpay字段 */ // && isset($req->userInfo->game->privateState->firstPayGift) # 无此字段代表已经领取礼包 // && !$req->userInfo->game->privateState->firstPayGift) { // $req->userInfo->game->privateState->firstPayGift = true; // } //// self::m_FixUserCash($req); # 修复(特定)用户钻石数据(端午节系统邮件失误) // UserProc::updateUserInfo($req); // 更新玩家数据信息 // // $resp = Resp::myRetResponse($req, $user); // 直接将$user的最新值返回给客户端 // } // self::_mPayLog($zoneid, $openid, MLogType::Inquire, $v3PayRet->ret, # // $amt, $user->yuanbao, $user->cash, $user->gift_cash, $user->charge_amt, $source); // return $resp; // } // // /** // * 【移动端】扣除游戏币购买道具(V3) // * @param Req $req // */ // public static function v3_m_pay($req) { // $resp = new Resp(); // $user = $req->userInfo->game->user; # user引用 //// 客户端参数解析 // $openid = $req->uid; // openid // $zoneid = $req->zoneid; // 分区id // $openkey = $req->paras[0]; // openkey|accesstoken // $pf = $req->paras[1]; // pf // $pfkey = $req->paras[2]; // pfkey // $paytoken = $req->paras[3]; // 手Q客户端获取 微信传空 // $itemId = $req->paras[4]; // 道具ID // // $v3 = CV3Init(); // $appid = V3_APPID; # 支付模块,微信和手Q统一使用手Q的appid // $ts = now(); // $itemModel = ConstProc::getGoodsItemConst($itemId); // 取道具的常量数据 // if ($itemModel == null) { //1.检测是否存在道具的常量数据 // $resp = Resp::myErrResponse($req, ErrCode::err_const_no); // } else { // $prize = JsonUtil::decode($itemModel->prize); # 价格 // if (property_exists($prize, "c") && $prize->c > 0) {// 钻石购买 // $amt = self::_getItemCashPrize($itemModel); // 道具价格(钻石) // $remark = $itemModel->name; // if ($amt <= 0) { // $resp = Resp::myErrResponse($req, ErrCode::pay_vipnewerno); // } else { // if ($req->userInfo->isTest) { # 测试用,直接模拟一个支付返回值 // $v3PayRet = json_decode(json_encode(array( // 'ret' => 0, // 'balance' => $user->cash -= $amt // ))); // } else { // $v3PayRet = $v3->m_pay($req->userInfo->sdkUserKey->platform, # // $openid, $openkey, $pf, $paytoken, # // $appid, $pfkey, $ts, $zoneid, $amt, $itemId, $remark); // } // $v3->close(); // if ($v3PayRet->ret == 1004) { // 余额不足 // $resp = Resp::myErrResponse($req, ErrCode::notenough_cash_msg); // } elseif ($v3PayRet->ret != 0) { //v3其他错误 // $resp = Resp::myErrResponse($req, $v3PayRet->ret); // $resp->result = $v3PayRet; // } else { // 发货 // StoreProc::addSeprateItem($itemModel, $req); // 更新玩家游戏币余额 // UserModel::set_Cash($user, $v3PayRet->balance); // 更新玩家数据信息 // UserProc::updateUserInfo($req); // 直接将$user的最新值返回给客户端 // $resp = Resp::myRetResponse($req, $user); // } // $source = "商城购买-" . $itemModel->name; // self::_mPayLog($req->zoneid, $req->uid, MLogType::Shop, $resp->err, # // $amt, $user->yuanbao, $user->cash, $user->gift_cash, $user->charge_amt, $source, $itemId); // } // }// 金币购买 // else if (CommUtil::isPropertyExists($prize, "g") && $prize->g > 0) { // if ($req->userInfo->game->user->gold < $prize->g) { // $resp = Resp::myErrResponse($req, ErrCode::notenough_gold_msg); // } else {// 发货 // StoreProc::addSeprateItem($itemModel, $req); // 更新玩家金币余额 // UserModel::Comsume_Gold($user, $prize->g); // 更新玩家数据信息 // UserProc::updateUserInfo($req); // 直接将$user的最新值返回给客户端 // $resp = Resp::myRetResponse($req, $user); // } // }// 除了金币和钻石以外还有荣誉点。 // else if (CommUtil::isPropertyExists($prize, "h") && $prize->h > 0) { // if ($user->honour < $prize->h) { // $resp = Resp::myErrResponse($req, ErrCode::notenough_honour); // } else {// 发货 // StoreProc::addSeprateItem($itemModel, $req); // 更新玩家荣誉值余额 // $user->honour -= $prize->h; // 更新玩家数据信息 // UserProc::updateUserInfo($req); // 直接将$user的最新值返回给客户端 // $resp = Resp::myRetResponse($req, $user); // } // } // } // return $resp; // } // // /** // * 领取首付礼包 // * @param Req $req // * @return Resp // */ // public static function m_GetFirstPayGift($req) { // $resp = new Resp(); // $privateState = $req->userInfo->game->privateState; //# 客户端参数解析 // $itemId = glc()->FirstPay_ItemId; //// 如果已经领取首付礼包 // if (!CommUtil::isPropertyExists($privateState, "firstPayGift")) { // $resp = Resp::myErrResponse($req, ErrCode::pay_firstpaygetted); // } elseif ($req->userInfo->game->user->charge_amt <= 0) { // 如果尚未完成首付 // $resp = Resp::myErrResponse($req, ErrCode::pay_firstpayno_err); // } else { // $itemModel = ConstProc::getGoodsItemConst($itemId); # 取物品常量 // if ($itemModel == null) {// 检测首付礼包是否存在 // $resp = Resp::myErrResponse($req, ErrCode::err_const_no); // } else { // unset($privateState->firstPayGift); # .剔除首付标志 // StoreProc::addSeprateItem($itemModel, $req); # .发放首付礼包 // $result = array(# 把玩家最新的仓库数据发给客户端 // 'itemid' => $itemId // ); //// 7.回送成功信息 // $resp = Resp::myRetResponse($req, $result); //// 成就触发--获取金币 // AchievementProc::dealAchievementState($req, $resp, AchievementProc::Gold); // UserProc::updateUserInfo($req); # 更新玩家数据 // } // } // return $resp; // } // ////----------- 以下是辅助方法 ------------- // // /** // * 【移动端】调用V3函数给玩家账号直接增加(赠送)游戏币(钻石), // * 赠送的游戏币不参与分成结算,若是造成收入损失,自负。 // * @param Req $req Description // * @param type $amt 数量 // * @param string $source 来源 // */ // public static function v3_m_AddUserCash($req, $amt, $source = "") { // $err = ErrCode::ok; // if ($req->userInfo->isTest) { // 跳过支付api // $req->userInfo->game->user->cash += $amt; // return $err; // } // if ($amt > 0) {// 防御,若是给出错误数值直接返回 // $user = $req->userInfo->game->user; // $sdkUser = $req->userInfo->sdkUserKey; //// 参数准备 // $zoneid = $req->zoneid; # 分区Id // $openid = $sdkUser->open_id; // $openkey = $sdkUser->access_token; // $pf = $sdkUser->pf; // $paytoken = $sdkUser->pay_token; // $pfkey = $sdkUser->pf_key; // // $ts = now(); // $v3 = CV3Init(); // $appid = V3_APPID; // 微信和QQ统一使用手Q的appId // $v3PayRet = $v3->m_present($sdkUser->platform, $openid, $openkey, $pf, # 调用后台接口 // $paytoken, $appid, $pfkey, # // $ts, $zoneid, PAY_PRESENTCASH_ACTID, PAY_PRESENTCSAH_GIFTID, $amt); // $v3->close(); // if ($v3PayRet->ret != ErrCode::ok) { //v3其他错误 // $err = $v3PayRet->ret; // } else { // self::$m_billno = $v3PayRet->billno; // 账单号,扣费后其他逻辑失败的话,调用取消扣费接口 //// 更新玩家游戏币余额, 老版本的文档中有balance字段,新的没有说明 // if (isset($v3PayRet->balance)) { // UserModel::set_Cash($user, $v3PayRet->balance); // } else { // UserModel::set_Cash($user, $user->cash + $amt); // } //# 日志 // self::_mPayLog($req->zoneid, $req->uid, MLogType::Present, $err, # // $amt, $user->yuanbao, $user->cash, $user->gift_cash, $user->charge_amt, $source); // } // } // return $err; // } // // /** // * 【移动端】扣除玩家游戏币(V3)(Ps.发货逻辑最后执行此步骤) // * @param Req $req Description // * @param int $amt 扣除数量 // * @param string $source (string)备注,扣除来源(模块) // * @param string $itemid (option)相关物品id // * @return int ErrCode // */ // public static function v3_m_SaveUserCash($req, $amt, $source = "", $itemid = "0") { // if ($req->userInfo->isTest) { # 跳过腾讯api(子豪) // $req->userInfo->game->user->cash -= $amt; // return ErrCode::ok; // } // if ($amt <= 0) { // 防御,数量不可能小于0 // return ErrCode::ok; // } // // $user = $req->userInfo->game->user; // $sdkUser = $req->userInfo->sdkUserKey; // // $v3 = CV3Init(); // $appid = V3_APPID; # 支付模块,微信和手Q统一使用手Q的appid // $ts = now(); // $zoneid = $req->zoneid; // 分区Id //// 调用腾讯api // $v3PayRet = $v3->m_pay($sdkUser->platform, $sdkUser->open_id, $sdkUser->access_token, $sdkUser->pf, // // $sdkUser->pay_token, $appid, $sdkUser->pf_key, $ts, $zoneid, // // $amt, $itemid, $source); // $v3->close(); // 关闭 // // $err = ErrCode::ok; // if ($v3PayRet->ret == 1004) { // 余额不足 // $err = ErrCode::notenough_cash_msg; // } elseif ($v3PayRet->ret != 0) { //v3其他错误 // $err = $v3PayRet->ret; // } else { // self::$m_billno = $v3PayRet->billno; // 账单号,扣费后其他逻辑失败的话,调用取消扣费接口 //// 更新玩家游戏币余额, 老版本的文档中有balance字段,新的没有说明 // if (property_exists($v3PayRet, "balance")) { // UserModel::set_Cash($user, $v3PayRet->balance); // } else { // UserModel::set_Cash($user, $user->cash - $amt); // } // $err = ErrCode::ok; // } // self::_mPayLog($zoneid, $req->uid, MLogType::Save, $err, # // $amt, $user->yuanbao, $user->cash, $user->gift_cash, $user->charge_amt, $source); // return $err; // } // // /** // * 缓存一个账单号,如果代码执行过程中出现错误,直接取消扣除游戏币 // * 注意,若是逻辑不是在一次Request内完成的,那么次订单号需要进行存储 // * @var string // */ // static $m_billno; // // /** // * 【移动端】取消扣除玩家游戏币(V3) // * @param Req $req // * @param UserModel $user // * @param CstSDK_UserModel $sdkUser // * @param int $amt // * @return int // */ // public static function v3_m_CancelConsumCash($req, $amt) { // if ($req->userInfo->isTest) { // 跳过腾讯api // $user->cash += $amt; // return ErrCode::ok; // } // $user = $req->userInfo->game->user; // $sdkUser = $req->userInfo->sdkUserKey; // $appid = V3_APPID; # 支付模块,微信和手Q统一使用手Q的appid // $ts = now(); // $zoneid = $req->zoneid; # 分区Id // $v3 = CV3Init(); // $v3PayRet = $v3->m_cancel_pay($sdkUser->platform, $sdkUser->open_id, $sdkUser->access_token, # // $sdkUser->pf, $sdkUser->pay_token, $appid, $sdkUser->pf_key, $ts, // // $zoneid, $amt, self::$m_billno); // $v3->close(); // 关闭 // if ($v3PayRet->ret != 0) { //v3其他错误 // return $v3PayRet->ret; // } else { //// 更新玩家游戏币余额, 老版本的文档中有balance字段,新的没有说明 // if (property_exists($v3PayRet, "balance")) { // UserModel::set_Cash($user, $v3PayRet->balance); // } else { // UserModel::set_Cash($user, $user->cash + $amt); // } // return ErrCode::ok; // } // } // // /** // * 取物品的价格(钻石) // * @param GoodsItemModel $itemModel // */ // private static function _getItemCashPrize($itemModel) { // $c = 0; // $prize = JsonUtil::decode($itemModel->prize); // if (CommUtil::isPropertyExists($prize, "c")) { // $c = $prize->c; // } // return $c; // } // // /** // * 插入一条记录 // * @param int $zoneid // * @param string $oid // * @param int $type // * @param int $amt // * @param int $balance // * @param int $cash 钻石 // * @param int $giftedcash // * @param int $chargedcash // * @param int $source // */ // public static function _mPayLog($zoneid, $oid, $type, $result, $amt, $balance, $cash, $giftedcash, $chargedcash, $source = "srcUnKnown", $itemid = "") { //// var_dump(func_get_args()); //// CLogUtil::print_stack_trace(); // $month = date("Ym"); // $sql = sprintf(self::SQL_M_LOG, $month, $zoneid, $type, $result, $amt, $balance, $cash, $giftedcash, $chargedcash, $source, $oid, $itemid); // $paydb = CPayInit(); // $paydb->query($sql); // $paydb->close(); // } // //// ----------------new pay proc ------------------------- //// 腾讯支付修改版,不再让钻石存储在腾讯端 // // /** // * 【移动端】取消扣除玩家游戏币,无v3调用 // * @param Req $req // * @param UserModel $user // * @param CstSDK_UserModel $sdkUser // * @param int $amt // * @return int // */ // public static function mn_CancelConsumCash($req, $amt) { // $err = ErrCode::ok; // $user = $req->userInfo->game->user; // $zoneid = $req->zoneid; # 分区Id // if ($amt > 0) { // 更新玩家游戏币余额, 老版本的文档中有balance字段,新的没有说明 // UserModel::set_Cash($user, $user->cash + $amt); //# 记录日志 // self::_mPayLog($zoneid, $user->oId, MLogType::Present, $err, $amt, $user->yuanbao, # // $user->cash, $user->gift_cash, $user->charge_amt, "<取消订单>" . self::$m_billno); // } // return $err; // } // // /** // * 【移动端】扣除玩家游戏币,无V3调用(Ps.发货逻辑最后执行此步骤) // * @param Req $req Description // * @param int $amt 扣除数量 // * @param string $source (string)备注,扣除来源(模块) // * @param string $itemid (option)相关物品id // * @return int ErrCode // */ // public static function mn_SaveUserCash($req, $amt, $source = "", $itemid = "0") { // $err = ErrCode::ok; // if ($amt > 0) { // 防御,数量不可能小于0 // $user = $req->userInfo->game->user; // $zoneid = $req->zoneid; // 分区Id // if ($user->cash < $amt) { // 余额不足 // $err = ErrCode::notenough_cash_msg; // } else {// 更新玩家游戏币余额 // UserModel::set_Cash($user, $user->cash - $amt); // self::$m_billno = date("Y-m-d H:i:is"); // } // self::_mPayLog($zoneid, $req->uid, MLogType::Save, $err, # // $amt, $user->yuanbao, $user->cash, $user->gift_cash, $user->charge_amt, $source); // } // return $err; // } // // /** // * 【移动端】给玩家账号直接增加(赠送)游戏币(钻石)(无V3), // * 赠送的游戏币不参与分成结算,若是造成收入损失,自负。 // * @param Req $req Description // * @param type $amt 数量 // */ // public static function mn_AddUserCash($req, $amt, $source = "") { // $err = ErrCode::ok; // if ($amt > 0) {// 防御,若是给出错误数值直接返回 // $user = $req->userInfo->game->user; // UserModel::set_Cash($user, $user->cash + $amt); // if ($user->cash < 0) { // # 输出日志-wqq // } //# 记录日志 // self::_mPayLog($req->zoneid, $req->uid, MLogType::Present, $err, # // $amt, $user->yuanbao, $user->cash, $user->gift_cash, $user->charge_amt, $source); // } // return ErrCode::ok; // } // //// /** //// * 【移动端】扣除游戏币购买道具 //// * @param RequestVo $req //// */ //// static function mn_pay($req) { //// $resp = new ResponseVo(); //// $user = $req->userInfo->user; # user引用 ////// 客户端参数解析 //// $itemId = $req->paras[4]; // 道具ID //// //// $itemModel = ConstProc::getItemConst($req->mem, $itemId); // 取道具的常量数据 //// if ($itemModel == null) { //1.检测是否存在道具的常量数据 //// $resp = ResponseVo::myErrResponse($req, ErrCode::err_msg_itemnoconst); //// } else { //// $prize = JsonUtil::decode($itemModel->prize); # 价格 //// if (property_exists($prize, "c") && $prize->c > 0) {// 钻石购买 //// $amt = self::_getItemCashPrize($itemModel); // 道具价格(钻石) //// if ($amt <= 0) { //// $resp = ResponseVo::myErrResponse($req, ErrCode::err_pay_vipnewerno); //// } else { //// if ($user->cash < $amt) { // 余额不足 //// $resp = ResponseVo::myErrResponse($req, ErrCode::err_msg_cashnotenough); //// } else { // 发货 //// StoreProc::addSeprateItem($itemModel, $req); // 更新玩家游戏币余额 //// UserModel::set_Cash($user, $user->cash - $amt); // 更新玩家数据信息 //// UserProc::updateUserInfo($req); // 直接将$user的最新值返回给客户端 //// $resp = ResponseVo::myRetResponse($req, $user); ////# 记录日志 //// $source = "商城购买-" . $itemModel->name; //// self::_mPayLog($req->zoneid, $req->oid, MLogType::Shop, $resp->err, # //// $amt, $user->yuanbao, $user->cash, $user->gift_cash, $user->charge_amt, $source, $itemId); //// } //// } //// }// 金币购买 //// else if (CommUtil::isPropertyExists($prize, "g") && $prize->g > 0) { //// if ($req->userInfo->user->gold < $prize->g) { //// $resp = ResponseVo::myErrResponse($req, ErrCode::err_msg_goldnotenough); //// } else {// 发货 //// StoreProc::addSeprateItem($itemModel, $req); // 更新玩家金币余额 //// UserModel::Comsume_Gold($user, $prize->g); // 更新玩家数据信息 //// UserProc::updateUserInfo($req); // 直接将$user的最新值返回给客户端 //// $resp = ResponseVo::myRetResponse($req, $user); //// } //// }// 除了金币和钻石以外还有荣誉点。 //// else if (CommUtil::isPropertyExists($prize, "h") && $prize->h > 0) { //// if ($user->honour < $prize->h) { //// $resp = ResponseVo::myErrResponse($req, ErrCode::err_msg_honournotenough); //// } else {// 发货 //// StoreProc::addSeprateItem($itemModel, $req); // 更新玩家荣誉值余额 //// $user->honour-=$prize->h; // 更新玩家数据信息 //// UserProc::updateUserInfo($req); // 直接将$user的最新值返回给客户端 //// $resp = ResponseVo::myRetResponse($req, $user); //// } //// } //// } //// return $resp; //// } //// //// /** //// * 【移动端】查询账户游戏币余额 //// * @history //// * 2015-7-6 改动思路, 不直接拿api返回值中的balance更新玩家的钻石余额, //// * 采用计算相对值的方法计算距离上次更新,玩家是否有新的充值, //// * $amt>0,则代表有新的充值,将$amt更新到玩家账户. //// * @param RequestVo $req //// * @param string $source 来源 //// */ //// static function mn_get_Balance($req, $source = "") { //// if ($req->userInfo->isTest) { //// return ResponseVo::myRetResponse($req, $req->userInfo->user); //// } //// $resp = new ResponseVo(); //// $sdkUser = $req->userInfo->sdkUserKey; //// $user = $req->userInfo->user; ////// 客户端参数解析 //// $openid = $req->oid; // openid //// $zoneid = $req->zoneid; // 分区Id //// $openkey = $sdkUser->access_token; // openkey|accesstoken //// $pf = $sdkUser->pf; // pf //// $pfkey = $sdkUser->pf_key; // pfkey //// $paytoken = $sdkUser->pay_token; // 手Q客户端获取,微信传空 //// $v3 = CV3Init(); //// $appid = V3_APPID; # 支付模块,微信和手Q统一使用手Q的appid //// $ts = TimeUtil::tsCurrent(); //// $v3PayRet = $v3->m_get_balance($sdkUser->platform, $openid, $openkey, $pf, $paytoken, $appid, $pfkey, $ts, $zoneid); //// $v3->close(); //// $amt = 0; //// if ($v3PayRet->ret != 0) { //v3其他错误 //// $resp = ResponseVo::errResponse($req->oid, $req->msgid, $v3PayRet->ret); //// $resp->result = $v3PayRet; //// } else { //// $amt = $v3PayRet->save_amt - $user->charge_amt; # 本次充值金额 = v3提供的历史充值金额 - 玩家记录的历史充值金额 //// if ($amt > 0) { //// $user->cash +=$amt; # $v3PayRet->balance; //// $user->charge_amt = $v3PayRet->save_amt; # 更新历史充值金额 //// $user->gift_cash = $v3PayRet->gen_balance; // 赠送的宝石数量 //// if (isset($req->userInfo->game->privateState->firstPayGift) # 无此字段代表已经领取礼包 //// && !$req->userInfo->game->privateState->firstPayGift) { //// $req->userInfo->game->privateState->firstPayGift = true; //// } //// } ////// self::m_FixUserCash($req); # 修复(特定)用户钻石数据(端午节系统邮件失误) //// UserProc::updateUserInfo($req); // 更新玩家数据信息 //// $resp = ResponseVo::myRetResponse($req, $user); // 直接将$user的最新值返回给客户端 //// } //// self::_mPayLog($zoneid, $openid, MLogType::Inquire, $v3PayRet->ret, # //// $amt, $user->yuanbao, $user->cash, $user->gift_cash, $user->charge_amt, $source); //// return $resp; //// } //}