审查视图

app/portal/controller/OrderController.php 22.1 KB
董瑞恩 authored
1 2 3 4 5 6 7 8 9 10 11 12 13
<?php
/**
 * Created by PhpStorm.
 * User: ruidiudiu
 * Date: 2018/11/24
 * Time: 8:54
 */

namespace app\portal\controller;


use cmf\controller\HomeBaseController;
use think\Db;
sgj authored
14
use think\Log;
董瑞恩 authored
15 16 17 18 19 20 21 22 23
use wxapp\pay\WeixinPay;

/**
 * @title 订单相关接口
 * @description 订单相关接口
 * @group 订单相关接口
 */
class OrderController extends HomeBaseController{
董瑞恩 authored
24 25 26 27 28 29 30 31 32 33 34 35
//    /**
//     * @title 生成订单
//     * @description 生成订单,加入开始时间和用户id
//     * @author 董瑞恩
//     * @url /portal/order/createOrder
//     * @method GET
//     *
//     * @param name:users_id type:String require:1 default:无 other: desc:用户id
//     * @param name:name type:String require:1 default:无 other: desc:设备名称
//     *
//     */
    public function createOrder($users_id,$name){
董瑞恩 authored
36 37
        $order=[
            'order_no' => cmf_get_order_sn(),
董瑞恩 authored
38
            'eq_name' => $name,
董瑞恩 authored
39 40 41 42 43 44
            'users_id' => $users_id,
            'start_time' => time(),
            'state' => 1
        ];
        try{
            Db::startTrans();
董瑞恩 authored
45
            Db::name('users')->where('id',$users_id)->update(['is_use'=>1]);
董瑞恩 authored
46 47 48
            Db::name('order')->insert($order);
        }catch (\Exception $exception){
            Db::rollback();
董瑞恩 authored
49 50
            $data=[
                'state'=>false,
董瑞恩 authored
51
                'message'=>$exception->getMessage()
董瑞恩 authored
52
            ];
董瑞恩 authored
53
            return $data;
董瑞恩 authored
54 55
        }
        Db::commit();
董瑞恩 authored
56 57 58 59 60
        $data=[
            'state'=>true,
            'order_no' => $order['order_no']
        ];
        return $data;
董瑞恩 authored
61 62
    }
董瑞恩 authored
63 64 65 66 67 68 69 70 71 72 73 74 75
//    /**
//     * @title 完成订单
//     * @description 订单完成,加入结束时间和结算费用,并调用微信统一下单
//     * @author 董瑞恩
//     * @url /portal/order/order
//     * @method GET
//     *
//     * @param name:users_id type:String require:1 default:无 other: desc:用户id
//     *
//     * @return data:返回用于调用支付的参数
//     */
    public function order($users_id,$name){
        $order= Db::name('order')->where(['users_id'=>$users_id,'state'=>1])->find();
董瑞恩 authored
76
        $end_time=time();
董瑞恩 authored
77
        $price=$this->getPrice($users_id,$order['start_time'],$end_time);
董瑞恩 authored
78
        $time=ceil(($end_time-$order['start_time'])/3600);
董瑞恩 authored
79 80
        $data=[
            'end_time'=>$end_time,
董瑞恩 authored
81
            'time' => $time,
董瑞恩 authored
82 83 84 85 86
            'price' => $price,
            'state' => 2
        ];
        try{
            Db::startTrans();
董瑞恩 authored
87
            Db::name('users')->where('id',$users_id)->update(['is_use'=>0]);
董瑞恩 authored
88 89
            Db::name('equipment')->where('name',$name)->update(['use'=>0]);
            Db::name('order')->where('order_no',$order['order_no'])->update($data);
董瑞恩 authored
90 91
        }catch (\Exception $exception){
            Db::rollback();
董瑞恩 authored
92 93
            $data=[
                'state'=>false,
董瑞恩 authored
94 95
                'message'=>'数据库操作失败',
                'error' =>$exception->getMessage()
董瑞恩 authored
96 97
            ];
            $this->apiResponse(200,'success',$data);
董瑞恩 authored
98 99
        }
        Db::commit();
董瑞恩 authored
100
        //调起支付
董瑞恩 authored
101
        if ($price==0){
董瑞恩 authored
102 103 104 105 106
            try{
                Db::name('order')->where(['order_no'=>$order['order_no']])->update(['state'=>3]);
            }catch (\Exception $exception){
                $this->apiResponse(301,'error:'.$exception->getMessage());
            }
董瑞恩 authored
107 108 109 110 111
            $data=[
                'state'=>2,
            ];
            $this->apiResponse(200,'success',$data);
        }
董瑞恩 authored
112
        $this->pay($order['order_no']);
董瑞恩 authored
113
董瑞恩 authored
114 115
    }
董瑞恩 authored
116
董瑞恩 authored
117
    public function getPrice($users_id,$start_time,$end_time){
董瑞恩 authored
118 119
        $cost=Db::name('cost')->where('id',1)->find();
        $interval = Db::name('interval')->where('id',1)->find();
董瑞恩 authored
120
        $is_free=Db::name('users')->where('id',$users_id)->find()['is_free'];
sgj authored
121
        //一小时免费状态
董瑞恩 authored
122
        $free=$cost['free'];
sgj authored
123
董瑞恩 authored
124 125 126
        //获取整天的价格
        $dayPrice=$this->getDayPrice();
董瑞恩 authored
127
        //用了多少天
董瑞恩 authored
128
        $day=floor(($end_time-$start_time)/86400);
董瑞恩 authored
129
        $dayPrice=$day*$dayPrice;
董瑞恩 authored
130 131
        //去掉整天的金额
        $new_start_time=$start_time+$day*86400;//时间戳
董瑞恩 authored
132
        $new_end_time= $end_time;//时间戳
董瑞恩 authored
133 134
        $hours_start_time=date('His',$new_start_time);
        $hours_end_time=date('His',$new_end_time);
董瑞恩 authored
135
董瑞恩 authored
136 137
        $stateTime=strtotime($interval['start_time']);
        $endTime=strtotime($interval['end_time']);
董瑞恩 authored
138
        //判断预设时间段是否跨天
董瑞恩 authored
139
        $price=0;
董瑞恩 authored
140
        if ($endTime < $stateTime){
董瑞恩 authored
141
            //设备使用时间段是否跨天(不跨天)
董瑞恩 authored
142
            if ($hours_end_time > $hours_start_time){
董瑞恩 authored
143 144 145 146
//                dump(date('Y-m-d H:i:s',$new_start_time));
//                dump(date('Y-m-d H:i:s',$new_end_time));
//                dump(date('Y-m-d H:i:s',$stateTime));
//                dump(date('Y-m-d H:i:s',$endTime));
董瑞恩 authored
147 148 149
                //在预设时间段左边并不与之重合
                if (($new_start_time > strtotime('00:00:00') && $new_start_time < $endTime) && ($new_end_time > $new_start_time && $new_end_time < $endTime)){
                    $price +=(ceil(($new_end_time-$new_start_time)/3600) * $interval['price']);
董瑞恩 authored
150
                }
董瑞恩 authored
151 152 153
                //与预设时间段的尾部重合
                if (($new_start_time > strtotime('00:00:00') && $new_start_time < $endTime) && ($new_end_time > $endTime && $new_end_time < $stateTime)){
                    $price +=(ceil(($endTime-$new_start_time)/3600) * $interval['price'] +  ceil(($new_end_time-$endTime)/3600) * $cost['cost']);
董瑞恩 authored
154
                }
董瑞恩 authored
155 156 157 158 159
                //与预设时间段的头尾都重合
                if (($new_start_time > strtotime('00:00:00') && $new_start_time < $endTime) && $new_end_time > $stateTime){
                    $price +=(ceil(($endTime-$new_start_time)/3600) * $interval['price'] +  ceil(($new_end_time-$stateTime)/3600) * $interval['price'] + ceil(($stateTime-$endTime)/3600) * $cost['cost']);
                }
                //不与预设时间段重合
董瑞恩 authored
160
                if (($new_start_time > $endTime && $new_start_time < $stateTime) && ($new_end_time > $new_start_time && $new_end_time < $stateTime)){
董瑞恩 authored
161 162
                    //存在首小时免费
                    $price +=(ceil(($new_end_time-$new_start_time)/3600) * $cost['cost']);
董瑞恩 authored
163
                    if ($free==1 && $is_free==0){
董瑞恩 authored
164
                        $price-=$cost['cost'];
sgj authored
165
                        Db::name('users')->where('id',$users_id)->update(['is_free'=>2]);
sgj authored
166 167 168 169
                        Log::init([
                            'type'  =>  'File',
                            'path'  =>  APP_PATH.'logs/'
                        ]);
sgj authored
170
                        Log::write($price);
董瑞恩 authored
171
                    }
董瑞恩 authored
172
                }
董瑞恩 authored
173 174 175 176
                //与预设时间段的头部重合
                if (($new_start_time > $endTime && $new_start_time < $stateTime) && ($new_end_time > $stateTime && $new_end_time < strtotime('24:00:00'))){
                    //存在首小时免费
                    $price += (ceil(($stateTime-$new_start_time)/3600) * $cost['cost'] + ceil(($new_end_time-$stateTime)/3600) * $interval['price']);
董瑞恩 authored
177
                    if ($free==1 && $is_free==0){
董瑞恩 authored
178
                        $price-=$cost['cost'];
董瑞恩 authored
179
                        Db::name('users')->where('id',$users_id)->update(['is_free'=>1]);
董瑞恩 authored
180
                    }
董瑞恩 authored
181 182 183 184
                }
                //在预设时间段右边并不与之重合
                if (($new_start_time > $stateTime && $new_start_time < strtotime('24:00:00')) && ($new_end_time > $new_start_time && $new_end_time < strtotime('24:00:00'))){
                    $price +=(ceil(($new_end_time-$new_start_time)/3600) * $interval['price']);
董瑞恩 authored
185
                }
董瑞恩 authored
186
            //设备使用时间段是否跨天(跨天:开始时间在昨天,结束时间在今天)
董瑞恩 authored
187
            }else{
董瑞恩 authored
188 189
                $YesterdayStateTime=$stateTime-86400;
                $YesterdayEndTime=$endTime-86400;
董瑞恩 authored
190
                //昨天预设结束前使用,今天预设结束前停止
董瑞恩 authored
191
                if(($new_start_time > (strtotime('00:00:00')-86400) && $new_start_time < $YesterdayEndTime) && ($new_end_time > strtotime('00:00:00') && $new_end_time < $endTime)){
sgj authored
192
董瑞恩 authored
193 194 195
                    $price+= ceil(($YesterdayEndTime-$new_start_time)/3600) * $interval['price']
                            +ceil(($YesterdayStateTime-$YesterdayEndTime)/3600) * $cost['cost']
                            +ceil(($new_end_time-$YesterdayStateTime)/3600) * $interval['price'];
董瑞恩 authored
196
                }
董瑞恩 authored
197
                //昨天预设开始前使用,今天预设结束前停止
董瑞恩 authored
198 199
                if(($new_start_time > $YesterdayEndTime && $new_start_time < $YesterdayStateTime) && ($new_end_time > strtotime('00:00:00') && $new_end_time < $endTime)){
                    //存在首小时免费
sgj authored
200
董瑞恩 authored
201 202
                    $price+= ceil(($YesterdayStateTime-$new_start_time)/3600) *  $cost['cost']
                            +ceil(($new_end_time-$YesterdayStateTime)/3600) * $interval['price'];
董瑞恩 authored
203
                    if ($free==1 && $is_free==0){
董瑞恩 authored
204
                        $price-=$cost['cost'];
董瑞恩 authored
205
                        Db::name('users')->where('id',$users_id)->update(['is_free'=>1]);
董瑞恩 authored
206
                    }
董瑞恩 authored
207 208
                }
                //昨天预设开始前使用,今天预设结束后停止
董瑞恩 authored
209 210
                if(($new_start_time > $YesterdayEndTime && $new_start_time < $YesterdayStateTime) && ($new_end_time > $endTime && $new_end_time < $stateTime)){
                    //存在首小时免费
sgj authored
211
董瑞恩 authored
212 213 214
                    $price+= ceil(($YesterdayStateTime-$new_start_time)/3600) *  $cost['cost']
                            +ceil(($endTime-$YesterdayStateTime)/3600) *  $interval['price']
                            +ceil(($new_end_time-$endTime)/3600) * $cost['cost'];
董瑞恩 authored
215
                    if ($free==1 && $is_free==0){
董瑞恩 authored
216
                        $price-=$cost['cost'];
董瑞恩 authored
217
                        Db::name('users')->where('id',$users_id)->update(['is_free'=>1]);
董瑞恩 authored
218
                    }
董瑞恩 authored
219
                }
董瑞恩 authored
220
                //昨天预设开始后使用,今天预设结束前停止
董瑞恩 authored
221
                if(($new_start_time > $YesterdayStateTime && $new_start_time < strtotime('00:00:00')) && ($new_end_time > strtotime('00:00:00') && $new_end_time < $endTime)){
sgj authored
222
董瑞恩 authored
223 224
                    $price+= ceil(($new_end_time-$new_start_time)/3600) *  $interval['price'];
                }
董瑞恩 authored
225
                //昨天预设开始后使用,今天预设结束后停止
董瑞恩 authored
226
                if(($new_start_time > $YesterdayStateTime && $new_start_time < strtotime('00:00:00')) && ($new_end_time > $endTime && $new_end_time < $stateTime)){
sgj authored
227
董瑞恩 authored
228
                    $price+= ceil(($endTime-$new_start_time)/3600) *  $interval['price']
sgj authored
229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367
                            +ceil(($new_end_time-$endTime)/3600) * $cost['cost'];
                }
                //昨天预设开始后使用,今天预设开始前停止
                if(($new_start_time > $YesterdayStateTime && $new_start_time < strtotime('00:00:00')) && ($new_end_time > $stateTime && $new_end_time < ($new_start_time+86400))){

                    $price+= ceil(($endTime-$new_start_time)/3600) *  $interval['price']
                            +ceil(($stateTime-$endTime)/3600) * $cost['cost']
                            +ceil(($new_end_time-$stateTime)/3600) * $interval['price'];
                }
            }
        }
        if ($price > $cost['ceiling']){
            $price = $cost['ceiling'];
        }
        $numPrice = $dayPrice+$price;
        log::write($numPrice);
        return $numPrice;
    }

