<?php

namespace app\api\controller;

use app\admin\model\Company;
use app\admin\model\WechatPlan;
use app\admin\model\WechatPlanRecord;
use app\common\model\UserRelation;
use app\common\controller\Api;
use app\common\library\Auth;
use liuniu\WechatService;
use app\common\model\User;
use Overtrue\Socialite\AuthorizeFailedException;
use think\Exception;
use think\Hook;
use think\Request;

class Wechat extends Api
{
    protected $noNeedLogin = ['*'];

    /**
     * 微信公众号服务
     * @return \think\Response
     */
    public function serve()
    {
        ob_clean();
        return WechatService::serve();
    }

    /**
     * 支付异步回调
     */
    public function notify()
    {
        ob_clean();
        WechatService::handleNotify(input('cid', 0));
    }

    /**
     * 公众号权限配置信息获取
     * @param Request $request
     * @return mixed
     */
    public function config(Request $request)
    {
        return app('json')->success(json_decode(WechatService::jsSdk($request->get('url')), true));
    }

    /**
     * 公众号授权登陆
     * @param Request $request
     * @return mixed
     * @throws \think\db\exception\DataNotFoundException
     * @throws \think\db\exception\ModelNotFoundException
     * @throws \think\exception\DbException
     */
    public function auth(Request $request)
    {
        $spreadId = intval($request->param('spread'));
        $login_type = $request->param('login_type', 1);
        @file_put_contents("auth.txt", json_encode(input()));
        try {
            $wechatInfo = WechatService::oauthService($this->cid)->user()->getOriginal();
        } catch (\Exception $e) {
            $this->error(['message' => $e->getMessage(), 'line' => $e->getLine()]);
        }
        @file_put_contents("auth.txt", "\r\n" . json_encode($wechatInfo), 8);
        try {
            if (!isset($wechatInfo['nickname'])) {
                try {
                    $wechatInfo = WechatService::getUserInfo($this->cid, $wechatInfo['openid']);
                } catch (\Exception $e) {
                    $this->error(['message' => $e->getMessage(), 'line' => $e->getLine()]);
                }
                if (!$wechatInfo['subscribe'] && !isset($wechatInfo['nickname']))
                    exit(WechatService::oauthService($this->cid)->scopes(['snsapi_userinfo'])
                        ->redirect($this->request->url(true))->send());
                if (isset($wechatInfo['tagid_list']))
                    $wechatInfo['tagid_list'] = implode(',', $wechatInfo['tagid_list']);
            } else {
                if (isset($wechatInfo['privilege'])) unset($wechatInfo['privilege']);
                if (!UserRelation::where(['openid' => $wechatInfo['openid']])->find())
                    $wechatInfo['subscribe'] = 0;
            }
            $openid = $wechatInfo['openid'];
            $wechatInfo['cid'] = $this->cid;
            $params = [$openid, $wechatInfo, $spreadId, $login_type];
            @file_put_contents("auth.txt", "\r\n" . json_encode($params), 8);
            Hook::exec("\\app\admin\\behavior\\User", "WechatOauth", $params);
            $user = User::where('id', UserRelation::openidToUid($openid, 'openid'))->find();
            if (!$user)
                $this->error('获取用户失败');

            $this->auth->direct($user['id']);
            // 设置推广关系
            User::setSpread(intval($spreadId), $user->id);
            return $this->success('登录成功', $this->auth->getUserinfo());
        } catch (Exception $e) {
            @file_put_contents("error.txt", $e->getFile() . '-', $e->getLine(), '-' . $e->getMessage());
        }
    }
//
//    /**
//     * 扣款服务
//     * @param Request $request
//     * @return mixed
//     * @throws \think\db\exception\DataNotFoundException
//     * @throws \think\db\exception\ModelNotFoundException
//     * @throws \think\exception\DbException
//     */
//    public function signing(Request $request)
//    {
//        $price = intval($request->param('price'));
//        $uid = intval($request->param('uid'));
//        $cid = intval($request->param('cid'));
//        $plan_id = WechatPlan::where('price', $price)->value('plan_id');
//        $p_id = WechatPlan::where('price', $price)->value('id');
////        var_dump($plan_id);
////        var_dump($p_id);die();
////        $plan_id = 11;
////        $p_id = 12;
//        try {
////            $notify_url=Request::instance()->domain() . "/api/wechat/notify/" . $cid; //回调接口
////            $app_id = 'wx5681205d1ef4d9d3';
//            $app_id = Company::where('id', $cid)->value('wechat_appid');
////            $mch_id = '1623907696';
//            $mch_id = Company::where('id', $cid)->value('pay_weixin_mchid');
//            $key = Company::where('id', $cid)->value('pay_weixin_key');
//            @file_put_contents("quanju.txt", $key . "-key\r\n", 8);
//            $contract_code = $this->generateRandomString(12);
//            $notify_url = Request::instance()->domain() . "/api/wechat/notify/" . $cid; //回调接口  $cid 企业id
////            $num = time() + mt_rand(10, 999999) . '' . substr($msec, 2, 3);//生成随机数
////            $request_serial=$this->generateUniqueSerialNumber();
//            $request_serial = WechatPlanRecord::where('is_signing', 0)->order('request_serial desc')->value('request_serial');
//            if (empty($request_serial)) {
//                $request_serial = 100000;
//            } else {
//                $request_serial = $request_serial + 1;
//            }
//            $contract_display_account = User::where('id', $uid)->value('nickname');
//            if (empty($contract_display_account)){
//                $this->error('用户不存在!');
//            }
//            $timestamp = time();
//            $version = '1.0';
//            $array = array(
//                'appid' => $app_id,
//                'mch_id' => $mch_id,
//                'plan_id' => $plan_id,
////                'sub_mch_id' => $sub_mch_id,
//                'contract_code' => $contract_code,
//                'notify_url' => $notify_url,
//                'contract_display_account' => $contract_display_account,
//                'request_serial' => $request_serial,
//                'timestamp' => $timestamp,
//                'version' => $version,
//
//            );
//
//
//            ksort($array);
//            $xml = '';
//            foreach ($array as $key => $value) {
//                $xml = $xml . $key . '=' . $value . '&';
//            }
//            $xml = substr($xml, 0, -1);
//            @file_put_contents("quanju.txt", $xml . "-签约内容\r\n", 8);
//            $sign = $this->md5_sign($xml, $key);
//            @file_put_contents("quanju.txt", $sign . "-签名\r\n", 8);
//            $url = 'https://api.mch.weixin.qq.com/papay/entrustweb?' . $xml . '&sign=' . $sign;
//            @file_put_contents("quanju.txt", $url . "-链接\r\n", 8);
////            var_dump($url);
//            $response = $this->curl_get($url);
////            $url = $this->OfficialAccountSigning($app_id, $mch_id, $plan_id, $contract_code, $request_serial, $contract_display_account, $notify_url, $version, $sign, $timestamp);
//            @file_put_contents("quanju.txt", $response . "-返回链接\r\n", 8);
//
//            WechatPlanRecord::create([
//                'uid' => $uid,
//                'plan_id' => $plan_id,
//                'price' => $price,
//                'is_signing' => 0,
//                'request_serial' => $request_serial,
//                'contract_code' => $contract_code,
//                'contract_display_account' => $contract_display_account,
//                'createtime' => time(),
//                'cid' => 12,
//            ]);
////            die();
//            $this->success('获取成功', $response);
////            return $response;
//        } catch (Exception $e) {
////            var_dump($e->getMessage());
//            @file_put_contents("quanju.txt", $e->getMessage() . "-报错信息\r\n", 8);
//            @file_put_contents("error.txt", $e->getFile() . '-', $e->getLine(), '-' . $e->getMessage());
//        }
//    }
//
//    /**
//     * 解约扣款服务
//     * @param Request $request
//     * @return mixed
//     * @throws \think\db\exception\DataNotFoundException
//     * @throws \think\db\exception\ModelNotFoundException
//     * @throws \think\exception\DbException
//     */
//    public function delete_signing(Request $request)
//    {
//        $record_id = intval($request->param('id'));
//        $uid = intval($request->param('uid'));
//        $cid = intval($request->param('uid'));
//        try {
////            $notify_url=Request::instance()->domain() . "/api/wechat/notify/" . $cid; //回调接口
//            $app_id = Company::where('id', $cid)->value('wechat_appid');
//            $mch_id = Company::where('id', $cid)->value('pay_weixin_mchid');
//            $contract_code = WechatPlanRecord::where('id', $record_id)->value('contract_code');
//            $plan_id = WechatPlanRecord::where('id', $record_id)->value('plan_id');
//            $contract_termination_remark = '解约备注';
//            $version = '1.0';
//            $array = array(
//                'appid' => $app_id,
//                'mch_id' => $mch_id,
//                'plan_id' => $plan_id,
//                'contract_code' => $contract_code,
//                'contract_termination_remark' => $contract_termination_remark,
//                'version' => $version
//            );
//
//
//            ksort($array);
//            $xml = '';
//            foreach ($array as $key => $value) {
//                $xml = $xml . $key . '=' . $value . '&';
//            }
//            $xml = substr($xml, 0, -1);
//            @file_put_contents("quanju.txt", json_encode($xml) . "-签约内容\r\n", 8);
//            $sign = $this->md5_sign($xml, '192006250b4c09247ec02edce69f6a2d');
//            @file_put_contents("quanju.txt", $sign . "-签名\r\n", 8);
//            $url = 'https://api.mch.weixin.qq.com/papay/deletecontract?' . $xml . '&sign=' . $sign;
//            @file_put_contents("quanju.txt", $url . "-链接\r\n", 8);
//            var_dump($url);
////            $response = $this->curl_get($url);
////            $url=$this->OfficialAccountSigning($app_id,$mch_id,$plan_id,$contract_code,$request_serial,$contract_display_account,$notify_url,$version,$sign,$timestamp);
////            @file_put_contents("quanju.txt", $response.'返回链接');
//
//            WechatPlanRecord::where('id', $record_id)->update(['is_signing' => 1]);
//            die();
//            return 1;
//        } catch (Exception $e) {
//            @file_put_contents("error.txt", $e->getFile() . '-', $e->getLine(), '-' . $e->getMessage());
//        }
//    }
//
//    public function generateRandomString($length)
//    {
//        $characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
//        $charactersLength = strlen($characters);
//        $randomString = '';
//        for ($i = 0; $i < $length; $i++) {
//            $randomString .= $characters[rand(0, $charactersLength - 1)];
//        }
//        return $randomString;
//    }
//
////    生成唯一序列号
//    public function generateUniqueSerialNumber()
//    {
//        // 使用uniqid生成一个唯一ID,并去除前缀的'0'
//        $uniqueId = ltrim(uniqid('', true), '0');
//
//        // 确保生成的ID不以0开头且长度不超过19位(int64的最大长度)
//        while (strlen($uniqueId) > 19 || substr($uniqueId, 0, 1) === '0') {
//            $uniqueId = ltrim(uniqid('', true), '0');
//        }
//
//        // 将生成的ID转换为纯数字
//        $serialNumber = preg_replace('/\D/', '', $uniqueId);
//
//        // 确保生成的序列号不以0开头
//        if (substr($serialNumber, 0, 1) === '0') {
//            $serialNumber = generateUniqueSerialNumber(); // 递归调用以重新生成
//        }
//
//        return $serialNumber;
//    }
//
//
//    public function curl_post($url = '', $name = array(), $timeout = 100)
//    {
//        // var_dump($url);die();
//        $ch = curl_init();
//        curl_setopt($ch, CURLOPT_URL, $url);
//        curl_setopt($ch, CURLOPT_HEADER, false); //是否显示头部
//        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);//是否直接输出到屏幕
//        curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
//        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 跳过证书检查
//        curl_setopt($ch, CURLOPT_POST, true); //是否以post方式
//        //设置post数据
//        $post_data = json_encode($name);
//        // curl_setopt($curl, CURLOPT_POSTFIELDS, $post_data);
//        curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
//        $content = curl_exec($ch);
//        // var_dump($content);die();
//        curl_close($ch);
//        $content = json_decode($content, true);
//        return $content;
//
//    }
//
//    public function curl_get(string $url, $timeout = 100)
//    {
////        if (!empty($name)) {
////            $data = '&';
////            foreach ($name as $k => $v) {
////                $data = $data . $k . '=' . $v.'&';
////            }
////            $url = $url . $data;
////        }
////        $url = substr($url,0,-1);
//        $ch = curl_init();
//        curl_setopt($ch, CURLOPT_URL, $url);
//        curl_setopt($ch, CURLOPT_HEADER, false); //是否显示头部
//        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);//是否直接输出到屏幕
//        curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
//        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 跳过证书检查
//
//        $content = curl_exec($ch);
//        curl_close($ch);
////        $content = json_decode($content, true);
//        // $content = (array)$content;
//         var_dump($content);die();
//        return $content;
//    }
//
//    public function md5_sign($data, $key)
//    {
//        $stringSignTemp = $data . "&key=$key"; //注:key为商户平台设置的密钥key
//
//        $sign = MD5($stringSignTemp); //MD5加密
//        $sign = strtoupper($sign); //大写
//        return $sign;
//    }
//
//    /**
//     * 公众号签约
//     * see:https://pay.weixin.qq.com/wiki/doc/api/wxpay_v2/papay/chapter3_1.shtml
//     * @param array $data
//     *
//     * @return array
//     * @throws AuthorizeFailedException
//     */
//    public function OfficialAccountSigning(string $appid, string $mch_id, string $plan_id, string $contract_code, string $request_serial, string $contract_display_account, string $notify_url, string $version, string $sign, string $timestamp): array
//    {
//
//        $url = 'https://api.mch.weixin.qq.com/papay/entrustweb';
//        $info = [
//            'appid' => $appid,  //应用ID
//            'mch_id' => $mch_id,  //商户号
//            'plan_id' => $plan_id,  //模板id
////            'sub_mch_id' => $sub_mch_id,  //子商户号
//            'contract_code' => $contract_code, //签约协议号
//            'request_serial' => $request_serial, //请求序列号
//            'contract_display_account' => $contract_display_account, //用户账户展示名称
//            'notify_url' => $notify_url, //回调通知url
//            'version' => $version, //版本号 固定值1.0
//            'sign' => $sign, //签名
//            'timestamp' => $timestamp
//        ];
//        $response = $this->curl_get($url, $info);
//        return $response;
//    }
//
//    public function test()
//    {
//        return '123456';
//    }

    public function signing_plan()
    {
        $this->success('获取成功', WechatPlan::where('cid', 12)->select());
    }

//    用户签约列表
    public function user_signing(Request $request)
    {
        $uid = intval($request->param('uid'));
        $this->success('获取成功', WechatPlanRecord::where('uid', $uid)->where('is_signing', 0)->select());
    }
}