<?php
/**
 * Created by PhpStorm.
 * User: 86132
 * Date: 2020/11/19
 * Time: 22:23
 */

namespace app\api\controller;


use app\common\controller\Api;
use think\Db;

/**
 * 支付接口
 */
class Pay extends Api
{
    protected $noNeedLogin = ['*'];
    protected $noNeedRight = ['*'];

    /**
     * 订单接口
     * @ApiTitle    (押金支付)
     * @ApiSummary  (押金支付)
     * @ApiMethod   (POST)
     * @ApiRoute    (/api/Pay/Wechat)
     * @ApiHeaders  (name=token, type=string, required=true, description="请求的Token")
     * @ApiParams   (name="OrderSn", type="integer", required=true, description="订单号")
     * @ApiReturnParams   (name="code", type="integer", required=true, sample="0")
     * @ApiReturnParams   (name="msg", type="string", required=true, sample="返回成功")
     * @ApiReturn   ({
    'code':'1',
    'msg':'返回成功'
    })
     */
    public function Wechat()
    {
        $UserId = $this->is_token($this->request->header());
        $OrderSn = input('OrderSn');
        $Openid = Db::name('user')->where('id', $UserId)->value('openid');
        //查询订单
        $OrderArray = Db::name('order')->where('OrderSn', $OrderSn)->find();
        //生成支付订单号
        $PayOrder = $this->PayOrder();
        //生成支付订单
        $data = [
            'PayOrder' => $PayOrder,
            'OrderSn' => $OrderSn,
            'status' => 0,
            'user_id' => $UserId,
            'money' => $OrderArray['total'],
            'createtime' => time(),
            'updatetime' => time()
        ];
        $InsertPayOrder = Db::name('pay_order')->insert($data);
        if (!$InsertPayOrder) {
            $this->error('支付订单生成失败', 0);
            die;
        }
        $domain = $this->request->domain();
        $data = [
            'amount' => $OrderArray['total'],
            'orderid' => $PayOrder,
            'type' => "wechat",
            'title' => "会员开通",
            'notifyurl' => $domain . "/api/pay/WechatNotify/paytype/wechat",
            'returnurl' => $domain . "/api/pay/baidu",
            'method' => "miniapp",
            'openid' => $Openid
        ];
        $return = \addons\epay\library\Service::submitOrder($data);
        echo $return;
    }