    /**
     * 只是获取价格信息不会进行操作
     * @param $users_id
     * @param $start_time
     * @param $end_time
     * @return float|int|mixed
     * @throws \think\db\exception\DataNotFoundException
     * @throws \think\db\exception\ModelNotFoundException
     * @throws \think\exception\DbException
     */

    public function onlyGetPrice($users_id,$start_time,$end_time){
        $cost=Db::name('cost')->where('id',1)->find();
        $interval = Db::name('interval')->where('id',1)->find();
        $is_free=Db::name('users')->where('id',$users_id)->find()['is_free'];
        //一小时免费状态
        $free=$cost['free'];

        //获取整天的价格
        $dayPrice=$this->getDayPrice();

        //用了多少天
        $day=floor(($end_time-$start_time)/86400);
        $dayPrice=$day*$dayPrice;
        //去掉整天的金额
        $new_start_time=$start_time+$day*86400;//时间戳
        $new_end_time= $end_time;//时间戳
        $hours_start_time=date('His',$new_start_time);
        $hours_end_time=date('His',$new_end_time);

        $stateTime=strtotime($interval['start_time']);
        $endTime=strtotime($interval['end_time']);
        //判断预设时间段是否跨天
        $price=0;
        if ($endTime < $stateTime){
            //设备使用时间段是否跨天(不跨天)
            if ($hours_end_time > $hours_start_time){
//                dump(date('Y-m-d H:i:s',$new_start_time));
//                dump(date('Y-m-d H:i:s',$new_end_time));
//                dump(date('Y-m-d H:i:s',$stateTime));
//                dump(date('Y-m-d H:i:s',$endTime));
                //在预设时间段左边并不与之重合
                if (($new_start_time > strtotime('00:00:00') && $new_start_time < $endTime) && ($new_end_time > $new_start_time && $new_end_time < $endTime)){
                    $price +=(ceil(($new_end_time-$new_start_time)/3600) * $interval['price']);
                }
                //与预设时间段的尾部重合
                if (($new_start_time > strtotime('00:00:00') && $new_start_time < $endTime) && ($new_end_time > $endTime && $new_end_time < $stateTime)){
                    $price +=(ceil(($endTime-$new_start_time)/3600) * $interval['price'] +  ceil(($new_end_time-$endTime)/3600) * $cost['cost']);
                }
                //与预设时间段的头尾都重合
                if (($new_start_time > strtotime('00:00:00') && $new_start_time < $endTime) && $new_end_time > $stateTime){
                    $price +=(ceil(($endTime-$new_start_time)/3600) * $interval['price'] +  ceil(($new_end_time-$stateTime)/3600) * $interval['price'] + ceil(($stateTime-$endTime)/3600) * $cost['cost']);
                }
                //不与预设时间段重合
                if (($new_start_time > $endTime && $new_start_time < $stateTime) && ($new_end_time > $new_start_time && $new_end_time < $stateTime)){
                    //存在首小时免费
                    $price +=(ceil(($new_end_time-$new_start_time)/3600) * $cost['cost']);
                    if ($free==1 && $is_free==0){
                        $price-=$cost['cost'];
                        Log::init([
                            'type'  =>  'File',
                            'path'  =>  APP_PATH.'logs/'
                        ]);
                        Log::write($price);
                    }
                }
                //与预设时间段的头部重合
                if (($new_start_time > $endTime && $new_start_time < $stateTime) && ($new_end_time > $stateTime && $new_end_time < strtotime('24:00:00'))){
                    //存在首小时免费
                    $price += (ceil(($stateTime-$new_start_time)/3600) * $cost['cost'] + ceil(($new_end_time-$stateTime)/3600) * $interval['price']);
                    if ($free==1 && $is_free==0){
                        $price-=$cost['cost'];

                    }
                }
                //在预设时间段右边并不与之重合
                if (($new_start_time > $stateTime && $new_start_time < strtotime('24:00:00')) && ($new_end_time > $new_start_time && $new_end_time < strtotime('24:00:00'))){
                    $price +=(ceil(($new_end_time-$new_start_time)/3600) * $interval['price']);
                }
            //设备使用时间段是否跨天(跨天:开始时间在昨天,结束时间在今天)
            }else{
                $YesterdayStateTime=$stateTime-86400;
                $YesterdayEndTime=$endTime-86400;
                //昨天预设结束前使用,今天预设结束前停止
                if(($new_start_time > (strtotime('00:00:00')-86400) && $new_start_time < $YesterdayEndTime) && ($new_end_time > strtotime('00:00:00') && $new_end_time < $endTime)){

                    $price+= ceil(($YesterdayEndTime-$new_start_time)/3600) * $interval['price']
                            +ceil(($YesterdayStateTime-$YesterdayEndTime)/3600) * $cost['cost']
                            +ceil(($new_end_time-$YesterdayStateTime)/3600) * $interval['price'];
                }
                //昨天预设开始前使用,今天预设结束前停止
                if(($new_start_time > $YesterdayEndTime && $new_start_time < $YesterdayStateTime) && ($new_end_time > strtotime('00:00:00') && $new_end_time < $endTime)){
                    //存在首小时免费

                    $price+= ceil(($YesterdayStateTime-$new_start_time)/3600) *  $cost['cost']
                            +ceil(($new_end_time-$YesterdayStateTime)/3600) * $interval['price'];
                    if ($free==1 && $is_free==0){
                        $price-=$cost['cost'];
                    }
                }
                //昨天预设开始前使用,今天预设结束后停止
                if(($new_start_time > $YesterdayEndTime && $new_start_time < $YesterdayStateTime) && ($new_end_time > $endTime && $new_end_time < $stateTime)){
                    //存在首小时免费

                    $price+= ceil(($YesterdayStateTime-$new_start_time)/3600) *  $cost['cost']
                            +ceil(($endTime-$YesterdayStateTime)/3600) *  $interval['price']
                            +ceil(($new_end_time-$endTime)/3600) * $cost['cost'];
                    if ($free==1 && $is_free==0){
                        $price-=$cost['cost'];
                    }
                }
                //昨天预设开始后使用,今天预设结束前停止
                if(($new_start_time > $YesterdayStateTime && $new_start_time < strtotime('00:00:00')) && ($new_end_time > strtotime('00:00:00') && $new_end_time < $endTime)){

                    $price+= ceil(($new_end_time-$new_start_time)/3600) *  $interval['price'];
                }
                //昨天预设开始后使用,今天预设结束后停止
                if(($new_start_time > $YesterdayStateTime && $new_start_time < strtotime('00:00:00')) && ($new_end_time > $endTime && $new_end_time < $stateTime)){

                    $price+= ceil(($endTime-$new_start_time)/3600) *  $interval['price']
董瑞恩 authored
368 369
                            +ceil(($new_end_time-$endTime)/3600) * $cost['cost'];
                }
董瑞恩 authored
370
                //昨天预设开始后使用,今天预设开始前停止
董瑞恩 authored
371
                if(($new_start_time > $YesterdayStateTime && $new_start_time < strtotime('00:00:00')) && ($new_end_time > $stateTime && $new_end_time < ($new_start_time+86400))){
sgj authored
372
董瑞恩 authored
373 374 375 376
                    $price+= ceil(($endTime-$new_start_time)/3600) *  $interval['price']
                            +ceil(($stateTime-$endTime)/3600) * $cost['cost']
                            +ceil(($new_end_time-$stateTime)/3600) * $interval['price'];
                }
董瑞恩 authored
377
            }
董瑞恩 authored
378
        }
董瑞恩 authored
379 380 381 382
        if ($price > $cost['ceiling']){
            $price = $cost['ceiling'];
        }
        $numPrice = $dayPrice+$price;
sgj authored
383
        log::write($numPrice);
董瑞恩 authored
384
        return $numPrice;
董瑞恩 authored
385 386
    }
董瑞恩 authored
387 388 389 390 391 392 393 394 395 396 397 398 399
    //获取整天的价格
    public function getDayPrice(){
        $cost=Db::name('cost')->where('id',1)->find();
        $interval = Db::name('interval')->where('id',1)->find();
        $stateTime=strtotime($interval['start_time']);
        $endTime=strtotime($interval['end_time']);
        //预设时间长度
        $time=($stateTime-$endTime)/3600;
        if ($endTime < $stateTime){
            $price=($time *  $cost['cost']) + ((24-$time) *  $interval['price']);
        }else{
            $price=($time *  $interval['price']) + ((24-$time) *  $cost['cost']);
        }
董瑞恩 authored
400 401 402 403

        if ($price > $cost['ceiling']){
            $price = $cost['ceiling'];
        }
董瑞恩 authored
404 405
        return $price;
    }
董瑞恩 authored
406 407

董瑞恩 authored
408 409 410 411 412 413 414 415 416
    /**
     * @title 统一下单
     * @description 微信统一下单
     * @author 董瑞恩
     * @url /portal/order/pay
     * @method GET
     *
     * @param name:order_no type:String require:1 default:无 other: desc:订单号
     *
董瑞恩 authored
417
     * @return data:返回用于调用支付的参数
董瑞恩 authored
418 419 420
     */
    public function pay($order_no){
        $order=Db::name('order')->where(['order_no'=>$order_no,'state'=>2])->find();
董瑞恩 authored
421
        $openId=Db::name('users')->where('id',$order['users_id'])->find()['open_id'];
董瑞恩 authored
422
        $body='支付';
sgj authored
423
        $price=$order['price']*100;//订单价格
董瑞恩 authored
424
        $notify_url=url('order/notify','','',true);//回调地址
董瑞恩 authored
425
        $out_trade_no=$order_no.$this->create_noncestr(4);
董瑞恩 authored
426
        $wxPay=new WeixinPay($openId,$out_trade_no,$body,$price,$notify_url);
董瑞恩 authored
427 428 429 430 431 432 433 434 435 436 437 438 439 440
        $pay=$wxPay->pay();
        if (isset($pay['package'])){
            $data=[
                'state'=>1,
                'pay'=>$pay
            ];
            $this->apiResponse(200,'success',$data);
        }else{
            $data=[
                'state'=>0,
                'message'=>'统一下单失败',
                'error' => $pay
            ];
            $this->apiResponse(200,'success',$data);
董瑞恩 authored
441
        }
董瑞恩 authored
442
董瑞恩 authored
443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458
    }

