chargeList as &$item) { if (!$item->switch_to) continue; $order = Order::where('uid', $this->uid)->where('status', 'PAID')->where('product_id', $item->id)->first(); if ($order) { $change = ProductService::getProductSingle($item->switch_to); $item->id = $change->id; $item->price = $change->price; $item->given = $change->given; } } } /** * @apiVersion 1.0.0 * @apiDescription 充值列表 * @api {get} order/chargeList 充值列表 * @apiHeader {String} [Authorization] token * @apiGroup Order * @apiName chargeList * @apiSuccess {int} code 状态码 * @apiSuccess {String} msg 信息 * @apiSuccess {object} data 结果集 * @apiSuccessExample {json} Success-Response: * HTTP/1.1 200 OK * { * code: 0, * msg: "", * data: [ * { * product_id: 1, * price: "30.00元", * vip: 0, * intro: [ * { * label: 3000, * important: false * }, * { * label: "书币", * important: true * } * ] * }, * { * product_id: 2, * price: "50.00元", * vip: 1, * intro: [ * { * label: 5000, * important: false * }, * { * label: "1000+", * important: true * }, * { * label: "书币", * important: false * } * ] * }, * { * product_id: 5, * price: "365.00元", * vip: 0, * intro: [ * { * label: "年费VIP会员", * important: true * } * ] * } * ] * } */ public function chargeList(Request $request) { $bid = $request->input('bid', ''); $temp = $bid; $template_id = PayTemplateService::getPayTemplate($this->distribution_channel_id); $book_config = null; if ($bid) { $bid = Hashids::decode($bid)[0]; $book_config = BookConfigService::getBookById($bid); } if ($template_id == 2) { //模板2只有在长篇小说过来的用户才显示 //部分渠道需要2元模板不管哪个入口进来都展示 $exclude_channels = explode(',', env('PRICE_TWO_SHOW_ALL_CHANNEL')); if (!in_array($this->distribution_channel_id, $exclude_channels)) { if ($book_config) { if ($book_config->charge_type == 'BOOK') $template_id = 1; } } } $res = ProductService::getChargeProduct($template_id); if (!$res) { return response()->error('WAP_SYS_ERROR'); } $this->chargeList = $res; $this->exchangeList(); //TODO 长篇小数才有模板2 $uid = $this->uid; $is_first_recharge = OrderService::judgeUserFirstRecharge($uid); $data = []; $appad = 0; foreach ($res as $v) { if ($template_id == 7 && $book_config && $book_config->charge_type == 'BOOK' && $v->price == 2) { continue; } if ($template_id == 2 && $v->type == 'NEW_USER' && !$bid) { //2元模版,直接进充值,不出现 continue; } if ($v->type == 'NEW_USER' && $is_first_recharge) { if ( env('NO_NEW_USER_CHARGE') && in_array( $this->distribution_channel_id, explode(',', env('NO_NEW_USER_CHARGE')) ) ) { continue; } $temp = [ 'price' => (float) $v->price . '元', 'is_year_order' => 0, 'is_month_order' => 0, 'text' => sprintf('%s+%s书币', $v->price * 100, $v->given), 'today_special' => $v->is_default, 'first_charge' => true, 'save_text' => round($v->given / 100, 1) . '元', 'product_id' => $v->id, ]; $data[] = $temp; } elseif ($v->type == 'YEAR_ORDER') { if ($v->type == 'NEW_USER') { continue; } $save_text = '年费vip会员'; $text = '每天1元,全年免费看'; $temp = [ 'price' => (int) $v->price . '元', 'is_year_order' => 1, 'is_month_order' => 0, 'text' => $text, 'today_special' => $v->is_default, 'first_charge' => false, 'save_text' => $save_text, 'product_id' => $v->id, ]; $data[] = $temp; } else { if ($v->type == 'NEW_USER') { continue; } $save_text = ''; if ($v->given) { $save_text = round($v->given / 100, 1) . '元'; $text = sprintf('%s+%s书币', $v->price * 100, $v->given); } else { $text = sprintf('%s书币', $v->price * 100); } $temp = [ 'price' => (float) $v->price . '元', 'is_year_order' => 0, 'is_month_order' => 0, 'text' => $text, 'today_special' => $v->is_default, 'first_charge' => false, 'save_text' => $save_text, 'product_id' => $v->id, ]; $data[] = $temp; } } return response()->success($data); } /** * @apiVersion 1.0.0 * @apiDescription 单本消费记录 * @api {get} order/bookOrderList 单本消费记录 * @apiHeader {String} [Authorization] token * @apiGroup Order * @apiName bookOrderList * @apiParam {String} [page_size] 分页大小 * @apiParam {String} [page] 页码 * @apiSuccess {int} code 状态码 * @apiSuccess {String} msg 信息 * @apiSuccess {object} data 结果集 * @apiSuccess {Int} uid uid * @apiSuccess {Int} bid bid * @apiSuccess {Int} book_name 书名 * @apiSuccess {Int} fee 钱 * @apiSuccess {String} created_at 时间 * @apiSuccessExample {json} Success-Response: * HTTP/1.1 200 OK * { * code: 0, * msg: "", * data: list:[ * { * uid: 4, * bid: 1, * book_name: "dfsedfertrwet", * fee: 100, * created_at: "2017-12-02 16:24:54" * } * ] * meta: { * total: 1, * per_page: 15, * current_page: 1, * last_page: 1, * next_page_url: "", * prev_page_url: "" * } * } * } */ public function bookOrderList(Request $request) { $page_size = $request->input('page_size', 15); $book_order = BookOrderService::getRecord($this->uid, $page_size); return response()->pagination(new BookOrderTransformer(), $book_order); } /** * @apiVersion 1.0.0 * @apiDescription 章节消费记录 * @api {get} order/chapterOrderList 章节消费记录 * @apiHeader {String} [Authorization] token * @apiGroup Order * @apiName chapterOrderList * @apiParam {String} [page_size] 分页大小 * @apiParam {String} [page] 页码 * @apiSuccess {int} code 状态码 * @apiSuccess {String} msg 信息 * @apiSuccess {object} data 结果集 * @apiSuccess {Int} uid uid * @apiSuccess {Int} bid bid * @apiSuccess {Int} cid cid * @apiSuccess {Int} chapter_name 章节名 * @apiSuccess {Int} book_name 书名 * @apiSuccess {Int} fee 钱 * @apiSuccess {String} created_at 时间 * @apiSuccessExample {json} Success-Response: * HTTP/1.1 200 OK * { * code: 0, * msg: "", * data: list:[ * { * uid: 4, * bid: 1, * cid: 1, * chapter_name: "sdfsd", * book_name: "dfsedfertrwet", * fee: 100, * created_at: "2017-12-02 16:24:54" * } * ] * meta: { * total: 1, * per_page: 15, * current_page: 1, * last_page: 1, * next_page_url: "", * prev_page_url: "" * } * } */ public function chapterOrderList(Request $request) { $chapter_model = new ChapterOrderService(); $page_size = $request->input('page_size', 15); $chapter_order = $chapter_model->getByUid($this->uid, $page_size); foreach ($chapter_order as $item) { if ($item->fee == 0) { $result = AdVisitStatService::getInfoV2($this->uid, $item->cid, ['UNLOCK', 'UNLOCK_2']); $item->fee = '解锁'; } } return response()->pagination(new ChapterOrderTransformer(), $chapter_order); } /** * @apiVersion 1.0.0 * @apiDescription 充值记录 * @api {get} order/chargeRecordLists 充值记录 * @apiParam {String} [token] token * @apiHeader {String} [Authorization] token 两个token任选其一 * @apiGroup Order * @apiName chargeRecordLists * @apiParam {String} [page_size] 分页大小 * @apiParam {String} [page] 页码 * @apiSuccess {int} code 状态码 * @apiSuccess {String} msg 信息 * @apiSuccess {object} data 结果集 * @apiSuccess {String} data.price 价格 * @apiSuccess {String} data.status 状态 * @apiSuccess {String} data.trade_no 订单号 * @apiSuccess {String} data.created_at 时间 * @apiSuccessExample {json} Success-Response: * HTTP/1.1 200 OK * { * code: 0, * msg: "", * data: { * list: [ * { * id: 134, * price: "1.00", * status: "PAID", * trade_no: "201712021915481585670623626232", * created_at: "2017-12-02 19:15:56" * } * ], * meta: { * total: 1, * per_page: 15, * current_page: 1, * last_page: 1, * next_page_url: "", * prev_page_url: "" * } * } * } */ public function chargeRecordLists(Request $request) { $page_size = $request->input('page_size', 15); $res = OrderService::getOrderList($this->uid, $page_size); return response()->pagination(new ChargeListTransformer(), $res); } //订单是否成功 public function isSuccess(Request $request) { $order = $request->input('order'); $order_info = OrderService::getByTradeNo($order); if ($order_info && $order_info->status == 'PAID') { return response()->success(); } return response()->error('QAPP_SYS_ERROR'); } private function getPayParams(Request $request) { $product_id = $request->get('product_id', 0); $send_order_id = $request->get('send_order_id', 0); if (!$product_id) { return false; } $bid = $request->get('bid', 0); if ($bid) { $from_bid = BookService::decodeBidStatic($bid); } $trade_no = date("YmdHis") . hexdec(uniqid()); $product_info = ProductService::getProductSingle($product_id); $uid = $this->uid; $distribution_channel_id = $this->distribution_channel_id; $price = $product_info->price * 100; if (in_array($uid, explode(',', env('TEST_UID')))) { $price = 1; } $from_type = 'QuickApp'; if ($product_info->type == 'YEAR_ORDER') { $order_type = 'YEAR'; } elseif ($product_info->type == 'BOOK_ORDER') { $order_type = 'BOOK'; } elseif ($product_info->type == 'TICKET_RECHARGE') { $order_type = 'RECHARGE'; } else { $order_type = ''; } $create_ip = _getIp(); return compact( 'distribution_channel_id', 'uid', 'product_id', 'price', 'trade_no', 'create_ip', 'send_order_id', 'from_bid', 'from_type', 'order_type' ); } /** * @apiVersion 1.0.0 * @apiDescription 支付 * @api {get} goToPay 微信APP支付 * @apiGroup pay * @apiName wxindex * @apiParam {Int} product_id product_id * @apiParam {Int} send_order_id send_order_id * @apiParam {String} bid bid * @apiHeader {String} [Authorization] token * @apiSuccess {int} code 状态码 * @apiSuccess {String} msg 信息 * @apiSuccess {Object} data 信息 * @apiSuccess {Object} data.appId 唤起支付的appId * @apiSuccess {Object} data.mch_id 唤起支付的mch_id * @apiSuccess {Object} data.nonce_str 唤起支付的nonce_str * @apiSuccess {Object} data.prepay_id 唤起支付的prepay_id * @apiSuccess {Object} data.sign 唤起支付的sign * @apiSuccess {Object} data.trade_type 唤起支付trade_type * @apiSuccessExample {json} Success-Response: * HTTP/1.1 200 OK * { * code: 0, * msg: "", * data: { * * } */ function wxIndex(Request $request) { if ($params = $this->getPayParams($request)) { $params['pay_merchant_source'] = 'OFFICIALPAY_QAPP_APP'; } else { return response()->error('QAPP_PARAM_ERROR'); } $app = OrderArousePayFactory::wx($this->uid); // 微信支付参数 $params['trade_type'] = 'APP'; //交易类型 $result = $app->handle($params); if ($result) { return response()->success($result); } else { return response()->error('APP_CREATE_WECHAT_ORDER_FAIL'); } } /** * @apiVersion 1.0.0 * @apiDescription 微信H5支付 * @api {get} goToH5Pay 微信H5支付 * @apiGroup pay * @apiName wxindex * @apiParam {Int} product_id product_id * @apiParam {Int} send_order_id send_order_id * @apiParam {String} bid bid * @apiHeader {String} [Authorization] token * @apiSuccess {int} code 状态码 * @apiSuccess {String} msg 信息 * @apiSuccess {Object} data 信息 * @apiSuccess {Object} data.appId 唤起支付的appId * @apiSuccess {Object} data.mch_id 唤起支付的mch_id * @apiSuccess {Object} data.nonce_str 唤起支付的nonce_str * @apiSuccess {Object} data.prepay_id 唤起支付的prepay_id * @apiSuccess {Object} data.sign 唤起支付的sign * @apiSuccess {Object} data.trade_type 唤起支付trade_type * @apiSuccess {Object} data.mweb_url 唤起支付mweb_url * @apiSuccessExample {json} Success-Response: * HTTP/1.1 200 OK * { * code: 0, * msg: "", * data: { * * } */ function wxH5Index(Request $request) { if ($params = $this->getPayParams($request)) { $params['pay_merchant_source'] = 'OFFICIALPAY_QAPP_H5'; } else { return response()->error('QAPP_PARAM_ERROR'); } $app = OrderArousePayFactory::wx($this->uid); // 微信支付参数 $params['trade_type'] = 'MWEB'; //交易类型 $result = $app->handle($params); if ($result) { return response()->success($result); } else { return response()->error('APP_CREATE_WECHAT_ORDER_FAIL'); } } /** * @apiVersion 1.0.0 * @apiDescription 支付宝APP支付 * @api {get} goToAliPay 支付宝APP支付 * @apiGroup pay * @apiName aliIndex * @apiParam {Int} product_id product_id * @apiParam {Int} send_order_id send_order_id * @apiParam {String} bid bid * @apiHeader {String} [Authorization] token * @apiSuccessExample {json} Success-Response: * HTTP/1.1 200 OK * { * code: 0, * msg: "", * data:"" * */ public function aliIndex(Request $request) { if ($params = $this->getPayParams($request)) { $params['pay_merchant_source'] = 'QuickAppALiPay'; $params['type'] = 'App'; } else { return response()->error('QAPP_PARAM_ERROR'); } $app = OrderArousePayFactory::ali($this->uid); return response()->success($app->handle($params)); } /** * @apiVersion 1.0.0 * @apiDescription 订单查询 * @api {get} checkOrder 订单查询 * @apiGroup pay * @apiName checkOrder * @apiParam {String} [token] token * @apiHeader {String} [Authorization] token 两个token任选其一 * @apiParam {String} order order * @apiSuccess {int} code 状态码 * @apiSuccess {String} msg 信息 * @apiSuccess {Object} data 信息 * @apiSuccessExample {json} Success-Response: * HTTP/1.1 200 OK * { * code: 0, * msg: "", * data: { * * } */ public function checkOrder(Request $request) { $order = $request->input('order', ''); $i = 0; $uid = $this->uid; while ($i <= 10) { $order_info = OrderService::getByTradeNo($order); if (!$order_info) { return response()->error('QAPP_SYS_ERROR'); break; } if (isset($order_info->status) && $order_info->status == 'PAID') { $data['balance'] = 0; $user = UserService::getById($uid); if ($user) { $data['balance'] = $user->balance; } return response()->success($data); } sleep(1); $i++; } return response()->error('QAPP_SYS_ERROR'); } /** * 官方微信回调 */ function wxback(Request $request) { $param = $request->except('_url'); myLog('wxpay')->info($param); if (isset($param['attach'])) { $pay_merchant_name = $param['attach']; $config = PayMerchantService::getPayConfigByNameStatic($pay_merchant_name); $app = PayFactory::official($config); $response = $app->notify()->handleNotify(function ($notify, $successful) { if (!$successful) { return 'fail'; } if (OrderPaySuccess::handle($notify->out_trade_no, $notify->transaction_id)) { return true; } else { return 'fail'; } }); return $response; } else { return 'fail'; } } /** * 支付宝支付回调 */ function aliback(Request $request) { $param = $request->except('_url'); $app = PayFactory::aliPay(); myLog('alipay')->info($param); if ($app->notify($param)) { if (OrderPaySuccess::handle($param['out_trade_no'], $param['trade_no'])) { return response('success'); } else { return response('fail'); } return response('success'); } else { return response('fail'); } } }