    /**
     * 订单接口
     * @ApiTitle    (支付回调)
     * @ApiSummary  (支付回调)
     * @ApiMethod   (POST)
     * @ApiRoute    (/api/Pay/WechatNotify)
     * @ApiParams   (name="paytype", type="string", required=true, description="")
     * @ApiReturnParams   (name="code", type="integer", required=true, sample="0")
     * @ApiReturnParams   (name="msg", type="string", required=true, sample="返回成功")
     * @ApiReturn   ({
    'code':'1',
    'msg':'返回成功'
    })
     */
    public function WechatNotify()
    {
        $paytype = $this->request->param('paytype');
        $pay = \addons\epay\library\Service::checkNotify($paytype);
        if (!$pay) {
            echo '签名错误';
            die;
        }
        $data = $pay->verify();
        try {
            $payamount = $paytype == 'alipay' ? $data['total_amount'] : $data['total_fee'] / 100;
            //$data['out_trade_no'] 支付单号
            $order_sn = $data['out_trade_no'];
            $order = Db::name('pay_order')->where('PayOrder', $order_sn)->find();
            if ($order['status'] == 1) {
                return $pay->success('支付成功');
                die;
            }
            //在此编写订单逻辑
            //修改支付订单状态
            $UpdateStatus = Db::name('pay_order')->where('PayOrder', $data['out_trade_no'])->update(
                [
                    'status' => 1,
                    'updatetime' => time(),
                    'WeChatOrder' => $data['transaction_id'],
                    'pay_time' => time()
                ]
            );
            $PayOrderInfo = Db::name('pay_order')->where('PayOrder', $data['out_trade_no'])->find();
            $OrderInfo = Db::name('order')->where('OrderSn', $PayOrderInfo['OrderSn'])->find();
            $UnionID = Db::name('user')->where('id', $PayOrderInfo['user_id'])->value('UnionID');

            if (!$UpdateStatus) {
                $this->error('修改支付订单状态失败', 0);
                die;
            }
            //修改订单状态
            $UpdateOrder = Db::name('order')->where('OrderSn', $PayOrderInfo['OrderSn'])->update([
                'status' => 1,
                'updatetime' => time()
            ]);
            if (!$UpdateOrder) {
                $this->error('修改订单状态失败', 0);
                die;
            }
            /*订单推送到管易*/
            $GuanYiCloud = new GuanYiCloud();
            $City = explode('/', $OrderInfo['city']);
            //查询订单详情
            $GoodsArray = Db::name('order_con')
                ->alias('o')
                ->where('o.OrderSn', $PayOrderInfo['OrderSn'])
                ->join('goods g', 'g.id=o.Goods_id')
                ->field('g.goods_code,o.num,g.price')
                ->select();
            foreach ($GoodsArray as $k => $v) {
                $details[$k]['item_code'] = $v['goods_code'];
                $details[$k]['qty'] = $v['num'];
                $details[$k]['price'] = $v['price'];
                $details[$k]['oid'] = $PayOrderInfo['OrderSn'];
            }
            $PayTime = $PayOrderInfo['pay_time'] * 1000;
            $GuanYiCloud->addOrder($PayOrderInfo['OrderSn'], date('Y-m-d H:i:s', $OrderInfo['createtime']), $PayTime, $UnionID, $OrderInfo['name'], $OrderInfo['mobile'], $OrderInfo['address'] . '/' . $OrderInfo['address_con'], $City[0], $City[1], $City[2], $details, $PayOrderInfo['money'], $PayOrderInfo['PayOrder']);
            //是否首次下单
            $FirstPay = Db::name('order')->where('OrderSn', 'NEQ', $PayOrderInfo['OrderSn'])->where('status', 'IN', '1,2,3,4,5')->find();
            if (empty($FirstPay)) {
                Db::name('pay_order')->where('PayOrder', $data['out_trade_no'])->update(
                    [
                        'is_new' => 1,
                    ]
                );
                //查询用户积分
                $FirstPayUserinfo = Db::name('user')->where('id', $PayOrderInfo['user_id'])->find();
                //更改用户积分
                $UpdateFirstPay = Db::name('user')->where('id', $PayOrderInfo['user_id'])->update(['num' => $FirstPayUserinfo['num'] + ($OrderInfo['total'] * 2)]);
                if (!$UpdateFirstPay) {
                    $this->error('更改用户积分失败失败', 0);
                    die;
                }
                //添加用户积分记录
                $InserNumSql = [
                    'user_id' => $PayOrderInfo['user_id'],
                    'status' => 1,
                    'type' => 5,
                    'num' => $OrderInfo['total'] * 2,
                    'up_num' => $FirstPayUserinfo['num'] + ($OrderInfo['total'] * 2),
                    'createtime' => time()
                ];
                Db::name('num')->insert($InserNumSql);
            }
            //是否升级
            //已消费金额 $Consumed
            $Consumed = $this->YiXiaofeiMoney($PayOrderInfo['user_id']);
            $Level = Db::name('user')->where('id', $PayOrderInfo['user_id'])->value('level');
            $LevelSql = Db::name('level')->where('type', $Level + 1)->find();
            if ($Consumed > $LevelSql['price'] && $Consumed == $LevelSql['price']) {
                $LevelUserInfo = Db::name('user')->where('id', $PayOrderInfo['user_id'])->find();
                //更改用户积分
                $UpdateLevelUserInfo = Db::name('user')->where('id', $PayOrderInfo['user_id'])->update(['num' => $LevelUserInfo['num'] + $LevelSql['num']]);
                if (!$UpdateLevelUserInfo) {
                    $this->error('更改用户积分失败失败2', 0);
                    die;
                }
                //添加用户积分记录
                $InserNumSql2 = [
                    'user_id' => $PayOrderInfo['user_id'],
                    'status' => 1,
                    'type' => 6,
                    'num' => $LevelSql['num'],
                    'up_num' => $LevelUserInfo['num'] + $LevelSql['num'],
                    'createtime' => time()
                ];
                Db::name('num')->insert($InserNumSql2);
            }
            //好友下单奖励
            $Fuser_id = Db::name('group')->where('user_id', $PayOrderInfo['user_id'])->value('fuser_id');
            if (!empty($Fuser_id)) {
                $FuserInfo = Db::name('user')->where('id', $Fuser_id)->find();
                Db::name('user')->where('id', $Fuser_id)->update(
                    [
                        'num' => $FuserInfo['num'] + 300
                    ]
                );
                //添加用户积分记录
                $Fuser_idSql2 = [
                    'user_id' => $PayOrderInfo['user_id'],
                    'status' => 1,
                    'type' => 9,
                    'num' => 300,
                    'up_num' => $FuserInfo['num'] + 300,
                    'createtime' => time()
                ];
                Db::name('num')->insert($Fuser_idSql2);
            }
            //活动逻辑  单笔订单满100元,额外奖励5元。单笔订单满399,额外奖励50元,单笔订单满699元,额外奖励100元;(下级下单)奖励到活动收益表
            $Part = Db::name('huodong')->find();
            $i = 0;
            if ($Part['start_time'] < time() && time() < $Part['end_time']) {
                $i++;
            }
            if ($i != 0) {
                //活动开放
                $Fuser_id = Db::name('group')->where('user_id', $PayOrderInfo['user_id'])->value('fuser_id');
                if (!empty($Fuser_id)) {
                    if ($OrderInfo['total'] > 99) {
                        $RedBad = 5;
                    } elseif ($OrderInfo['total'] > 398) {
                        $RedBad = 50;
                    } elseif ($OrderInfo['total'] > 698) {
                        $RedBad = 100;
                    }
                    //给上级加收益到活动钱包
                    //查询上级钱包
                    $huodong_money = Db::name('huodong_money')->where('user_id', $Fuser_id)->find();
                    Db::name('huodong_money')->where('user_id', $Fuser_id)->update(
                        [
                            'count_money' => $huodong_money['count_money'] + $RedBad,
                            'befor_money' => $huodong_money['befor_money'] + $RedBad
                        ]
                    );
                }
            }
            //自购返现
            $ZiGou = Db::name('user')->where('id', $PayOrderInfo['user_id'])->find();
            if ($ZiGou['level'] != 1) {
                //不是普通会员 产生自购返现
                //自购折扣
                $buycount = Db::name('level')->where('type', $ZiGou['level'])->value('buycount');
                $ZigouMoney = (1 - $buycount) * $OrderInfo['total'];
                //扣除积分
                Db::name('user')->where('id', $PayOrderInfo['user_id'])->update(
                    [
                        'num' => $ZiGou['num'] - $ZigouMoney,
                        'money' => $ZiGou['money'] + $ZigouMoney
                    ]
                );
                //积分表添加记录
                //添加用户积分记录
                $ZiGouSql = [
                    'user_id' => $PayOrderInfo['user_id'],
                    'status' => 0,
                    'type' => 4,
                    'num' => $ZigouMoney,
                    'up_num' => $ZiGou['num'] - $ZigouMoney,
                    'createtime' => time()
                ];
                Db::name('num')->insert($ZiGouSql);
                //添加收益记录
                $ZiGouSqlMoney = [
                    'user_id' => $PayOrderInfo['user_id'],
                    'money' => $ZigouMoney,
                    'touser_id' => $PayOrderInfo['user_id'],
                    'status' => 0,
                    'type' => 1,
                    'createtime' => time(),
                    'OrderSn' => $PayOrderInfo['OrderSn']
                ];
                Db::name('money')->insert($ZiGouSqlMoney);
            }
            //二级分佣
            //查询用户上级和上级的上级
            $FatherUserId = Db::name('group')->where('user_id', $PayOrderInfo['user_id'])->value('fuser_id');
            if (!empty($FatherUserId)) {
                //一级分佣
                //一级精品比例
                $FirstBiliJingpin = Db::name('bili')->where('type', 1)->value('first');
                //一级通品比例
                $FirstBilitongpin = Db::name('bili')->where('type', 2)->value('first');
                //查询订单详情
                $FirstOrderConArray = Db::name('order_con')->where('OrderSn', $PayOrderInfo['OrderSn'])->select();
                if (!empty($FirstOrderConArray)) {
                    foreach ($FirstOrderConArray as $k => $v) {
                        $GoodsType = Db::name('goods')->where('id', $v['Goods_id'])->find();
                        if (!empty($GoodsType)) {
                            if ($GoodsType == 1) {
                                //精品
                                $FirstMoney[] = $GoodsType['price'] * $FirstBiliJingpin;
                            } else {
                                //通品
                                $FirstMoney[] = $GoodsType['price'] * $FirstBilitongpin;
                            }
                        }
                    }
                    //总收益 $FirstMoney
                    $RecordedFirstMoney = array_sum($FirstMoney);
                    $FirstUserInfoArray = Db::name('user')->where('id', $FatherUserId)->find();
                    //扣除积分 增加余额
                    Db::name('user')->where('id', $FatherUserId)->update(
                        [
                            'num' => $FirstUserInfoArray['num'] - $RecordedFirstMoney,
                            'money' => $FirstUserInfoArray['money'] + $RecordedFirstMoney
                        ]
                    );
                    //添加用户积分记录
                    $FirstNumuSql = [
                        'user_id' => $FatherUserId,
                        'status' => 0,
                        'type' => 3,
                        'num' => $RecordedFirstMoney,
                        'up_num' => $FirstUserInfoArray['num'] - $RecordedFirstMoney,
                        'createtime' => time()
                    ];
                    Db::name('num')->insert($FirstNumuSql);
                    //添加收益记录
                    $FirstSqlMoney = [
                        'user_id' => $FatherUserId,
                        'money' => $RecordedFirstMoney,
                        'touser_id' => $PayOrderInfo['user_id'],
                        'status' => 0,
                        'type' => 2,
                        'createtime' => time(),
                        'OrderSn' => $PayOrderInfo['OrderSn']
                    ];
                    Db::name('money')->insert($FirstSqlMoney);
                }
                $GroundFatherUserId = Db::name('group')->where('user_id', $FatherUserId)->value('fuser_id');
                if (!empty($GroundFatherUserId)) {
                    //二级分佣
                    //二级精品比例
                    $SecondBiliJingpin = Db::name('bili')->where('type', 1)->value('first');
                    //二级通品比例
                    $SecondBilitongpin = Db::name('bili')->where('type', 2)->value('first');
                    //查询订单详情
                    $SecondOrderConArray = Db::name('order_con')->where('OrderSn', $PayOrderInfo['OrderSn'])->select();
                    if (!empty($SecondOrderConArray)) {
                        foreach ($SecondOrderConArray as $k => $v) {
                            $GoodsType = Db::name('goods')->where('id', $v['Goods_id'])->find();
                            if (!empty($GoodsType)) {
                                if ($GoodsType == 1) {
                                    //精品
                                    $SecondMoney[] = $GoodsType['price'] * $SecondBiliJingpin;
                                } else {
                                    //通品
                                    $SecondMoney[] = $GoodsType['price'] * $SecondBilitongpin;
                                }
                            }
                        }
                        //总收益 $FirstMoney
                        $RecordedSecondMoney = array_sum($SecondMoney);
                        $SecondUserInfoArray = Db::name('user')->where('id', $GroundFatherUserId)->find();
                        //扣除积分 增加余额
                        Db::name('user')->where('id', $GroundFatherUserId)->update(
                            [
                                'num' => $SecondUserInfoArray['num'] - $RecordedSecondMoney,
                                'money' => $SecondUserInfoArray['money'] + $RecordedSecondMoney
                            ]
                        );
                        //添加用户积分记录
                        $SecondNumuSql = [
                            'user_id' => $GroundFatherUserId,
                            'status' => 0,
                            'type' => 3,
                            'num' => $RecordedSecondMoney,
                            'up_num' => $SecondUserInfoArray['num'] - $RecordedSecondMoney,
                            'createtime' => time()
                        ];
                        Db::name('num')->insert($SecondNumuSql);
                        //添加收益记录
                        $SecondSqlMoney = [
                            'user_id' => $GroundFatherUserId,
                            'money' => $RecordedSecondMoney,
                            'touser_id' => $PayOrderInfo['user_id'],
                            'status' => 0,
                            'type' => 2,
                            'createtime' => time(),
                            'OrderSn' => $PayOrderInfo['OrderSn']
                        ];
                        Db::name('money')->insert($SecondSqlMoney);
                    }
                }
            }
        } catch (Exception $e) {
        }
        echo $pay->success('支付成功');
    }
}