    //支付回调接口
    public function notify(){
        $param = $this->request->param();
        if ($param == null) {
            $param = file_get_contents("php://input");
            if ($param == null) {
                $param = $GLOBALS['HTTP_RAW_POST_DATA'];
            }
        }
        $wxPay=new WeixinPay();
        $data = $wxPay->xmlToArray($param);
        $Sign = $data['sign'];
        //支付成功回调后变更订单状态
        $mySign = $wxPay->getSign($data);
董瑞恩 authored
459
        $order_no =substr($data['out_trade_no'], 0, -4);
董瑞恩 authored
460 461 462 463 464 465 466 467 468 469 470 471 472 473
        if ($Sign===$mySign && $data['return_code'] == 'SUCCESS') {
            try{
                Db::name('order')->where(['order_no'=>$order_no])->update(['state'=>3]);
            }catch (\Exception $exception){
                $this->apiResponse(301,'error:'.$exception->getMessage());
            }
            return "<xml>
                      <return_code><![CDATA[SUCCESS]]></return_code>
                      <return_msg><![CDATA[OK]]></return_msg>
                    </xml>";

        }
    }
董瑞恩 authored
474 475 476 477 478 479 480 481 482
    function create_noncestr($length = 4){
        $chars = "0123456789";
        $str = "";
        for($i=0;$i<$length;$i++){
            $str.= substr($chars,mt_rand(0,strlen($chars)-1),1);
        }
        return $str;
    }
董瑞恩 authored
483
}