<?php

namespace app\api\controller;

use app\common\controller\Api;
use app\utils\Easywechat\MiniAppService;
use app\utils\LogUtil;
use app\utils\PayUtil;
use think\Cache;
use think\Request;

/**
 * 通行证
 */
class Passport extends Api
{
    // 日志模块名称
    const LOG_MODULE = 'Passport';
    protected $noNeedLogin = ['loginWxMini', 'loginWxMiniPhone', 'testPay', 'pay_notify'];
    protected $noNeedRight = '*';
    protected $model       = null;

    public function _initialize()
    {
        parent::_initialize();
    }

    public function __construct(Request $request = null)
    {
        parent::__construct($request);
        //日志统一写入
        register_shutdown_function([new LogUtil, 'close']);
        LogUtil::getInstance('Api/'); //设置日志存入通道
    }

    /**
     * 微信小程序手机号授权
     * @return void
     */
    public function loginWxMiniPhone()
    {
        // 获取参数
        $params = $this->request->param();
        if (empty($params['code'])) {
            $this->error('The code is required.');
        }

        $wxMiniApp = new MiniAppService();
        $wx        = $wxMiniApp->getUserPhone($params['code']);
        if (empty($wx['phone_info']['purePhoneNumber'])) {
            $this->error('手机号授权失败.', $wx);
        }

        $mobile = $wx['phone_info']['purePhoneNumber'];
        $extend = [];
        if (!empty($params['openid']) && $wxInfo = Cache::get($params['openid'])){
            $extend['mini_openid'] = $wxInfo['openid'] ?? '';
            $extend['mini_sessionkey'] = $wxInfo['session_key'] ?? '';
        }

        // 校验手机号登录信息
        list($exists, $user_id) = UserModel::checkExists('', $mobile);
        if (!$exists) {
            // 手机号不存在 创建账号
            $ret = $this->auth->register('1', '1', '', $mobile, $extend);
            if (!$ret) {
                $this->error("注册失败!");
            }
            $user_id = $this->auth->id;
        }

        // 写入登录Cookies和Token
        if (!$this->auth->direct($user_id,$extend)) {
            $this->error($this->auth->getError());
        }
        $userInfo = $this->auth->getUserinfo();
        $result   = [
            'token' => $userInfo['token'],
//            'userInfo' => $userInfo
        ];
        $this->success('登录成功', $result);
    }

    /**
     * 微信小程序授权
     *
     * @return void
     */
    public function loginWxMini()
    {
        // 获取参数
        $params = $this->request->param();
        if (empty($params['code'])) {
            $this->error('The code is required.');
        }

        $wxMiniApp = new MiniAppService();
        $res       = $wxMiniApp->login($params['code']);

        if (empty($res['openid'])) {
            $this->error('授权失败,请重试');
        }

        $sign = md5($res['openid']);

        Cache::set($sign, $res, 3600);

        $this->success('success', [
            'openid' => $sign
        ]);
    }

    /**
     * 测试 汇付 支付
     */
    /*public function testPay()
    {
        $params = \request()->post();
        $order_no = $params['order_no'] ?? '';
        if ($params['openid'] != 9696){
            $wxInfo = Cache::get($params['openid'] ?? '');
            $openid = $wxInfo['openid'] ?? '';
//        $sessionKey = $wxInfo['session_key'] ?? '';
        }else{
            $openid = 'ol8qS68vKSgWJ3Unrgfyi3rkakcQ';
        }

        $order_no = !empty($order_no) ? $order_no : time() . rand(1, 200);

        $pay = new PayUtil();
        $notify_url = 'http://app.zhiyinvip001.com/api/passport/pay_notify';
        if (!$pay->jsPay($openid, "D0{$order_no}", '0.01', '开通会员', $notify_url)){
            $this->error($pay->getMessage());
        }

        $res = $pay->getData();
        if (empty($res['data']['pay_info']) || !$pay_info = json_decode($res['data']['pay_info'],true)){
            $this->error('支付信息有误');
        }

        $this->success('success', [
            'pay_info' => $pay_info,
            'order_no' => $order_no
        ]);
    }*/

    /**
     * 支付回调
     * @return void
     */
    public function pay_notify(Request $request)
    {
        $params = $request->param();

        // 消息主体信息
        $resp_data = json_decode(stripslashes(htmlspecialchars_decode($params['resp_data'] ?? '')),true);
        unset($params['resp_data']);

        LogUtil::info('支付回调参数', self::LOG_MODULE, __FUNCTION__,[
            'params' => $params,
            'resp_data' => $resp_data,
        ]);

        if (empty($params['resp_code']) || $params['resp_code'] != '00000000' || empty($resp_data)){
            LogUtil::info('回调信息有误', self::LOG_MODULE, __FUNCTION__,"resp_code error");
            $this->error('支付信息有误');
        }


        $this->success();
    }
}