* @version : HUOSDK 8.0 */ namespace huoOrderRepeat\controller; use huo\controller\common\Base; use huo\controller\game\Game; use huo\controller\pay\SdkOrderCache; use huo\controller\request\Request; use huo\model\log\OrderCpLogModel; use huolib\constant\OrderConst; use huolib\status\CommonStatus; use huolib\status\OrderStatus; use huolib\tool\StrUtils; use huoOrderRepeat\constant\OrderRepeatConstant; use huoOrderRepeat\queue\RepeatQueue; use think\Log; class OrderRepeat 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); } /** * CP通知入队列 * * @param string $order_id 订单id * @param int $attempts 任务尝试次数 * * @return array */ public function cpNotifyQueue($order_id, $attempts = OrderRepeatConstant::JOB_REPEAT_MAX_CNT) { $_param['order_id'] = $order_id; $_param['attempts'] = $attempts; (new RepeatQueue($_param))->pushQueue(); return $this->retSucMsg(CommonStatus::NO_ERROR); } /** * CP通知 * * @param string $order_id * * @return array|mixed */ public function notify($order_id = '') { if (empty($order_id)) { return $this->retErrMsg(OrderStatus::ORDER_ID_EMPTY); } // $_order_model = new OrderModel(); $_order_model = SdkOrderCache::ins(); $_order_data = $_order_model->getInfoByOrderId($order_id); if (false == $_order_data) { return $this->retErrMsg(OrderStatus::ORDER_NOT_EXISTS); } if (OrderConst::PAY_STATUS_SUC != $_order_data['status']) { Log::write( "func=".__FUNCTION__."&class=".__CLASS__."&code=".OrderStatus::ORDER_NOT_PAY.'&order_data.' .json_encode($_order_data), LOG::LOG ); return $this->retErrMsg(OrderStatus::ORDER_NOT_PAY); } if (OrderConst::CP_STATUS_SUC == $_order_data['cp_status']) { return $this->retSucMsg(OrderStatus::NO_ERROR); } $_param = $this->setCpParam($_order_data); // $_cp_url = (new GameModel())->getCpPaybackUrl($_order_data['app_id']); $_cp_url = (new Game())->getCpPaybackUrl($_order_data['app_id']); if (empty($_cp_url)) { Log::write( "func=".__FUNCTION__."&class=".__CLASS__."&code=".OrderStatus::NOTIFY_URL_EMPTY.'&order_data.' .json_encode($_order_data), LOG::ERROR ); return $this->retErrMsg(OrderStatus::NOTIFY_URL_EMPTY); } $_cp_status = $this->notifyCp($_cp_url, $_param); /* 更新订单信息 */ $_update_order_data['cp_status'] = $_cp_status; $_update_order_data['notify_cnt'] = $_order_data['notify_cnt'] + 1; $_update_order_data['last_notify_time'] = time(); if (OrderConst::CP_STATUS_SUC == $_cp_status) { $_update_order_data['finish_time'] = time(); // $_rs = $_order_model->updateData($_update_order_data, $_order_data['id']); $_rs = SdkOrderCache::ins()->updateOrder($_order_data['order_id'], $_update_order_data); if (true == $_rs) { $_code = OrderStatus::NO_ERROR; } else { $_code = OrderStatus::INNER_ERROR; } } else { $_update_order_data['is_handle'] = OrderConst::ORDER_IS_HANDLE; // $_order_model->updateData($_update_order_data, $_order_data['id']); SdkOrderCache::ins()->updateOrder($_order_data['order_id'], $_update_order_data); $_code = OrderStatus::NOTIFY_FAIL; } /* 插入通知Log */ $_data['pay_id'] = get_val($_order_data, 'id', 0); $_data['order_id'] = get_val($_order_data, 'order_id', ''); $_data['cp_order_id'] = get_val($_order_data, 'cp_order_id', 0); $_data['status'] = get_val($_order_data, 'status', ''); $_data['cp_payback_url'] = $_cp_url; $_data['params'] = $_param; $_data['ext'] = get_val($_order_data, 'ext', ''); $_data['cp_status'] = get_val($_update_order_data, 'cp_status', 0); $_data['notify_cnt'] = get_val($_update_order_data, 'notify_cnt', ''); $_oc_model = new OrderCpLogModel(); $_oc_model->insertLog($_data); return $this->retSucMsg($_code); } /** * @param $cp_url * @param $param * * @return int */ public function notifyCp($cp_url, $param) { $_cp_rs = Request::cpPayback($cp_url, $param); if ($_cp_rs > 0) { $_cp_status = 2; } else { $_cp_status = 3; } return $_cp_status; } /** * 设置通知CP参数 * * @param array $order_data * * @return bool|string */ public function setCpParam($order_data = []) { $_cp_rq_data['app_id'] = get_val($order_data, 'app_id'); $_cp_rq_data['cp_order_id'] = get_val($order_data, 'cp_order_id'); $_cp_rq_data['mem_id'] = get_val($order_data, 'mg_mem_id', 0);/* 使用游戏玩家ID */ $_cp_rq_data['order_id'] = get_val($order_data, 'order_id'); $_cp_rq_data['order_status'] = get_val($order_data, 'status'); $_cp_rq_data['pay_time'] = get_val($order_data, 'create_time'); $_cp_rq_data['product_id'] = get_val($order_data, 'product_id'); $_cp_rq_data['product_name'] = get_val($order_data, 'product_name'); $_cp_rq_data['product_price'] = get_val($order_data, 'amount'); $_cp_rq_data['ext'] = get_val($order_data, 'ext'); $_param = StrUtils::argSort($_cp_rq_data); $_signstr = StrUtils::createLinkString($_param); /* 获取游戏信息 */ $_app_key = (new Game())->getAppKey($_cp_rq_data['app_id']); if (empty($_app_key)) { return false; } $_sign = md5($_signstr."&app_key=".$_app_key); $_cp_rq_data['sign'] = $_sign; return $_signstr."&sign=".$_sign; } }