<?php

namespace app\api\controller;

use app\common\controller\Api;
use think\Db;
use think\Log;
use addons\epay\library\Service;

/**
 * 支付回调
 */
class Notify extends Api
{
    protected $noNeedLogin = ['*'];
    protected $noNeedRight = ['*'];

    /**
     * 支付回调
     */
    public function notify() {
        $paytype = $this->request->param('paytype');
        $pay = Service::checkNotify($paytype);
//        Log::record("=======================", 'info');
//        Log::record("pay:", 'info');
//        Log::record($pay, 'info');
//        Log::record("=======================", 'info');
        if (!$pay) {
            echo '签名错误';
            return;
        }
        $data = $pay->verify();
        $time = time();
        try {
            $payamount = $paytype == 'alipay' ? $data['total_amount'] : $data['total_fee'] / 100;
            $out_trade_no = $data['out_trade_no'];
            Db::startTrans();
            try{
                $orderModel = new \app\common\model\RecharOrder();
                $userModel = new \app\common\model\User();
                $orderInfo = $orderModel->where(["order_no"=>$out_trade_no])->find();
                $userInfo = $userModel->where(["id"=>$orderInfo["user_id"]])->find();
                $res1 = false;
                $res2 = false;
                $res3 = false;
                if($orderInfo['status'] == 0) {
                    // 修改订单状态
                    $res1 = $orderModel->update(["status"=>1,"updatetime"=>$time],["order_no"=>$out_trade_no, 'status' => 0]);
                    // 充值后
                    switch($orderInfo['purpose']) {
                        case 1:
                            // 修改用户为已缴纳认证费
                            $userInfo->recharge_auth = 1;
                            $res2 = $userInfo->save();
                            $res3 = true;
                            break;
                        case 2:
                            // 添加有眼缘记录--单次付费
                            $data = [];
                            $data['user_id'] = $userInfo->id;
                            $data['fate_user_id'] = $orderInfo->fate_user_id;
                            if(!\app\common\model\UserFate::where($data)->find()) {
                                $data['createtime'] = $time;
                                $res2 = \app\common\model\UserFate::insert($data);
                            } else {
                                $res2 = true;
                            }

                            // 返利
                            $preuser_id = $userInfo->pre_user_id;
                            if($userInfo->vip_duetime < $time) {
                                $memo = '用户充值获得收益!';
                                $profit = $payamount * config('site.userProfitRate') * 0.01;
                            } else {
                                $memo = '会员充值获得收益!';
                                $profit = $payamount * config('site.vipProfitRate') * 0.01;
                            }
                            if($profit>=0.01 && $preuser_id > 0) {
                                $res3 = \app\common\model\User::profit($profit,$preuser_id,$memo);
                            } else {
                                $res3 = true;
                            }

                            break;
                        case 3:
                            // 获取vip配置信息
                            $vip_config_id = $orderInfo['vip_config_id'];
                            $vipConfigInfo = \app\admin\model\vip\Config::where(['id'=>$vip_config_id])->find();
                            // 计算vip到期时间
                            if($userInfo->vip_duetime < $time) {
                                $duetime = strtotime ( '+'.intval($vipConfigInfo['time']).' month' );
                            } else {
                                $duetime = strtotime ( '+'.intval($vipConfigInfo['time']).' month',$userInfo->vip_duetime);
                            }
                            // 修改用户为vip
                            if($userInfo->vip_duetime <= time()) {
                                $userInfo->view_count = $vipConfigInfo->give_times; // 今日剩余次数
                                $userInfo->view_date = date('Y-m-d'); // 次数最后更新日期
                            }
                            $userInfo->vip_duetime = $duetime;
                            $res2 = $userInfo->save();
                            // 添加查看次数
                            $data = [];
                            $data['user_id'] = $userInfo->id;
                            $data['end_date'] = date("Y-m-d",$duetime);
                            $data['times'] = $vipConfigInfo->give_times;
                            $data['createtime'] = time();
                            $res3 = \app\common\model\GiveFateLog::insert($data);
                            break;
                        case 4:
                            // 获取钻石配置信息
                            $vip_config_id = $orderInfo['vip_config_id'];
                            $vipConfigInfo = Db::name('diamond')->where(['id'=>$vip_config_id])->find();
                            //修改用户钻石余额
                            $diamond = $userInfo['diamond'] + $vipConfigInfo['number'];
                            $res2 = Db::name('user')->where(['id' => $userInfo['id'], 'diamond' => $userInfo['diamond']])->setField('diamond', $diamond);
                            // 添加钻石明细
                            $diamond_log = Db::name('user_diamond_log')->where(['user_id' => $userInfo['id']])->order('id', 'desc')->find();
                            if (!$diamond_log && $userInfo['diamond'] > 0) {
                                $res3 = false;
                                break;
                            }
                            if ($diamond_log && $diamond_log['after'] != $userInfo['diamond']) {
                                $res3 = false;
                                break;
                            }
                            $data['user_id'] = $userInfo['id'];
                            $data['diamond'] = $vipConfigInfo['number'];
                            $data['before'] = $userInfo['diamond'];
                            $data['after'] = $diamond;
                            $data['memo'] = '充值';
                            $data['createtime'] = time();

                            $res3 = Db::name('user_diamond_log')->insertGetId($data);
                            break;
                    }
                }


                if($res1 && $res2 !== false && $res3) {
                    Db::commit();
                } else {
                    Db::rollback();
                }
            }catch (ValidateException $e) {
                Db::rollback();
                $this->error($e->getMessage());
            } catch (PDOException $e) {
                Db::rollback();
                $this->error($e->getMessage());
            } catch (Exception $e) {
                Db::rollback();
                $this->error($e->getMessage());
            }

            //你可以在此编写订单逻辑
        } catch (Exception $e) {
        }
        echo $pay->success();
    }

}