* @version : HUOSDK 8.0 */ namespace huo\controller\pay; use huo\controller\agent\AgentCache; use huo\controller\common\Base; use huo\controller\common\CommonFunc; use huo\controller\member\MemCache; use huo\controller\rate\Rate; use huo\controller\request\Channel; use huo\controller\request\Device; use huo\controller\request\Game as GameRq; use huo\controller\request\Mem; use huo\controller\request\Order; use huo\controller\request\Order as OrderRq; use huo\controller\request\Role; use huo\controller\wallet\GmCache; use huo\model\order\OrderExtModel; use huo\model\order\OrderModel; use huoAgentSwitch\controller\AgentSwitchController; use huolib\constant\CommonConst; use huolib\constant\OrderConst; use huolib\status\DeviceStatus; use huolib\status\GameStatus; use huolib\status\MemberStatus; use huolib\status\OrderStatus; use huolib\status\RoleStatus; use huolib\tool\Rand; use huolib\tool\StrUtils; use huolib\utils\DeviceUtils; use huolib\utils\GameUtils; use huolib\utils\OrderUtils; use huolib\utils\RoleUtils; use think\Log; class Sdk extends Base { protected function retSucMsg($code, $data = []) { $_msg = OrderStatus::getMsg($code); return $this->huoSuccess($code, $_msg, $data); } protected function retErrMsg($code) { $_err_msg = OrderStatus::getMsg($code); return $this->huoError($code, $_err_msg); } /** * @param OrderRq $order * @param Role $role * @param Mem $mem * @param GameRq $game_rq * @param Channel $channel * @param Device $device * * @return array|bool */ public function checkParam( OrderRq $order, Role $role, Mem $mem, GameRq $game_rq, Channel $channel, Device $device ) { // TODO: wuyonghong 2018/5/24 校验参数未完成 $_chk_order_rs = OrderUtils::checkSdkOrder($order->toArray()); if (OrderStatus::NO_ERROR != $_chk_order_rs) { return $this->retErrMsg($_chk_order_rs); } $_chk_role_rs = RoleUtils::checkRole($role->toArray()); if (RoleStatus::NO_ERROR != $_chk_role_rs) { return $this->huoError($_chk_role_rs, RoleStatus::getMsg($_chk_role_rs)); } $_chk_device_rs = DeviceUtils::checkDevice($device->toArray()); if (DeviceStatus::NO_ERROR != $_chk_device_rs) { return $this->huoError($_chk_device_rs, DeviceStatus::getMsg($_chk_device_rs)); } $_chk_game_rs = GameUtils::checkGame($game_rq->toArray()); if (GameStatus::NO_ERROR != $_chk_game_rs) { return $this->huoError($_chk_game_rs, GameStatus::getMsg($_chk_game_rs)); } $_code = OrderStatus::NO_ERROR; return $this->retErrMsg($_code); } /** * 预下单 * * @param OrderRq $order * @param Role $role * @param Mem $mem * @param GameRq $game_rq * @param Channel $channel * @param Device $device * * @return array|bool|string */ public function preorder(OrderRq $order, Role $role, Mem $mem, GameRq $game_rq, Channel $channel, Device $device) { $_check_rs = $this->checkParam($order, $role, $mem, $game_rq, $channel, $device); if (OrderStatus::NO_ERROR != $_check_rs['code']) { return $_check_rs; } $_order_id = StrUtils::genOrderId($mem->getAgentId(), $channel->getAgentId(), $mem->getMemId()); $order->setOrderId($_order_id); $_rdata = $this->buildOrder($order, $role, $mem, $game_rq, $device); if (empty($_rdata)) { $_err_msg = 'func='.__FUNCTION__.'&class='.__CLASS__.'&step=2&game'.json_encode($game_rq->toArray()) .'&channel' .json_encode($channel->toArray()).'&device'.json_encode($device->toArray()).'&member' .json_encode($mem->toArray()); Log::write($_err_msg, Log::ERROR); return $this->retErrMsg(OrderStatus::ORDER_CREATE_FAIL); } // TODO: wuyonghong 2018/4/27 订单扩展处理 $_rdata['order_id'] = $_order_id; /* 异步处理数据 */ (new \huo\controller\queue\Order($game_rq->getHAppId()))->create( $device, $game_rq, $channel, $mem, $role, $order ); return $this->retSucMsg(OrderStatus::NO_ERROR, $_rdata); } /** * @param OrderRq $order * @param Role $role * @param Mem $mem * @param GameRq $game_rq * * @param Device $device * * @return bool|mixed */ public function buildOrder(OrderRq $order, Role $role, Mem $mem, GameRq $game_rq, Device $device) { /* 订单主表 */ $_rate_class = new Rate($game_rq->getHAppId(), $mem->getAgentId()); $order->setProductRealPrice( StrUtils::formatNumber($order->getProductPrice() * $_rate_class->getMemRate($mem->getMemId())) ); $order->setRebateAmount( StrUtils::formatNumber($order->getProductPrice() * $_rate_class->getMemRebate($mem->getMemId())) ); $_data = $order->toArray(); $_data['mem_id'] = $mem->getMemId(); $_data['mg_mem_id'] = $mem->getMgMemId(); $_data['agent_id'] = $mem->getAgentId(); $_data['app_id'] = $game_rq->getHAppId(); $_data['vb_id'] = $game_rq->getVbId(); $_data['rate'] = $_rate_class->getMemRate($mem->getMemId()); /* 切量处理 */ $_data['ip'] = $device->getIp(); $_data = (new AgentSwitchController())->orderSwitch($_data); $_order_model = new OrderModel(); $_pay_data = $_order_model->createOrder($_data); if (false == $_pay_data) { return false; } /* 2 订单扩展表 */ $_data['pay_id'] = $_pay_data['id']; $_role_data = $role->toArray(); $_device_data = $device->toArray(); $_oe_data = array_merge($_data, $_role_data, $_device_data); $_oe_rs = (new OrderExtModel())->addOeLog($_oe_data); if (false == $_oe_rs) { return false; } $_pay_data['ext'] = $_oe_rs; $_rdata = SdkOrderCache::ins()->getInfoByOrderId($order->getOrderId()); return $_rdata; } /** * @param $order_id * * @return bool */ public function getStatus($order_id = '') { if (empty($order_id)) { return false; } $_order_data = SdkOrderCache::ins()->getInfoByOrderId($order_id); if (empty($_order_data)) { return false; } $_rdata['status'] = $_order_data['status']; $_rdata['cp_status'] = $_order_data['cp_status']; $_rdata['product_name'] = $_order_data['product_name']; $_rdata['product_id'] = $_order_data['product_id']; $_rdata['real_amount'] = $_order_data['real_amount']; $_rdata['product_cnt'] = $_order_data['product_cnt']; $_rdata['payway'] = $_order_data['payway']; return $_rdata; } /** * @param $order_id * * @param bool $is_client * * @return array|mixed */ public function getPayInfo($order_id, $is_client = false) { $_order_id = $order_id; if (empty($order_id)) { return $this->retErrMsg(OrderStatus::ORDER_ID_EMPTY); } $_order_data = SdkOrderCache::ins()->getInfoByOrderId($_order_id); if (empty($_order_data)) { return $this->retErrMsg(OrderStatus::ORDER_NOT_EXISTS); } $_me_data = MemCache::ins()->getMeInfoById($_order_data['mem_id']); if (empty($_me_data)) { $_code = MemberStatus::UID_NOT_EXISTS; return $this->huoError($_code, MemberStatus::getMsg($_code)); } /* 获取玩家游戏币余额 */ $_gmc_class = GmCache::ins(); $_gm_cnt = $_gmc_class->getRemainByMemGame($_order_data['mem_id'], $_order_data['app_id']); if (empty($_gm_cnt)) { $_gm_cnt = 0; } if ($is_client) { $_rdata['pay_token'] = (new order())->genPayToken($_order_id); $_rdata['order_id'] = $_order_data['order_id']; $_rdata['product_name'] = $_order_data['product_name']; $_rdata['product_price'] = $_order_data['amount']; $_rdata['real_amount'] = $_order_data['real_amount']; $_rdata['ptb_cnt'] = $_me_data['ptb_cnt']; $_rdata['gm_cnt'] = $_gm_cnt; $_rdata['ptb_rate'] = CommonFunc::getPtbRmbRate(); $_rdata['gm_rate'] = CommonFunc::getGmRmbRate(); $_rate_class = new Rate($_order_data['app_id'], $_order_data['agent_id']); $_rdata['benefit_type'] = $_rate_class->getBenefitType(); $_rdata['mem_rate'] = $_order_data['rate']; $_rdata['rebate_cnt'] = $_order_data['rebate_amount']; $_rdata['pay_type'] = $this->getClientPayWays( $_order_data['app_id'], $_rdata['product_price'], $_order_data['rate'], $_order_data['rebate_amount'], $_rdata['gm_cnt'] ); } else { $_rdata['order_id'] = $_order_data['order_id']; $_rdata['product_name'] = $_order_data['product_name']; $_rdata['product_price'] = $_order_data['amount']; //$_rdata['product_cnt'] = $_order_data['product_cnt']; //屏蔽数量不显示 2018/11/17 运营需求 $_rdata['product_cnt'] = ''; $_rdata['real_amount'] = $_order_data['real_amount']; $_rdata['ptb_cnt'] = $_me_data['ptb_cnt']; $_rdata['gm_cnt'] = isset($_me_data['gm_cnt']) ? $_me_data['gm_cnt'] : 0; $_rdata['ptb_rate'] = CommonFunc::getPtbRmbRate(); $_rdata['gm_rate'] = CommonFunc::getGmRmbRate(); $_rate_class = new Rate($_order_data['app_id'], $_order_data['agent_id']); $_rdata['benefit_type'] = $_rate_class->getBenefitType(); $_rdata['mem_rate'] = $_order_data['rate']; $_rdata['rebate_cnt'] = $_order_data['rebate_amount']; $_rdata['pay_type'] = $this->getPayWays( $_order_data['app_id'], $_rdata['product_price'], $_rdata['ptb_cnt'] ); } return $this->retSucMsg(OrderStatus::NO_ERROR, $_rdata); } /** * @param string $app_id * * @param int $amount * @param int $ptb_cnt * * @return array */ public function getPayWays($app_id, $amount = 0, $ptb_cnt = 0) { // TODO: wuyonghong 2018/4/28 从数据库读取 if (empty($app_id)) { /* 获取支付方式 */ $_rdata[0]['payway'] = 'alipay'; $_rdata[0]['name'] = '支付宝'; $_rdata[0]['icon'] = STATICSITE.'/h5sdk/images/arwec.png'; $_rdata[0]['url'] = '支付宝'; $_rdata[1]['payway'] = 'wxpay'; $_rdata[1]['name'] = '微信'; $_rdata[1]['icon'] = STATICSITE.'/h5sdk/images/wergcder.png'; $_rdata[1]['url'] = '微信'; } /* 获取支付方式 */ $_rdata[0]['payway'] = 'alipay'; $_rdata[0]['name'] = '支付宝'; $_rdata[0]['icon'] = STATICSITE.'/h5sdk/images/arwec.png'; $_rdata[0]['url'] = '支付宝'; $_rdata[1]['payway'] = 'wxpay'; $_rdata[1]['name'] = '微信'; $_rdata[1]['icon'] = STATICSITE.'/h5sdk/images/wergcder.png'; $_rdata[1]['url'] = '微信'; // $_rdata[2]['payway'] = 'shengpay'; // $_rdata[2]['name'] = '银行卡'; // $_rdata[2]['icon'] = STATICSITE.'/h5sdk/images/upcash.png'; // $_rdata[2]['url'] = '银行卡'; if ($amount <= $ptb_cnt) { $_rdata[2]['payway'] = 'ptbpay'; $_rdata[2]['name'] = config('CURRENCY_NAME'); $_rdata[2]['icon'] = STATICSITE.'/h5sdk/images/ptbpay.png'; $_rdata[2]['url'] = config('CURRENCY_NAME'); } return $_rdata; } /** * @param string $app_id * * @param int $amount 支付金额 * @param float $rate 折扣 * @param float $rebate_cnt 返利 * @param int $gm_cnt 游戏币数量 * * @return array */ public function getClientPayWays($app_id, $amount = 0, $rate = 1.0, $rebate_cnt = 0.0, $gm_cnt = 0) { // TODO: wuyonghong 2018/4/28 从数据库读取 /* 获取支付方式 */ $_rdata[0]['payway'] = 'alipay'; $_rdata[0]['name'] = '支付宝'; $_rdata[0]['mem_rate'] = $rate; $_rdata[0]['rebate_cnt'] = $rebate_cnt; $_rdata[0]['icon'] = 'http:'.STATICSITE.'/h5sdk/images/huosdk_uc_zfb.png'; $_rdata[0]['url'] = '支付宝'; $_rdata[1]['payway'] = 'wxpay'; $_rdata[1]['name'] = '微信'; $_rdata[1]['icon'] = 'http:'.STATICSITE.'/h5sdk/images/huosdk_uc_wxzf.png'; $_rdata[1]['url'] = '微信'; $_rdata[1]['mem_rate'] = $rate; $_rdata[1]['rebate_cnt'] = $rebate_cnt; $_rdata[2]['payway'] = 'gamepay'; $_rdata[2]['name'] = config('GM_CURRENCY_NAME'); if ($gm_cnt > 0) { $_rdata[2]['icon'] = 'http:'.STATICSITE.'/h5sdk/images/huosdk_uc_youxibi.png'; } else { $_rdata[2]['icon'] = 'http:'.STATICSITE.'/h5sdk/images/huosdk_uc_youxibi_disable.png'; } $_rdata[2]['url'] = config('GM_CURRENCY_NAME'); $_rdata[2]['mem_rate'] = 1; $_rdata[2]['rebate_cnt'] = 0; return $_rdata; } /** * 查询微信订单 * * @param $order_id */ public function queryWxOrder($order_id) { // TODO: wuyonghong 2018/5/7 查询订单完成情况 } }