run('notify'); } //订单列表 public function lists() { $type = $this->request->get('type', 'all'); $order_list = OrderLogic::getOrderList($this->user_id, $type, $this->page_no, $this->page_size); $this->_success('获取成功', $order_list); } public function stafflist() { $type = $this->request->get('type', 'all'); $order_list = OrderLogic::stafflist($this->user_id, $type, $this->page_no, $this->page_size); $this->_success('获取成功', $order_list); } //员工订单详情页面 public function numberlist() { $type = $this->request->get('type', 'all'); $tiem = $this->request->get(); if (isset($tiem['id'])) { $order_list = OrderLogic::timelist($this->user_id, $type, $tiem, $this->page_no, $this->page_size); $this->_success('获取成功', $order_list); } else { $order_list = OrderLogic::numberlist($this->user_id, $type, $this->page_no, $this->page_size); $this->_success('获取成功', $order_list); } } //员工服务订单列表 //下单接口 public function buy() { $post = $this->request->post(); $post['user_id'] = $this->user_id; $post['client'] = $this->client; // $openid = 'oehgp4zzyK34d3TgnXD1ytpeNRjI'; // //发送下单成功通知 // $template = [ // 'touser'=>$openid, // 'template_id'=>'qTmpP2ZnGMpgAFgNsmcVMfTjCeSE7GXEQQaFTUERAuU', // 'page'=>'',//点击模板消息 打开小程序页面 // 'data'=>[ // 'thing2'=>['value'=>'擦玻璃服务'], // 'amount8'=>['value'=>'金额:2元'], // 'time10'=>['value'=>date('Y-m-d H:i',time())] // ] // ]; // $r = send_mini_template($template); $check = $this->validate($post, 'app\api\validate\Order.buy'); if (true !== $check) { $this->_error($check); } $action = $post['action']; $info = OrderLogic::info($post, $this->user_id); if ($info['code'] == 0) { $this->_error($info['msg']); } if ($action == 'info') { $this->_success('', $info['data']); } if ($this->client != Client_::pc && empty($post['pay_way'])) { $this->_error('请联系管理员配置支付方式'); } $order = OrderLogic::add($this->user_id, $info['data'], $post); return $order; } //订单详情 public function detail() { $order_id = $this->request->get('id'); if (!$order_id) { $this->_error('请选择订单'); } $order_detail = OrderLogic::getOrderDetail($order_id, $this->user_id); if (!$order_detail) { $this->_error('订单不存在了!', ''); } $this->_success('获取成功', $order_detail); } //取消订单 public function cancel() { $order_id = $this->request->post('id'); if (empty($order_id)) { $this->_error('参数错误'); } return OrderLogic::cancel($order_id, $this->user_id); } //删除订单 public function del() { $order_id = $this->request->post('id'); if (empty($order_id)) { $this->_error('参数错误'); } return OrderLogic::del($order_id, $this->user_id); } //确认订单 public function confirm() { $order_id = $this->request->post('id'); if (empty($order_id)) { $this->_error('参数错误'); } return OrderLogic::confirm($order_id, $this->user_id); } public function orderTraces() { $order_id = $this->request->get('id'); $tips = '参数错误'; if ($order_id) { $traces = OrderLogic::orderTraces($order_id, $this->user_id); if ($traces) { $this->_success('获取成功', $traces); } $tips = '暂无物流信息'; } $this->_error($tips); } public function Get_Chinese_WeekDay($Join_Date) { $WeekDay = date('w', strtotime($Join_Date)); $WeekList = array('日', '一', '二', '三', '四', '五', '六'); return '星期' . $WeekList[$WeekDay]; } public function get3day() { $goods_id = $this->request->post('id'); $order = Db::name('order')->where('id', $goods_id)->find(); //获取到订单的信息 $goods = Db::name('goods')->where('id', $order['goods_id'])->find(); //获取到商品的信息 // $staff=Db::name('staff')->where('goods_id',$goods['brand_id'])->select(); //查询到所有的保洁师傅 // dump($staff);die; $days = []; $current = date('Y-m-d'); for ($i = 1; $i <= 3; $i++) { $current = date("Y-m-d", strtotime($current . "+1 day")); $days[] = $current; } $data = []; foreach ($days as $k => $v) { $start = strtotime($v); //开始时间 $end = strtotime($v . ' 23:59:59'); //结束时间 //统计这个时间请假的用户的数据 $orders = Db::name('order_exe')->where('addtime', 1)->where('autotime', '>=', $start)->where('autotime', '<=', $end)->whereNotNull('staff_id')->field('staff_id')->group('staff_id')->select(); //查询有订单的保洁师傅 $oneDimensionalArray = array_column($orders, 'staff_id'); // 根据自己的表格字段名修改'字段名'部分 $lent = Db::name('leave')->where('addtime', 1)->where('time', '>=', $start)->where('time', '<=', $end)->whereNotNull('user_id')->field('user_id')->group('user_id')->select(); $lentuser = array_column($lent, 'user_id'); //判断上午 $numbersw = Db::name('staff') ->where('onwork', 1) ->where('goods_id', $goods['brand_id']) ->whereNotIn('id', $oneDimensionalArray) // $array为要比较的数组 ->whereNotIn('id', $lentuser) // $array为要比较的数组 ->count(); //获取到请假的人数 $order_numbersw = Db::name('order_exe')->where('autotime', '>=', $start)->where('autotime', '<=', $end)->where('staff_id', 0)->where('addtime', 1)->count();// 没有派单的保洁师 $numbersw = $numbersw - $order_numbersw; //统计这个时间请假的用户的数据 $ordersxw = Db::name('order_exe')->where('addtime', 2)->where('autotime', '>=', $start)->where('autotime', '<=', $end)->whereNotNull('staff_id')->field('staff_id')->group('staff_id')->select(); //查询有订单的保洁师傅 $oneDimensionalArrayxw = array_column($ordersxw, 'staff_id'); // 根据自己的表格字段名修改'字段名'部分 $lentxw = Db::name('leave')->where('addtime', 2)->where('time', '>=', $start)->where('time', '<=', $end)->whereNotNull('user_id')->field('user_id')->group('user_id')->select(); $lentuserxw = array_column($lentxw, 'user_id'); //判断下午 $numberxw = Db::name('staff') ->where('onwork', 1) ->whereNotIn('id', $oneDimensionalArrayxw) // $array为要比较的数组 ->where('goods_id', $goods['brand_id']) ->whereNotIn('id', $lentuserxw) // $array为要比较的数组 ->count(); //获取到请假的人数 $order_numberxw = Db::name('order_exe')->where('autotime', '>=', $start)->where('autotime', '<=', $end)->where('staff_id', 0)->where('addtime', 2)->count();// 没有派单的保洁师 $numberxw = $numberxw - $order_numberxw; if ($numbersw > 0) { $coied = false; } else { $coied = true; } if ($numberxw > 0) { $coiedxw = false; } else { $coiedxw = true; } $data[] = [ 'date' => $v, 'week' => $this->Get_Chinese_WeekDay($v), 'hourLists' => [ ['hour' => "上午", 'select' => false, 'disabled' => $coied, 'selectDay' => $v, 'staffnumber' => $numbersw], ['hour' => '下午', 'select' => false, 'disabled' => $coiedxw, 'selectDay' => $v, 'staffnumber' => $numberxw], ] ]; } $data[0]['select'] = true; $this->_success('获取成功', $data); } public function getday() { $post = $this->request->post(); $order = Db::name('order')->where('id', $post['data']['id'])->find(); //获取到订单的信息 $goods = Db::name('goods')->where('id', $order['goods_id'])->find(); //获取到商品的信息 $day = $post['data']['day']; $start = strtotime($day); $end = strtotime($day . ' 23:59:59'); //统计这个时间请假的用户的数据 $orders = Db::name('order_exe')->where('addtime', 1)->where('autotime', '>=', $start)->where('autotime', '<=', $end)->whereNotNull('staff_id')->field('staff_id')->group('staff_id')->select(); //查询有订单的保洁师傅 $oneDimensionalArray = array_column($orders, 'staff_id'); // 根据自己的表格字段名修改'字段名'部分 $lent = Db::name('leave')->where('addtime', 1)->where('time', '>=', $start)->where('time', '<=', $end)->whereNotNull('user_id')->field('user_id')->group('user_id')->select(); $lentuser = array_column($lent, 'user_id'); $numbersw = Db::name('staff') ->where('onwork', 1) ->where('goods_id', $goods['brand_id']) ->whereNotIn('id', $oneDimensionalArray) // $array为要比较的数组 ->whereNotIn('id', $lentuser) // $array为要比较的数组 ->count(); $order_numbersw = Db::name('order_exe')->where('autotime', '>=', $start)->where('autotime', '<=', $end)->where('staff_id', 0)->where('addtime', 1)->count();// 没有派单的保洁师 $numbersw = $numbersw - $order_numbersw; //统计这个时间请假的用户的数据 $ordersxw = Db::name('order_exe')->where('addtime', 2)->where('autotime', '>=', $start)->where('autotime', '<=', $end)->whereNotNull('staff_id')->field('staff_id')->group('staff_id')->select(); //查询有订单的保洁师傅 $oneDimensionalArrayxw = array_column($ordersxw, 'staff_id'); // 根据自己的表格字段名修改'字段名'部分 $lentxw = Db::name('leave')->where('addtime', 2)->where('time', '>=', $start)->where('time', '<=', $end)->whereNotNull('user_id')->field('user_id')->group('user_id')->select(); $lentuserxw = array_column($lentxw, 'user_id'); //判断下午 $numberxw = Db::name('staff') ->where('onwork', 1) ->whereNotIn('id', $oneDimensionalArrayxw) // $array为要比较的数组 ->whereNotIn('id', $lentuserxw) // $array为要比较的数组 ->where('goods_id', $goods['brand_id']) ->count(); //获取到请假的人数 $order_numberxw = Db::name('order_exe')->where('autotime', '>=', $start)->where('autotime', '<=', $end)->where('staff_id', 0)->where('addtime', 2)->count();// 没有派单的保洁师 $numberxw = $numberxw - $order_numberxw; if ($numbersw > 0) { $coied = false; } else { $coied = true; } if ($numberxw > 0) { $coiedxw = false; } else { $coiedxw = true; } $data[] = [ 'date' => $day, 'week' => $this->Get_Chinese_WeekDay($day), 'hourLists' => [ ['hour' => '上午', 'select' => false, 'disabled' => $coied, 'selectDay' => $day, 'staffnumber' => $numbersw], ['hour' => '下午', 'select' => false, 'disabled' => $coiedxw, 'selectDay' => $day, 'staffnumber' => $numberxw], ] ]; $data[0]['select'] = true; $this->_success('获取成功', $data); } public function sendgzhmsg($orderid = '') { $uid = $this->user_id; // $uid = 366; $openids = Db::name('user_auth')->where('user_id', $uid)->find(); //获取用户的ID $adder = Db::name('user_address')->where('user_id', $uid)->find(); // $openid = 'o_XDv5_Cq72XDOx1qvzq2kcaOYWA'; $openid = $openids['openid'] ?? null; if (!$openid) { return false; // 未绑定公众号 } $data = [ 'touser' => $openid, 'url' => '', 'template_id' => 'MJBxsfAT18v9fQ8LYK2v1AF4iRkprNp1KPVm1ses64I', //模板id 'data' => [ 'time4' => [ 'value' => date('Y-m-d H:i', time()) ], 'thing1' => [ 'value' => $adder['contact'] ] ] ]; $config = WeChatServer::getOaConfig(); $app = Factory::officialAccount($config); $r = $app->template_message->send($data); return true; } public function shensatff($id) { dump($id); } // public function putday() // { // $post = $this->request->post(); // $sw = $post['data']['hourLists'][0]['select']; // $xw = $post['data']['hourLists'][1]['select']; // $orderid = $post['data']['id']; //传递进来的订单id // $day = $post['data']['date']; // $order = Db::name('order')->where('id', $orderid)->find(); //获取到订单的基本信息 // $goods = Db::name('goods')->where('id', $order['goods_id'])->find(); // if ($order['code'] <= 0) { // $this->_error('订单次数已不足无法预约'); // } // // if ($sw && $xw) { // $code = Db::name('order')->where('id', $orderid)->find(); // if ($code['code'] <= 2) { // return 20; // } else { // $data = [ // 'order_sn' => $order['order_sn'], //订单编号 // 'create_time' => time(), // // 'fworder_sn'=> $post['fworder_sn'], // 'date' => $day, // 'xq' => $this->Get_Chinese_WeekDay($day), // 'type' => 3, // 'status' => 0, // 'addtime' => 1, // 'autotime' => strtotime($day), // ]; // $list = Db::name('order_exe')->data($data)->insert(); // $datas = [ // 'order_sn' => $order['order_sn'], //订单编号 // 'create_time' => time(), // // 'fworder_sn'=> $post['fworder_sn'], // 'date' => $day, // 'xq' => $this->Get_Chinese_WeekDay($day), // 'type' => 3, // 'status' => 0, // 'addtime' => 2, // 'autotime' => strtotime($day), // ]; // $list = Db::name('order_exe')->data($datas)->insert(); // $order = Db::name('order')->where('id', $orderid)->update(['code' => $order['code'] - 2]); //获取到订单的基本信息 // $this->sendgzhmsg($day); // if ($order['admin_id'] != NULL) { // $admin = Db::name('admin')->where('id', $order['admin_id'])->find(); // $openids = Db::name('user_auth')->where('user_id', $admin['user_id'])->find(); //获取用户的ID // //$time=date('Y-m-d',$orders['autotime']); // //$openid = 'o_XDv5_Cq72XDOx1qvzq2kcaOYWA'; // $openid = $openids['openid']; // if ($openid != null) // { // $data = [ // 'touser' => $openid, // 'url' => '', // 'template_id' => '9ESlNoZweXTioNwyaDuSY9fIXCKhnrBi2Gu0Hl8cmAo', //模板id // 'data' => [ // 'keyword1' => [ // 'value' => $order['order_sn'] // ], // 'keyword2' => [ // 'value' => $goods['name'] // ], // 'keyword3' => [ // 'value' => $order['consignee'] // ], // 'keyword4' => [ // 'value' => $order['mobile'] // ], // 'keyword5' => [ // 'value' => $day // ], // // ] // ]; // $config = WeChatServer::getOaConfig(); // $app = Factory::officialAccount($config); // $r = $app->template_message->send($data); // } // } // $this->_success('预约成功,待上门', $list); // // } // } // if ($sw) { // if ($order > 0) { // $data = [ // 'order_sn' => $order['order_sn'], //订单编号 // 'create_time' => time(), // // 'fworder_sn'=> $post['fworder_sn'], // 'date' => $day, // 'xq' => $this->Get_Chinese_WeekDay($day), // 'type' => 3, // 'status' => 0, // 'addtime' => 1, // 'autotime' => strtotime($day), // ]; // $list = Db::name('order_exe')->data($data)->insert(); // // $orderss = Db::name('order')->where('id', $orderid)->update(['code' => $order['code'] - 1]); // //获取到订单的基本信息 // $this->sendgzhmsg($day); // if ($order['admin_id'] != null) { // $admin = Db::name('admin')->where('id', $order['admin_id'])->find(); // $openids = Db::name('user_auth')->where('user_id', $admin['user_id'])->find(); //获取用户的ID // //$time=date('Y-m-d',$orders['autotime']); // //$openid = 'o_XDv5_Cq72XDOx1qvzq2kcaOYWA'; // $openid = $openids['openid']; // if ($openid != null) // { // $data = [ // 'touser' => $openid, // 'url' => '', // 'template_id' => '9ESlNoZweXTioNwyaDuSY9fIXCKhnrBi2Gu0Hl8cmAo', //模板id // 'data' => [ // 'keyword1' => [ // 'value' => $order['order_sn'] // ], // 'keyword2' => [ // 'value' => $goods['name'] // ], // 'keyword3' => [ // 'value' => $order['consignee'] // ], // 'keyword4' => [ // 'value' => $order['mobile'] // ], // 'keyword5' => [ // 'value' => $day . '.8:00-12:00' // ], // // ] // ]; // $config = WeChatServer::getOaConfig(); // $app = Factory::officialAccount($config); // $r = $app->template_message->send($data); // } // } // // // $this->_success('预约成功,待上门', $list); // } else { // return 20; // } // // } // if ($xw) { // if ($order > 0) { // $data = [ // 'order_sn' => $order['order_sn'], //订单编号 // 'create_time' => time(), // // 'fworder_sn'=> $post['fworder_sn'], // 'date' => $day, // 'xq' => $this->Get_Chinese_WeekDay($day), // 'type' => 3, // 'status' => 0, // 'addtime' => 2, // 'autotime' => strtotime($day), // ]; // $list = Db::name('order_exe')->data($data)->insert(); // $order = Db::name('order')->where('id', $orderid)->update(['code' => $order['code'] - 1]); //获取到订单的基本信息 // $this->sendgzhmsg($day); // if ($order['admin_id'] != NULL) { // $admin = Db::name('admin')->where('id', $order['admin_id'])->find(); // $openids = Db::name('user_auth')->where('user_id', $admin['user_id'])->find(); //获取用户的ID // //$time=date('Y-m-d',$orders['autotime']); // //$openid = 'o_XDv5_Cq72XDOx1qvzq2kcaOYWA'; // $openid = $openids['openid']; // if ( $openid != null) // { // //发送预约成功消息 // $data = [ // 'touser' => $openid, // 'url' => '', // 'template_id' => '9ESlNoZweXTioNwyaDuSY9fIXCKhnrBi2Gu0Hl8cmAo', //模板id // 'data' => [ // 'keyword1' => [ // 'value' => $order['order_sn'] // ], // 'keyword2' => [ // 'value' => $goods['name'] // ], // 'keyword3' => [ // 'value' => $order['consignee'] // ], // 'keyword4' => [ // 'value' => $order['mobile'] // ], // 'keyword5' => [ // 'value' => $day . '.14:00-16:00' // ], // // ] // ]; // $config = WeChatServer::getOaConfig(); // $app = Factory::officialAccount($config); // $r = $app->template_message->send($data); // } // } // // $this->_success('预约成功,待上门', $list); // } else { // return 20; // } // } // // } public function putday() { $post = $this->request->post(); $hourLists = $post['data']['hourLists'] ?? []; $orderid = $post['data']['id'] ?? 0; $day = $post['data']['date'] ?? ''; if (!$orderid || !$day || count($hourLists) < 2) { $this->_error('参数错误'); } // 时间段选择 $sw = !empty($hourLists[0]['select']); // 上午 $xw = !empty($hourLists[1]['select']); // 下午 if (!$sw && !$xw) { $this->_error('请选择预约时间段'); } // 获取订单 $order = Db::name('order')->where('id', $orderid)->find(); if (!$order) { $this->_error('订单不存在'); } // 获取商品 $goods = Db::name('goods')->where('id', $order['goods_id'])->find(); // 需要扣的次数 $needCode = ($sw && $xw) ? 2 : 1; if ($order['code'] < $needCode) { $this->_error('订单次数不足,无法预约'); } Db::startTrans(); try { // 上午 if ($sw) { Db::name('order_exe')->insert([ 'order_sn' => $order['order_sn'], 'create_time'=> time(), 'date' => $day, 'xq' => $this->Get_Chinese_WeekDay($day), 'type' => 3, 'status' => 0, 'addtime' => 1, 'autotime' => strtotime($day), 'goods_id' => $goods['id'], ]); } // 下午 if ($xw) { Db::name('order_exe')->insert([ 'order_sn' => $order['order_sn'], 'create_time'=> time(), 'date' => $day, 'xq' => $this->Get_Chinese_WeekDay($day), 'type' => 3, 'status' => 0, 'addtime' => 2, 'autotime' => strtotime($day), 'goods_id' => $goods['id'], ]); } // 扣次数 Db::name('order') ->where('id', $orderid) ->update(['code' => $order['code'] - $needCode]); Db::commit(); } catch (\Exception $e) { Db::rollback(); $this->_error('预约失败,请稍后重试'); } // 公众号通知 $this->sendgzhmsg($day); // 通知管理员 if (!empty($order['admin_id'])) { $admin = Db::name('admin')->where('id', $order['admin_id'])->find(); if ($admin) { $openids = Db::name('user_auth')->where('user_id', $admin['user_id'])->find(); $openid = $openids['openid'] ?? null; if ($openid) { $timeStr = $sw && $xw ? $day : ($sw ? $day . ' 8:00-12:00' : $day . ' 14:00-16:00'); $data = [ 'touser' => $openid, 'url' => '', 'template_id' => '9ESlNoZweXTioNwyaDuSY9fIXCKhnrBi2Gu0Hl8cmAo', 'data' => [ 'keyword1' => ['value' => $order['order_sn']], 'keyword2' => ['value' => $goods['name'] ?? ''], 'keyword3' => ['value' => $order['consignee']], 'keyword4' => ['value' => $order['mobile']], 'keyword5' => ['value' => $timeStr], ] ]; $config = WeChatServer::getOaConfig(); $app = Factory::officialAccount($config); $app->template_message->send($data); } } } $this->_success('预约成功,待上门'); } //保洁师开始接单 public function take() { $order_id = $this->request->post('params'); $order = Db::name('order_exe')->where('id', $order_id)->find(); if ($order['autotime'] - time() > 24 * 3600) { $this->_error('无法接单,未到时间'); } else { $toke = Db::name('order_exe')->where('id', $order_id)->update(['status' => 1]); $this->_success('接单成功'); } } //保洁师开始接单 public function wego() { $order_id = $this->request->post('params'); $toke = Db::name('order_exe')->where('id', $order_id)->update(['status' => 1, 'timeadd' => time(), 'staff_status' => 1]); $this->_success('接单成功'); } //保洁师结束服务 public function ends() { $order_id = $this->request->post('params'); $toke = Db::name('order_exe')->where('id', $order_id)->update(['status' => 2, 'timeout' => time(), 'staff_status' => 1]); $this->_success('接单成功'); } //订单的详情显示 public function orderinfo() { $type = $this->request->post('type', 'all'); $post = $this->request->post(); $order_sn = $post['id']; $order_list = OrderLogic::orderinfo($this->user_id, $type, $order_sn, $this->page_no, $this->page_size); $this->_success('获取成功', $order_list); } //微信的通知 public function wxmassin() { $start = strtotime(date("Y-m-d", strtotime("+1 day"))); $end = $start + 24 * 3600 - 1; $order = Db::name('order_exe')->where('autotime', '>=', $start)->where('autotime', '<=', $end)->where('staff_id', '<>', 0)->select(); foreach ($order as &$orders) { $custom = Db::name('order')->where('order_sn', $orders['order_sn'])->find(); $goods = Db::name('goods')->where('id', $custom['goods_id'])->find(); $user = Db::name('staff')->where('id', $orders['staff_id'])->find(); if ($orders['addtime'] = 1) { $timesw = '上午'; } else { $timesw = '下午'; } // $uid = 366; $openids = Db::name('user_auth')->where('user_id', $user['user_id'])->find(); //获取用户的ID $time = date('Y-m-d', $orders['autotime']); // $openid = 'o_XDv5_Cq72XDOx1qvzq2kcaOYWA'; $openid = $openids['openid']; $data = [ 'touser' => $openid, 'url' => '', 'template_id' => 'YYsFPwTCrPcxi0JA_zg0xnz6uFaVAlobfTGvhQVDglE', //模板id 'data' => [ 'keyword1' => [ 'value' => $goods['name'] ], 'keyword2' => [ 'value' => $time . $timesw ], 'keyword3' => [ 'value' => $custom['address'] ], 'keyword4' => [ 'value' => $custom['consignee'] ], 'keyword5' => [ 'value' => $custom['mobile'] ], ] ]; $config = WeChatServer::getOaConfig(); $app = Factory::officialAccount($config); $r = $app->template_message->send($data); } } public function getpege() { $id = $this->request->get('id'); $date = Db::name('pageweb')->where('id', $id)->find(); $this->_success('获取数据成功', $date); // dump($id); } } class ttPay { private $api_url = 'https://developer.toutiao.com/api/apps/ecpay/v1/'; private $app_id; private $token; private $salt; public function __construct() { $this->app_id = 'tt0523739e9a12236501'; $this->token = '123qazqweeesdflomswwe'; $this->salt = 'ejAuHvbI472euyhb34aVyLD92ll9tgZCqWnMi0tX'; } public function run($action, $order = null) { $action = $action ? $action : 'order'; if (!in_array($action, ['order', 'query', 'refund', 'settle', 'notify', 'set'])) { echo '非法请求'; die; } return $this->$action($order); } //下单 private function order($order) { $data = [ 'out_order_no' => $order['order_sn'], 'total_amount' => 1, 'subject' => '购买服务', 'body' => '购买商品', 'valid_time' => 3600, ]; return $this->post('create_order', $data); } //查询订单 private function query() { $data = [ 'out_order_no' => '2021110117254573565' ]; $res = $this->post('query_order', $data, false); echo json_encode($res); die; } //订单退款 private function refund() { $data = [ 'out_order_no' => '2021110118351347832', 'out_refund_no' => $this->order_number(), 'reason' => '退款原因', 'refund_amount' => 1, ]; $res = $this->post('create_refund', $data); echo json_encode($res); die; } //订单分账 private function settle() { $data = [ 'out_order_no' => '2021110118301265990', 'out_settle_no' => $this->order_number(), 'settle_desc' => '分账描述', 'settle_params' => json_encode([]),//分润方参数 如[['merchant_uid'=>'商户号','amount'=>'10']] 可以有多个分账商户 ]; $res = $this->post('settle', $data); echo json_encode($res); die; } //支付设置回调测试 private function set() { $content = file_get_contents('php://input'); $this->log('log.txt', $content); } //回调 private function notify() { $content = input(); if (empty($content)) return false; $this->log('notify.txt', json_encode($content)); if (is_array($content)) { $content = $content; } else { $content = json_decode($content, true); } $sign = $this->handler($content); if (!empty($content['msg_signature']) && $sign == $content['msg_signature']) { if (is_array($content['msg'])) { $msg = $content['msg']; } else { $msg = json_decode($content['msg'], true); } if ($content['type'] == 'payment') { $order_sn = $msg['payment_order_no']; Db::name('order')->where('order_sn', $order_sn)->update(['pay_status' => 1]); } //这里更新应用业务逻辑代码,使用$msg跟应用订单比对更新订单,可以用 $content['type']判断是支付回调还是退款回调,payment支付回调 refund退款回调。 $res = ['err_no' => 0, 'err_tips' => 'success']; echo json_encode($res); exit; } else { echo '验签失败'; } } /** * 测试订单号,实际应用根据自己应用实际生成 * @return string */ private function order_number() { return date('YmdHis') . rand(10000, 99999); } /** * 请求小程序平台服务端 * @param string $url 接口地址 * @param array $data 参数内容 * @param boolean $notify 是否有回调 * @return array */ private function post($method, $data, $notify = true) { $data['app_id'] = $this->app_id; $data['sign'] = $this->sign($data); $url = $this->api_url . $method; $res = $this->http('POST', $url, json_encode($data), ['Content-Type: application/json'], true); return json_decode($res, true); } /** * 回调验签 * @param array $map 验签参数 * @return stirng */ private function handler($map) { $rList = array(); array_push($rList, $this->token); foreach ($map as $k => $v) { if ($k == "type" || $k == 'msg_signature') continue; $value = trim(strval($v)); if ($value == "" || $value == "null") continue; array_push($rList, $value); } sort($rList, 2); return sha1(implode($rList)); } /** * 请求签名 * @param array $map 请求参数 * @return stirng */ private function sign($map) { $rList = array(); foreach ($map as $k => $v) { if ($k == "other_settle_params" || $k == "app_id" || $k == "sign" || $k == "thirdparty_id") continue; $value = trim(strval($v)); $len = strlen($value); if ($len > 1 && substr($value, 0, 1) == "\"" && substr($value, $len, $len - 1) == "\"") $value = substr($value, 1, $len - 1); $value = trim($value); if ($value == "" || $value == "null") continue; array_push($rList, $value); } array_push($rList, $this->salt); sort($rList, 2); return md5(implode('&', $rList)); } /** * 写日志 * @param string $path 日志路径 * @param string $content 内容 */ private function log($path, $content) { $file = fopen($path, "a"); fwrite($file, date('Y-m-d H:i:s') . '-----' . $content . "\n"); fclose($file); } /** * 网络请求 * @param stirng $method 请求模式 * @param stirng $url请求网关 * @param array $params 请求参数 * @param stirng $header 自定义头 * @param boolean $multi 文件上传 * @return array */ private function http($method = 'GET', $url, $params, $header = array(), $multi = false) { $opts = array( CURLOPT_TIMEOUT => 30, CURLOPT_RETURNTRANSFER => 1, CURLOPT_SSL_VERIFYPEER => false, CURLOPT_SSL_VERIFYHOST => false, CURLOPT_HTTPHEADER => $header ); /* 根据请求类型设置特定参数 */ switch (strtoupper($method)) { case 'GET': $opts[CURLOPT_URL] = $url . '?' . http_build_query($params); break; case 'POST': //判断是否传输文件 $params = $multi ? $params : http_build_query($params); $opts[CURLOPT_URL] = $url; $opts[CURLOPT_POST] = 1; $opts[CURLOPT_POSTFIELDS] = $params; break; default: throw new Exception('不支持的请求方式!'); } /* 初始化并执行curl请求 */ $ch = curl_init(); curl_setopt_array($ch, $opts); $data = curl_exec($ch); $error = curl_error($ch); curl_close($ch); if ($error) throw new Exception('请求发生错误:' . $error); return $data; } }