getShowList(); return app('json')->success([ 'list' => $list ]); } /** * 模板订单提交[第一步] * @param Request $request */ public function createOrder(Request $request) { [$price, $pay_type] = UtilService::getMore([ ['price', 0], ['pay_type', '', 'empty', '请选择支付方式'], ], $request, true); if (!in_array($pay_type, ["wxpay"])) { return app('json')->fail('不支持该支付方式!'); } $weixinConfig = (new SysModel)->getWeixinConfig(); // if(empty($weixinConfig)){ // return app('json')->fail('支付配置为空!'); // } $uid = $request->user['uid']; // 防重复提交缓存 $redis = Cache::store('redis'); $key = 'recharge_order_sub_' . $request->user['uid']; $bool = $redis->handler()->exists($key); if ($bool) { return app('json')->fail('请勿重复操作,请稍后再试!'); } $redis->set($key, 1, 5); // 5秒缓存 // 获取系统积分转换比例 $sys = (new SysModel())->where("id", 1)->find(); $pointsTransformation = isset($sys['points_transformation']) ? intval($sys['points_transformation']) : 10; // 获取用户折扣金额(半小时内固定) $cacheKey = 'recharge_discount_' . $request->user['uid']; $discount = $redis->get($cacheKey); if (!$discount) { // 生成随机折扣金额:0.01到1元,保留两位小数 $discount = round(mt_rand(1, 100) / 100, 2); $redis->set($cacheKey, $discount, 1800); // 30分钟缓存 } // $rechargeConfig = new RechargeConfig(); $rechargeOrder = new RechargeOrder(); if ($price <= 0) { return app('json')->fail('充值金额必须大于0'); } // 计算积分:根据系统比例计算 $integral = intval($price * $pointsTransformation); $giveIntegral = 0; // 计算实际支付金额(原价减去折扣,最低0.01元) $payMoney = max($price - $discount, 0.01); $payMoney = $payMoney <= 0 ? 0 : $payMoney; $nowTime = time(); // 主订单数据 $save = []; $save['uid'] = $request->user['uid']; $save['order_sn'] = $rechargeOrder->mkOrderSn($uid); $save['recharge_id'] = 0; $save['price'] = $price; $save['integral'] = $integral; $save['give_integral'] = 0; $save['total_integral'] = $integral + $giveIntegral; $save['pay_type'] = $pay_type; $save['discount_amount'] = $discount; $save['paid'] = $payMoney <= 0 ? 1 : 0; $save['pay_time'] = $payMoney <= 0 ? time() : 0; $save['status'] = $payMoney <= 0 ? 1 : 0; $save['add_time'] = $nowTime; $save['update_time'] = $nowTime; $save['order_type'] = 1; $save['remark'] = '用户充值'; try { Db::startTrans(); $o_id = (new RechargeOrder())->insertGetId($save); if (empty($o_id)) { return app('json')->fail("订单提交失败"); } //微信支付 if (empty($request->user['openid'])) { Db::rollback(); return app('json')->fail('用户还未绑定微信!'); } //清理之前支付凭证 || 防止重复购买 $payTrade = (new PayTradeModel) ->where("uid", $request->user["uid"]) ->where("o_id", $o_id) ->where("order_type", 1) ->where("type", "temp") ->where("status", 0) ->where("time", "<", time() - 7 * 24 * 60 * 60) ->select() ->toArray(); $wxpay = new wxpayApi(); // $wxpay = new wxpayApi($weixinConfig); foreach ($payTrade as $v) { // if($v['pay_type'] == 'wxpay') { // $result = $wxpay->closeOrder($v['pay_no']); // } (new PayTradeModel)->where("id", $v['id'])->where("status", 0)->delete(); } $mtime = microtime(true) * 10000; $payOn = "T" . date("Ymd") . $mtime . rand(100, 999) . $request->user['uid']; $out_trade_no = ""; $payType = $save["pay_type"]; //添加交易记录 $trade = [ 'uid' => $request->user['uid'], 'o_id' => $o_id, 'order_id' => $save["order_id"], 'pay_no' => $payOn, 'out_trade_no' => empty($out_trade_no) ? $payOn : $out_trade_no, 'pay_type' => $payType, 'money' => $payMoney, 'type' => 'recharge', 'd_json' => serialize(['orderId' => $save["order_id"], "give_score" => 0]), 'time' => time(), 'status' => 0, ]; $r = (new PayTradeModel)->insert($trade); if (!$r) { Db::rollback(); return app('json')->fail('支付信息获取失败!'); } $clictip = get_client_ip(); if (empty($clictip)) { $clictip = $request->ip(); } $payData = $wxpay->wxmpPay([ 'body' => "微信小程序充值积分", 'out_trade_no' => $payOn, 'total' => $payMoney, 'openid' => $request->user['openid'], 'payer_client_ip' => $clictip, ]); if (empty($payData)) { Db::rollback(); return app('json')->fail($wxpay->errorMsg); } Db::commit(); $redis->delete($key); return app('json')->success([ 'jsApiParameters' => $payData, 'pay_no' => $payOn, 'order_id' => $save["order_id"], "status" => $save['status'], "money" => $payMoney, ]); } catch (DbException $db) { Db::rollback(); return app('json')->fail("充值订单生成失败"); } } /** * 创建充值订单 * @param Request $request * @return mixed */ // public function createOrder(Request $request) // { // $post = UtilService::getMore([ // ['recharge_id', 0], // ['price', 0], // ['pay_type', 'wxpay'] // ], $request); // // $uid = $request->uid; // if (!$uid) { // return app('json')->fail('用户未登录'); // } // // // 验证支付方式 // if (!in_array($post['pay_type'], ["wxpay", "balance"])) { // return app('json')->fail('不支持该支付方式!'); // } // // // 防重复提交缓存 // $redis = Cache::store('redis'); // $key = 'recharge_order_sub_' . $uid; // $bool = $redis->handler()->exists($key); // if ($bool) { // return app('json')->fail('请勿重复操作,请稍后再试!'); // } // $redis->set($key, 1, 5); // 5秒缓存 // // // 获取系统积分转换比例 // $sys = (new SysModel())->where("id", 1)->find(); // $pointsTransformation = isset($sys['points_transformation']) ? intval($sys['points_transformation']) : 10; // // // 获取用户折扣金额(半小时内固定) // $cacheKey = 'recharge_discount_' . $uid; // $discount = $redis->get($cacheKey); // if (!$discount) { // // 生成随机折扣金额:0.01到1元,保留两位小数 // $discount = round(mt_rand(1, 100) / 100, 2); // $redis->set($cacheKey, $discount, 1800); // 30分钟缓存 // } // // $rechargeConfig = new RechargeConfig(); // $rechargeOrder = new RechargeOrder(); // // $integral = 0; // $giveIntegral = 0; // // // 如果是选择充值套餐 // if ($post['recharge_id'] > 0) { // $config = $rechargeConfig->getById($post['recharge_id']); // if (!$config || $config['is_show'] != 1) { // return app('json')->fail('充值套餐不存在或已禁用'); // } // $price = $config['price']; // $integral = $config['integral']; // $giveIntegral = $config['give_integral']; // } else { // // 自定义金额充值 // $price = $post['price']; // if ($price <= 0) { // return app('json')->fail('充值金额必须大于0'); // } // // 计算积分:根据系统比例计算 // $integral = intval($price * $pointsTransformation); // $giveIntegral = 0; // } // // // 计算实际支付金额(原价减去折扣,最低0.01元) // $payMoney = max($price - $discount, 0.01); // $payMoney = $payMoney <= 0 ? 0 : $payMoney; // $nowTime = time(); // // // 获取用户余额和openid // $userModel = new User(); // $userInfo = $userModel->where('uid', $uid)->field('money,openid')->find(); // if (!$userInfo) { // return app('json')->fail('用户不存在'); // } // // // 余额支付验证 // if ($post['pay_type'] == "balance" && $payMoney > $userInfo['money']) { // return app('json')->fail("当前余额不足"); // } // // // 主订单数据 // $save = []; // $save['uid'] = $uid; // $save['order_sn'] = $rechargeOrder->mkOrderSn($uid); // $save['recharge_id'] = $post['recharge_id']; // $save['price'] = $price; // $save['integral'] = $integral; // $save['give_integral'] = $giveIntegral; // $save['total_integral'] = $integral + $giveIntegral; // $save['pay_type'] = $post['pay_type']; // $save['discount_amount'] = $discount; // $save['paid'] = $payMoney <= 0 ? 1 : 0; // $save['pay_time'] = $payMoney <= 0 ? time() : 0; // $save['status'] = $payMoney <= 0 ? 1 : 0; // $save['add_time'] = $nowTime; // $save['update_time'] = $nowTime; // $save['remark'] = '用户充值'; // // // 余额实时支付 // if ($post['pay_type'] == "balance") { // $save['paid'] = 1; // $save['pay_time'] = time(); // $save['status'] = 1; // } // // try { // Db::startTrans(); // $o_id = (new RechargeOrder)->insertGetId($save); // if (empty($o_id)) { // Db::rollback(); // $redis->delete($key); // return app('json')->fail("订单提交失败"); // } // // // 不需要支付 // if ($payMoney <= 0 && $save['paid'] == 1) { // // 增加用户积分 // $this->addUserIntegral($uid, $save['total_integral'], $save['order_sn'], $save['price'], $o_id); // Db::commit(); // $redis->delete($key); // return app("json")->success([ // 'order_id' => $save['order_sn'], // 'pay_no' => '', // 'price' => $price, // 'money' => $payMoney, // 'discount_amount' => $discount, // 'integral' => $integral, // 'give_integral' => $giveIntegral, // 'total_integral' => $save['total_integral'], // 'pay_type' => $post['pay_type'], // 'status' => $save['paid'] // ]); // } // // // 余额支付 // if ($post['pay_type'] == "balance") { // // 修改用户余额 // $userDetail = new \app\model\api\UserDetail(); // $res = $userDetail->balancePay($uid, $payMoney, "recharge_pay", ["to_id" => $o_id]); // if (!$res) { // Db::rollback(); // $redis->delete($key); // return app('json')->fail("余额支付失败"); // } // // 增加用户积分 // $this->addUserIntegral($uid, $save['total_integral'], $save['order_sn'], $save['price'], $o_id); // Db::commit(); // $redis->delete($key); // return app("json")->success([ // 'order_id' => $save['order_sn'], // 'pay_no' => '', // 'price' => $price, // 'money' => $payMoney, // 'discount_amount' => $discount, // 'integral' => $integral, // 'give_integral' => $giveIntegral, // 'total_integral' => $save['total_integral'], // 'pay_type' => $post['pay_type'], // 'status' => $save['paid'] // ]); // } // // // 微信支付 // if (empty($userInfo['openid'])) { // Db::rollback(); // $redis->delete($key); // return app('json')->fail('用户还未绑定微信!'); // } // // // 清理之前支付凭证 || 防止重复购买 // $payTrade = (new \app\model\api\PayTrade()) // ->where("uid", $uid) // ->where("o_id", $o_id) // ->where("type", "recharge") // ->where("status", 0) // ->where("time", "<", time() - 7 * 24 * 60 * 60) // ->select() // ->toArray(); // $wxpay = new wxpayApi(); // // foreach ($payTrade as $v) { // (new \app\model\api\PayTrade())->where("id", $v['id'])->where("status", 0)->delete(); // } // // $mtime = microtime(true) * 10000; // $payOn = "R" . date("Ymd") . $mtime . rand(100, 999) . $uid; // $out_trade_no = ""; // $payType = $save["pay_type"]; // // // 添加交易记录 // $trade = [ // 'uid' => $uid, // 'o_id' => $o_id, // 'order_id' => $save["order_sn"], // 'pay_no' => $payOn, // 'out_trade_no' => empty($out_trade_no) ? $payOn : $out_trade_no, // 'pay_type' => $payType, // 'money' => $payMoney, // 'type' => 'recharge', // 'd_json' => serialize([ // 'order_sn' => $save["order_sn"], // 'recharge_id' => $post['recharge_id'], // 'integral' => $integral, // 'give_integral' => $giveIntegral, // 'total_integral' => $integral + $giveIntegral, // 'discount_amount' => $discount // ]), // 'time' => time(), // 'status' => 0, // ]; // $r = (new \app\model\api\PayTrade())->insert($trade); // if (!$r) { // Db::rollback(); // $redis->delete($key); // return app('json')->fail('支付信息获取失败!'); // } // // $clictip = get_client_ip(); // if (empty($clictip)) { // $clictip = $request->ip(); // } // // $payData = $wxpay->wxmpPay([ // 'body' => "充值积分", // 'out_trade_no' => $payOn, // 'total' => $payMoney, // 'openid' => $userInfo['openid'], // 'payer_client_ip' => $clictip, // ]); // // if (empty($payData)) { // Db::rollback(); // $redis->delete($key); // return app('json')->fail($wxpay->errorMsg); // } // // Db::commit(); // $redis->delete($key); // return app('json')->success([ // 'jsApiParameters' => $payData, // 'pay_no' => $payOn, // 'order_id' => $save["order_sn"], // "status" => $save['paid'], // "money" => $payMoney, // 'price' => $price, // 'discount_amount' => $discount, // 'integral' => $integral, // 'give_integral' => $giveIntegral, // 'total_integral' => $save['total_integral'], // 'pay_type' => $post['pay_type'] // ]); // } catch (\think\db\exception\DbException $db) { // Db::rollback(); // $redis->delete($key); // return app('json')->fail("订单生成失败"); // } // } /** * 充值支付 * @param Request $request * @return mixed */ public function pay(Request $request) { $post = UtilService::getMore([ ['order_sn', ''] ], $request); $uid = $request->uid; if (!$uid) { return app('json')->fail('用户未登录'); } $rechargeOrder = new RechargeOrder(); $orderInfo = $rechargeOrder->getByOrderSn($post['order_sn']); if (!$orderInfo) { return app('json')->fail('订单不存在'); } if ($orderInfo['uid'] != $uid) { return app('json')->fail('订单不属于当前用户'); } if ($orderInfo['paid'] == 1) { return app('json')->fail('订单已支付'); } if ($orderInfo['status'] == -1) { return app('json')->fail('订单已关闭'); } $payType = $orderInfo['pay_type']; $price = $orderInfo['price']; // 调用支付接口 if ($payType == 'wxpay') { // 微信支付 $wxpay = new wxpayApi(); $payData = $wxpay->pay($price, $orderInfo['order_sn'], '充值积分', $uid); if (!$payData) { return app('json')->fail('支付失败'); } return app('json')->success([ 'jsApiParameters' => $payData, 'order_id' => $orderInfo['order_sn'] ]); } elseif ($payType == 'alipay') { // 支付宝支付(需要根据项目实际情况实现) return app('json')->fail('支付宝支付暂未开通'); } else { return app('json')->fail('支付方式不支持'); } } /** * 充值订单列表 * @param Request $request * @return mixed */ public function orderList(Request $request) { $post = UtilService::getMore([ ['page', 1], ['pageSize', 20], ['status', ''], ['paid', ''] ], $request); $uid = $request->uid; if (!$uid) { return app('json')->fail('用户未登录'); } $where = []; if (!empty($post['status'])) { $where['status'] = $post['status']; } if (!empty($post['paid'])) { $where['paid'] = $post['paid']; } $rechargeOrder = new RechargeOrder(); $list = $rechargeOrder->getUserList($uid, $where, '*', $post['page'], $post['pageSize']); return app('json')->success([ 'list' => $list[1], 'total' => $list[0], 'page' => $post['page'], 'pageSize' => $post['pageSize'] ]); } /** * 充值订单详情 * @param Request $request * @return mixed */ public function orderDetail(Request $request) { $post = UtilService::getMore([ ['order_sn', ''] ], $request); $uid = $request->uid; if (!$uid) { return app('json')->fail('用户未登录'); } $rechargeOrder = new RechargeOrder(); $orderInfo = $rechargeOrder->getByOrderSn($post['order_sn']); if (!$orderInfo) { return app('json')->fail('订单不存在'); } if ($orderInfo['uid'] != $uid) { return app('json')->fail('订单不属于当前用户'); } return app('json')->success($orderInfo); } /** * 增加用户积分(内部调用) * @param int $uid 用户ID * @param int $totalIntegral 总积分 * @param string $orderSn 订单号 * @param float $price 充值金额 * @param int $orderId 订单ID * @return bool */ private function addUserIntegral($uid, $totalIntegral, $orderSn, $price, $orderId) { $userModel = new User(); $user = $userModel->where('uid', $uid)->find(); if ($user) { // 更新用户积分和累计充值金额 $userModel->where('uid', $uid)->inc('score', $totalIntegral)->inc('score_in', $totalIntegral)->inc('total_recharge', $price)->update(); // 记录积分明细 $scoreDetail = new UserScoreDetail(); $scoreDetail->incomeScore($uid, $totalIntegral, $orderSn, 'income_score', [ 'o_id' => $orderId ], $orderId); } // 清除用户折扣缓存,以便下次充值生成新的折扣金额 Cache::store('redis')->delete('recharge_discount_' . $uid); return true; } /** * 充值成功回调处理(内部调用) * @param string $orderSn 订单号 * @param string $paySn 支付流水号 * @param string $payJson 支付返回信息 * @return bool */ public function paySuccess($orderSn, $paySn, $payJson = '') { $rechargeOrder = new RechargeOrder(); $orderInfo = $rechargeOrder->getByOrderSn($orderSn); if (!$orderInfo) { return false; } // 更新订单支付状态 $updateResult = $rechargeOrder->updatePayStatus($orderSn, $paySn, $payJson); if (!$updateResult) { return false; } // 增加用户积分 $this->addUserIntegral($orderInfo['uid'], $orderInfo['total_integral'], $orderSn, $orderInfo['price'], $orderInfo['id']); return true; } }