orderDao = new OrderDao(); } /** * 创建订单,返回订单号 * @param array $params * @return array */ public function createOrder(array $params): array { $model = DB::table("app_order"); // 查询cp订单号是否有重复情况 $orderInfo = $model->where(['cp_order_id' => $params['cp_order_id'], 'appid' => $params['app_id']])->first(); if ($orderInfo) { return error("禁止重复下单"); } // 检查参数 if (!is_numeric($params['money']) || $params['money'] < 1) { return error("订单金额的格式类型不正确"); } if (empty($params['app_id']) || empty($params['ctype']) || empty($params['money']) || empty($params['uid'])) { return error("提交参数异常!"); } // 查找融合用户信息 $userInfo = DB::table('app_member')->where(['uid' => $params['uid']])->first(); // 入库 $orderId = $this->createOrderId(); $insertData = [ 'uid' => $params['uid'], 'order_id' => $orderId, 'cp_order_id' => $params['cp_order_id'], 'veruniqid' => $userInfo->veruniqid, 'ver' => $params['ctype'], 'appid' => $params['app_id'], 'server_id' => $params['server_id'], 'server_name' => $params['server_name'], 'role_id' => $params['role_id'], 'money' => $params['money'], 'role_name' => htmlspecialchars($params['role_name']), 'role_level' => $params['role_level'], 'subject' => $params['pname'], 'extra_info' => $params['extend'] ?? '', 'currency_type' => $params['currency_type'] ?? 'CNY', 'create_time' => date('Y-m-d H:i:s') ]; $model->insert($insertData); return success('success',['order_id' => $orderId]); } /** * 生成订单号 * @return int */ private function createOrderId(): string { $datestr = date('YmdHis'); list($usec, $sec) = explode(" ", microtime()); $ustr = (float)$usec*1000000; $ustr = (string)$ustr; $datestr .= $ustr; $pfix = env('APIORDER_FIX',''); return $pfix.$datestr; } /** * 二次确认订单,通过则返回订单状态 * @param array $params * @return array */ public function confirmOrder(array $params) { $orderInfo = DB::table('app_order')->where(['order_id' => $params['order_id'], 'status' => 0])->first(); if (is_null($orderInfo)) { return error('订单状态异常,请重新下单!'); } // 参数校验 if ($orderInfo->money != $params['money'] || $orderInfo->uid != $params['uid']) { return error('订单金额异常!'); } return success('success',['order_id' => $orderInfo->order_id,'status'=>$orderInfo->status]); } /** * 渠道回调,带 appid + 渠道号 参数 * @param array $params * @return array */ public function verBack(array $params) { //获取游戏表配置 $gameInfo = DB::table("app_games_config") ->where(['app_id' => $params['app_id']])->first(); if (is_null($gameInfo)) { return error('该游戏配置不存在,app_id:' . $params['app_id']); } // 获取渠道表配置 $verInfo = DB::table("app_ver_game as avg") ->leftJoin('app_ver as av', 'avg.ver', '=', 'av.ver_class') ->where(['app_id' => $params['app_id'], 'ver_code' => $params['ver']])->first(); if (is_null($verInfo)) { return error('该游戏渠道没配置,ver_code:' . $params['ver']); } // 渠道标识就是类名称 $sdkManager = new SdkManager(); // 返回渠道订单号+订单金额[单位元] $payInfo = $sdkManager->pay($verInfo, $gameInfo, $params); if (!isset($params['order_id']) && !isset($params['money'])) { return $payInfo['result']; } // 更新回调时间+金额 DB::table('app_order')->where(['order_id' => $payInfo['order_id']])->update(['status' => 1, 'amount'=>$payInfo['money'],'dateline' => time()]); // 保存回调日志 DB::table('app_callback_log')->insert([ 'order_id' => $payInfo['order_id'], 'requrl' => request()->fullUrl(), 'reqparams' => var_export(request()->post(),true), 'reqresult' => var_export($payInfo,true), 'reqtime' => time(), ]); // 通知CP发货,redis队列,后台发货, 订单号|appid|渠道号 $list = "{$payInfo['order_id']}|{$params['app_id']}|{$params['ver']}"; Redis::lpush('send_order_list', $list); // 返回渠道要求返回的提示 成功|失败 return $payInfo['result']; } }