0) { // 防御,数量不可能小于0
$user = $req->userInfo->game->user;
$zoneid = $req->zoneid; // 分区Id
if ($user->yuanbao < $amt) { // 余额不足
CLog::err("[Cheating] mn_SaveUserYuanbao:" . $req->uid, __CLASS__);
$err = ErrCode::notenought_yuanbao;
} else {// 更新玩家游戏币余额
$user->yuanbao -= $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;
}
/**
* 新版支付(引入元宝这种货币)
* @param Req $req
* @return type
*/
public static function m_payByYuanbao($req) {
$resp = Resp::err(ErrCode::err_method_notimplement);
$user = $req->userInfo->game->user; # user引用
$privateState = $req->userInfo->game->privateState;
// 客户端参数解析
$paytype = $req->paras[0]; // 付费类型 3.元宝, 2. 钻石, 1. 金币,
$itemId = $req->paras[1]; // 道具ID
$itemModel = CGameConfig::item_getItem($itemId); # 取道具的常量数据
if ($itemModel == null) { //1.检测是否存在道具的常量数据
$resp = Resp::err(ErrCode::err_const_no);
} else {
$properties = JsonUtil::decode($itemModel->properties);
if (CommUtil::isPropertyExists($properties, "isActive") # 活动物品
&& StlUtil::arrayIn($privateState->activeList, $properties->isActive)) {
$resp = Resp::err(Errcode::active_hasgetted); # 已领过
} else {
if ($paytype == 3) {# 元宝
if ($user->yuanbao < $itemModel->cost) { # 元宝不足
CLog::err("[Cheating] m_payByYuanbao:" . $req->uid, __CLASS__);
$resp = Resp::err(ErrCode::notenought_yuanbao);
} else { # 发货
StoreProc::addSeprateItem($itemModel, $req);
$amt = $itemModel->cost;
$source = "商城购买-" . $itemModel->name;
self::mn_SaveUserYuanbao($req, $amt, $source); // 更新玩家游戏币余额
UserProc::updateUserInfo(); // 直接将$user的最新值返回给客户端
$resp = Resp::ok("success");
}
} else { # 钻石、金币
$prize = JsonUtil::decode($itemModel->prize); # 价格
if (property_exists($prize, "c") && $prize->c > 0) {// 钻石购买
$amt = self::_getItemCashPrize($itemModel); // 道具价格(钻石)
if ($amt <= 0) {
$resp = Resp::err(ErrCode::pay_price_err);
} else {
if ($user->cash < $amt) { // 余额不足
$resp = Resp::err(ErrCode::notenough_cash_msg);
} else { // 发货
StoreProc::addSeprateItem($itemModel, $req); // 更新玩家游戏币余额
// $user->cash -= $amt;
self::mn_SaveUserCash($req, $amt, "商城购买-花钻", $itemId);
UserProc::updateUserInfo(); // 直接将$user的最新值返回给客户端
$resp = Resp::ok($user);
}
}
}// 金币购买
else if (CommUtil::isPropertyExists($prize, "g") && $prize->g > 0) {
if ($req->userInfo->game->user->gold < $prize->g) {
$resp = Resp::err(ErrCode::notenough_gold_msg);
} else {// 发货
StoreProc::addSeprateItem($itemModel, $req); // 更新玩家金币余额
UserModel::Comsume_Gold($user, $prize->g); // 更新玩家数据信息
UserProc::updateUserInfo(); // 直接将$user的最新值返回给客户端
$resp = Resp::ok($user);
}
} else { # 未知的支付类型
$resp = Resp::err(ErrCode::pay_m_type_err);
}
}
}
}
return $resp;
}
/**
* 缓存一个账单号,如果代码执行过程中出现错误,直接取消扣除游戏币
* 注意,若是逻辑不是在一次Request内完成的,那么次订单号需要进行存储
* @var string
*/
static $m_billno;
/**
* 【多平台版】刷新充值订单(领取充值结果)
* @param Req $req
*/
public static function m_refreshChargeOrders($req) {
if (!$req) {
$resp = Resp::err(ErrCode::err_method_notimplement);
return $resp;
}
$userinfo = $req->userInfo;
if (!$userinfo) {
$resp = Resp::err(ErrCode::user_no_err);
return $resp;
}
$user = $userinfo->game->user;
if (!$user) {
$resp = Resp::err(ErrCode::user_no_err);
return $resp;
}
// 客户端参数解析
$uid = $req->uid; // userID
$zoneid = $req->zoneid; // 分区Id
if (!$uid || ($zoneid < 1)) {
$resp = Resp::err(ErrCode::paras_err);
return $resp;
}
$mem = $req->mem;
if (!$mem) {
$resp = Resp::err(ErrCode::err_method_notimplement);
return $resp;
}
# 取挂起的订单数据
$orders = $mem->get(MemKey_User::PayOrders($zoneid, $uid));
$amt = 0;
$num = 0;
if ($orders == null) { # 订单为空
$orders = ArrayInit();
}
foreach ($orders as $order) { # 多张订单合并
$amt += $order->price;
$num += $order->amt;
}
$user->yuanbao += $num; #
$user->charge_amt += $amt; # 历史充值记录(单位分)
if ($amt > 0 # 充值金额大于0,且首付标志为false才可以
&& isset($req->userInfo->game->privateState->firstPayGift) # 无此字段代表已经领取礼包
&& !$req->userInfo->game->privateState->firstPayGift) {
$req->userInfo->game->privateState->firstPayGift = true;
}
$orders = ArrayInit(); # 清空
$mem->set(MemKey_User::PayOrders($zoneid, $uid), $orders); # 清理已经处理过的订单
UserProc::updateUserInfo(); // 更新玩家数据信息
$resp = Resp::ok($user->yuanbao); // 直接将$user的最新值返回给客户端
# todo: 这里可以再加一条订单记录
self::_mPayLog($zoneid, $uid, MLogType::Inquire, 0, #
$num, $user->yuanbao, $user->cash, $user->gift_cash, $user->charge_amt, "刷新订单");
return $resp;
}
/**
* 取物品的价格(钻石)
* @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 UserModel $user
* @param Req $req Description
* @param int $amt 增加数量
* @param string $source (string)备注,增加来源(模块)
* @return int ErrCode
*/
public static function m_AddUserYuanbao($req, $amt, $source = "") {
$err = ErrCode::ok;
if ($amt > 0) { // 防御,数量不可能小于0
$user = $req->userInfo->game->user;
$zoneid = $req->zoneid; // 分区Id
// 更新玩家游戏币余额
$user->yuanbao += $amt;
self::$m_billno = date("Y-m-d H:i:is");
self::_mPayLog($zoneid, $req->uid, MLogType::Present, $err, #
$amt, $user->yuanbao, $user->cash, $user->gift_cash, $user->charge_amt, $source);
}
return $err;
}
//
/**
* 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')";
/**
* 移动支付插入一条记录
* @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 = "") {
// $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();
}
//
//
// 在自己的模块里面呆着吧
//
//
//
}