<?php
namespace app\api\controller;
use app\common\controller\Api;
use app\common\model\User as UserModel;
use app\common\model\UserRelation;
use app\common\model\User;
use liuniu\MiniProgramService;
use liuniu\UtilService;
use think\Hook;
use think\Request;

class MiniProgram extends  Api
{
    protected $noNeedLogin = ['*'];
    /**
     * 小程序授权登录
     * @param Request $request
     * @return mixed
     * @throws \Psr\SimpleCache\InvalidArgumentException
     * @throws \think\db\exception\DataNotFoundException
     * @throws \think\db\exception\ModelNotFoundException
     * @throws \think\exception\DbException
     */
    public function mp_auth(Request $request)
    {

        $cache_key = '';
        list($code, $post_cache_key, $login_type) = UtilService::postMore([
            ['code', ''],
            ['cache_key', ''],
            ['login_type', '2']
        ], $request, true);
        $session_key = cache('eb_api_code_',$post_cache_key);
        if (!$code && !$session_key)
            $this->error('授权失败,参数有误');
        if ($code && !$session_key) {
            try {
                $userInfoCong = MiniProgramService::getUserInfo($this->cid,$code);
                $session_key = $userInfoCong['session_key'];
                $cache_key = md5(time() . $code);
                cache('eb_api_code_'.$cache_key,$session_key, 86400);
            } catch (\Exception $e) {
                $this->error('',['message' => $e->getMessage(), 'line' => $e->getLine()]);
            }
        }
        $data = UtilService::postMore([
            ['spread_spid', 0],
            ['spread_code', ''],
            ['iv', ''],
            ['encryptedData', ''],
        ]);//获取前台传的code
        try {
            //解密获取用户信息
            $userInfo = MiniProgramService::encryptor($this->cid,$session_key, $data['iv'], $data['encryptedData']);
        } catch (\Exception $e) {
            $this->error('签名无效，重新刷新'.$e->getMessage());
        }
        if (!isset($userInfo['unionId'])) $userInfo['unionId'] = '';
        if(!isset($userInfo['openId']) && isset($userInfoCong['openid']))  $userInfo['openId'] = $userInfoCong['openid'];
        if(!isset($userInfo['openId'])) $this->error('获取openId失败!');
        $userInfo['spid'] = $data['spread_spid'];
        $userInfo['code'] = $data['spread_code'];
        $userInfo['session_key'] = $session_key;
        $userInfo['login_type'] = $login_type;
        $userInfo['cid'] = $this->cid;
        User::routineOauth($userInfo);
        $user = User::where('id', UserRelation::openidToUid($userInfo['openId'], 'routine_openid'))->find();
        if (!$user)
            $this->error('获取用户失败');
        $this->auth->direct($user['id']);
        return $this->success('登录成功', $this->auth->getUserinfo());

    }


    /**
     * 小程序支付回调
     */
    public function notify()
    {
        MiniProgramService::handleNotify();
    }

    /**
     * 获取小程序订阅消息id
     * @return mixed
     */
    public function teml_ids()
    {
        $temlIdsName = SubscribeTemplateService::getConstants();
        $temlIdsList = CacheService::get('TEML_IDS_LIST', function () use ($temlIdsName) {
            $temlId = [];
            foreach ($temlIdsName as $key => $item) {
                $temlId[strtolower($key)] = SubscribeTemplateService::setTemplateId($item);
            }
            return $temlId;
        });
        return app('json')->success($temlIdsList);
    }

}
