* @version : HuoMp 1.0 */ namespace mini\sdk\controller; use huo\controller\common\HuoSession; use huo\controller\game\GameCache; use huo\controller\game\GamePaySwitchCache; use huo\controller\member\MemCache; use huo\controller\pay\GamePay; use huo\controller\pay\Notify; use huo\controller\pay\PaySwitch; use huo\controller\pay\PtbPay; use huo\controller\pay\Sdk; use huo\controller\pay\SdkOrderCache; use huo\model\member\MemGameModel; use huo\model\member\MemoauthModel; use huo\model\order\OrderModel; use huoAgentSwitch\controller\AgentSwitchController; use huolib\constant\CacheConst; use huolib\constant\CommonConst; use huolib\constant\GameConst; use huolib\constant\MemConst; use huolib\constant\MpConfConst; use huolib\constant\OauthConst; use huolib\constant\OrderConst; use huolib\constant\PaywayConst; use huolib\constant\WalletConst; use huolib\pay\Pay; use huolib\status\CommonStatus; use huolib\status\MemberStatus; use huolib\status\OrderStatus; use huolib\tool\RateLimit; use huolib\utils\OrderUtils; use huomp\controller\game\GameMini; use huomp\controller\order\OrderOut; use huomp\controller\share\QrCodeOut; use huomp\model\game\GameMiniModel; use huomp\model\weixin\MpConfModel; use huoMpQr\QrCode; use mini\common\controller\V2ApiBaseController; use think\Cache; use think\Log; class OrderController extends V2ApiBaseController { public function _initialize() { parent::_initialize(); // Log::write( // $this->request->scheme().'://'.$this->request->server('HTTP_HOST').$this->request->server('REQUEST_URI').'?' // .$this->request->getContent(), // Log::LOG // ); } /** * 预下单 * http://doc.1tsdk.com/159?page_id=4381 * 【域名】/mp/preorder */ public function preorder() { $this->checkLogin(); $_rs = (new RateLimit())->rateLimit($this->mem_id, true, true, 1, 3); if (false == $_rs) { $_code = CommonStatus::TOO_MANY_REQUESTS; $this->error(CommonStatus::getMsg($_code)); } $_game_rq = $this->setGameData(); $_channel_rq = $this->setChannelData(); $_device_rq = $this->setDeviceData(); $_mem_rq = $this->setMemData(); $_role_rq = $this->setRoleData(); $_order_rq = $this->setOrderData(); $_mem_data = MemCache::ins()->getInfoById($this->mem_id); if (isset($_mem_data['status']) && $_mem_data['status'] == MemConst::STATUS_FORBID) { $_code = MemberStatus::LOGIN_IS_OUT; $this->error(lang(MemberStatus::getMsg($_code)), [], $_code); } $_mem_game_info = (new MemGameModel())->getInfoByAppMemId($_game_rq->getHAppId(), $this->mem_id); $_agent_id = $_mem_game_info['guided_agent_id'] ?? 0; if (empty($_agent_id)) { $_agent_id = $_mem_data['agent_id'] ?? 0; } $_mem_rq->setAgentId($_agent_id); $_channel_rq->setAgentId($_agent_id); $_order = new Sdk(); $_pay_check = OrderConst::PAY_SWITCH_NO; /* 判断支付切换 */ if (GameConst::GAME_MP_GAME == $_game_rq->getPkgName()) { $_pay_check = (new PaySwitch())->getPaySwitch( $_order_rq, $_role_rq, $_mem_rq, $_game_rq, $_channel_rq, $_device_rq ); } $_is_sand = false; if (GameConst::GAME_MP_GAME == $_game_rq->getPkgName()) { /* 判断是否上线 上线使用正式环境 未上线使用沙盒环境 */ $_game_data = GameCache::ins()->getInfoByAppId($_game_rq->getHAppId()); $_pay_way = PaywayConst::PAYWAY_MPAY; if (GameConst::GAME_STATUS_ACCESS == $_game_data['status']) { $_is_sand = true; $_pay_way = PaywayConst::PAYWAY_MPAY_TEST; } $_order_rq->setPayway($_pay_way); } $_preorder_rs = $_order->preorder($_order_rq, $_role_rq, $_mem_rq, $_game_rq, $_channel_rq, $_device_rq); if (OrderStatus::NO_ERROR != $_preorder_rs['code']) { $this->returnData($_preorder_rs); } $_order_id = $_preorder_rs['data']['order_id']; $_pay_token = $_order_rq->genPayToken($_order_id); $_rdata['order_id'] = $_order_id; $_rdata['pay_token'] = $_pay_token; $_rdata['check'] = $_pay_check; $_rdata['pay_url'] = ''; if (GameConst::GAME_MP_GAME == $_game_rq->getPkgName()) { $_mp_data = (new OrderOut())->getMpayData($_order_id, $_is_sand); $_rdata = array_merge($_rdata, $_mp_data['data']); } $this->success(lang('SUCCESS'), $_rdata); } /** * 获取订单ID * * @return mixed|string */ protected function getOrderId() { $_order_rq = $this->setOrderData(); $_order_id = $_order_rq->getOrderId(); if (empty($_order_id)) { $_order_id = get_val($this->rq_data, 'order_id'); } $_order_id = urldecode($_order_id); if (strpos($_order_id, '&')) { $_mem_app_arr = explode('&', $_order_id); $_mem_id = $_mem_app_arr['0']; $_app_id = $_mem_app_arr['1']; $_order_id = (new OrderModel())->getLastOrderId($_mem_id, $_app_id); } return $_order_id; } /** * 点击支付 * http://doc.1tsdk.com/159?page_id=4383 *【域名】/mp/wx/pay */ public function pay() { $this->checkLogin(); $_rs = (new RateLimit())->rateLimit($this->mem_id, true, true, 1, 3); if (false == $_rs) { $_code = CommonStatus::TOO_MANY_REQUESTS; $this->error(CommonStatus::getMsg($_code)); } $_game_rq = $this->setGameData(); $_app_id = $_game_rq->getHAppId(); $_order_rq = $this->setOrderData(); $_order_id = $this->getOrderId(); $_payway = get_val($this->rq_data, 'payway', ''); $_pw_check_rs = OrderUtils::checkPayway($_payway); if (OrderStatus::NO_ERROR != $_pw_check_rs) { $this->error(OrderStatus::getMsg($_pw_check_rs), [], $_pw_check_rs); } /* 判断是否使用平台币 */ $_has_ptb = get_val($this->rq_data, 'has_ptb', 1); if (OrderConst::PAY_HAS_PTB == $_has_ptb) { /* 使用平台币 先记录入缓存 */ $_rdata = (new PtbPay())->PtbOrder($_order_id); if (OrderStatus::NO_ERROR != $_rdata['code']) { $this->returnData($_rdata); } } $_order_data = SdkOrderCache::ins()->getInfoByOrderId($_order_id); if (empty($_order_data)) { $_code = OrderStatus::ORDER_NOT_EXISTS; $this->error(OrderStatus::getMsg($_code), [], $_code); } if ($_order_data['real_amount'] <= CommonConst::CONST_ZERO_COMPARE) { /* 完全使用平台币支付 */ $_rs = (new PtbPay())->ptbSdkPay($_order_id); $this->returnData($_rs); } /* 游戏币消费 特有流程 */ if (PaywayConst::PAYWAY_GAMEPAY == strtolower($_payway)) { $_rs = (new GamePay())->GameSdkPay($_order_id); $this->returnData($_rs); } $_order_rq->setDataFromOrder($_order_data); $_pay_class = Pay::ins()->get($_payway); /* 微信支付 小程序支付 */ $_func = 'mpPay'; $_config = (new GameMini())->getPayConf($_app_id); $_show_url = url( 'sdk/'.$_payway.'/showUrl', ['order_id' => $_order_id], false, MPSITE ); $_return_url = url( 'sdk/'.$_payway.'/returnUrl', ['order_id' => $_order_id], false, MPSITE ); $_notify_url = url('sdk/'.$_payway.'/notifyUrl', '', false, MPSITE); // Log::write( // array($_show_url, $_return_url, $_notify_url), // Log::ERROR // ); $_pay_class->setNotifyUrl($_notify_url); $_pay_class->setReturnUrl($_return_url); $_pay_class->setShowUrl($_show_url); $_pay_class->setOrderId($_order_id); $_pay_class->setProductName($_order_rq->getProductName()); $_pay_class->setProductDesc($_order_rq->getProductDesc()); $_pay_class->setRealAmount($_order_rq->getProductRealPrice()); $_pay_class->setProductPrice($_order_rq->getProductPrice()); $_pay_class->setProductId(WalletConst::WALLET_PRODUCT_MP); $_pay_class->setIp($this->request->ip()); $_pay_class->setPayway($_payway); //$_pay_class->setOpenId((new HuoSession($this->mem_id, $_app_id))->getOpenId()); $_conf_id = (new MpConfModel())->getIdByAppId($_app_id, MpConfConst::MP_CONF_TYPE_6); $_openid = (new MemoauthModel())->getOpenidByMemId(OauthConst::OAUTH_MP, $this->mem_id, $_conf_id); $_pay_class->setOpenId($_openid); // Log::write( // array($_config, $_pay_class), // Log::ERROR // ); $_pay_rs = $_pay_class->$_func($_config); if (empty($_pay_rs)) { $_code = OrderStatus::PAYWAY_PREORDER_ERROR; $this->error(OrderStatus::getMsg($_code), [], $_code); } /* 更新支付方式 */ $_pay_alias = $_pay_rs['pay_type']; $_order_data['payway'] = $_pay_alias; $_order_data = (new AgentSwitchController())->orderSwitch($_order_data); SdkOrderCache::ins()->updateOrder($_order_id, $_order_data); $_code = OrderStatus::NO_ERROR; $this->success(OrderStatus::getMsg($_code), $_pay_rs, $_code); } /** * 查询支付结果 * http://doc.1tsdk.com/159?page_id=4384 * 【域名】/mp/order/query */ public function read() { $_rs = (new RateLimit())->rateLimit($this->mem_id, true, true, 1, 3); if (false == $_rs) { $_code = CommonStatus::TOO_MANY_REQUESTS; $this->error(CommonStatus::getMsg($_code)); } $_order_rq = $this->setOrderData(); $_order = new Sdk(); $_rdata = $_order->getStatus($_order_rq->getOrderId()); if (false == $_rdata) { $this->error('ERROR'); } if (OrderConst::CP_STATUS_SUC != $_rdata['cp_status'] && OrderConst::PAY_STATUS_SUC == $_rdata['status']) { $_rs = (new Notify())->notify($_order_rq->getOrderId()); if (OrderStatus::NO_ERROR == $_rs['code']) { $_rdata['status'] = OrderConst::PAY_STATUS_SUC; $_rdata['cp_status'] = OrderConst::CP_STATUS_SUC; } } $_rdata['order_id'] = $_order_rq->getOrderId(); $this->success(lang('SUCCESS'), $_rdata); } /** * 获取订单信息 * http://doc.1tsdk.com/159?page_id=4465 * 【域名】/mp/pay/info */ public function getInfo() { $this->checkLogin(); $_order_id = $this->getOrderId(); $_rdata = (new Sdk())->getPayInfo($_order_id); $this->returnData($_rdata); } /** * 获取跳转支付信息 * http://doc.1tsdk.com/159?page_id=4805 * 【域名】/mp/order/checkinfo */ public function getSwitchInfo() { $_game_rq = $this->setGameData(); $_path = 'pages/pay/index'; $_order_rq = $this->setOrderData(); $_order_id = $_order_rq->getOrderId(); if (empty($_order_id)) { $_order_id = get_val($this->rq_data, 'order_id'); } $_switch_rule = GamePaySwitchCache::ins()->getInfoByAppId($_game_rq->getHAppId()); $_rdata['mp_id'] = ''; $_rdata['pay_type'] = 0; if (!empty($_switch_rule)) { $_rdata['pay_type'] = $_switch_rule['pay_type']; if (OrderConst::PAY_SWITCH_PAY_TYPE_2 != $_switch_rule['pay_type']) { $_path = $_switch_rule['pages']; $_switch_app_id = $_switch_rule['switch_app_id']; $_rdata['mp_id'] = (new GameMiniModel())->getMpIdByAppId($_switch_app_id); } if (OrderConst::PAY_SWITCH_PAY_TYPE_4 == $_switch_rule['pay_type']) { /* 客服跳转充值 需将当前单号写入缓存,缓存时间为5分钟,缓存失效前每次进入客服都将弹出该未支付订单 */ $_key = CacheConst::CACHE_CUSTOMER_ORDER_PAY_PREFIX.$this->mem_id; Cache::set($_key, $_order_id, CommonConst::CONST_5_MINUTE_SECONDS); } } $_rdata['path'] = $_path.'?orderId='.$_order_id.'&from=2'; $_rdata['intro'] = '点击二维码,长按识别支付'; $_order_data = SdkOrderCache::ins()->getInfoByOrderId($_order_id); if (!empty($_order_data)) { $_order_out = new OrderOut(); $_image = $_order_out->getMemAppQrCode($_order_data['mem_id'], $_order_data['app_id']); if (!empty($_image)) { $_rdata['image'] = $_image; #$_rdata['poster_img'] = (new QrCode())->getPosterImg($_image); $_rdata['poster_img'] = $_rdata['image']; } } $this->success(lang('SUCCESS'), $_rdata); } /** * 获取切换二维码 * http://doc.1tsdk.com/159?page_id=4491 * 【域名】/mp/order/qrcode */ public function getQrCode() { $_game_rq = $this->setGameData(); $_order_rq = $this->setOrderData(); $_order_id = $_order_rq->getOrderId(); if (empty($_order_id)) { $_order_id = get_val($this->rq_data, 'order_id'); } $_is_last = $this->request->param('is_last/d', 0); if (OrderConst::ORDER_SWITCH_LAST == $_is_last) { $_rdata['code'] = CommonStatus::INVALID_PARAMS; $_rdata['msg'] = CommonStatus::getMsg($_rdata['code']); $_rdata['data'] = []; $_order_data = SdkOrderCache::ins()->getInfoByOrderId($_order_id); if (!empty($_order_data)) { $_image = (new OrderOut())->getMemAppQrCode($_order_data['mem_id'], $_order_data['app_id'], true); if (!empty($_image)) { $_rdata['code'] = CommonStatus::NO_ERROR; $_rdata['msg'] = CommonStatus::getMsg($_rdata['code']); $_rdata['data']['image'] = $_image; } } } else { $_path = 'pages/pay/index'; $_switch_rule = GamePaySwitchCache::ins()->getInfoByAppId($_game_rq->getHAppId()); $_rdata['mp_id'] = ''; $_switch_app_id = 0; if (!empty($_switch_rule)) { $_path = $_switch_rule['pages']; $_switch_app_id = $_switch_rule['switch_app_id']; } $_width = get_val($this->rq_data, 'width', 430); $_a_color = get_val($this->rq_data, 'auto_color', 1); $_line_color = get_val($this->rq_data, 'line_color', '{"r":"0","g":"0","b":"0"}'); $_hyaline = get_val($this->rq_data, 'is_hyaline', 1); $_auto_color = false; $_is_hyaline = false; if (2 == $_a_color) { $_auto_color = true; } if (2 == $_hyaline) { $_is_hyaline = true; } $_rdata = (new QrCodeOut())->getOrderQrCode( $_order_id, $_switch_app_id, $_path, $_width, $_auto_color, $_line_color, $_is_hyaline ); } $this->returnData($_rdata); } }