Yuanxiao.php 11.5 KB
<?php

use Action\HuodongAction;
use Cuxiao\YuanxiaoModel;
use Plugin\Helpers;

/**
 * 元宵抽签活动
 */
class YuanxiaoController extends HuodongAction
{
    // const STATIC_FILE = 'http://localhost:2222/assets/1.1.3';
    const STATIC_FILE = 'http://cdn.yoho.cn/huodong/2016yuanxiao/1.1.5';
    const ENCRYPT_KEY = 'iamgtskkwhoareyou';

    /**
     * 元宵抽签
     */
    public function indexAction()
    {
        $playUrl = Helpers::url('/cuxiao/yuanxiao/info');
        $playUrlEncode = strtr($playUrl, array('/' => '\\/'));

        $this->_view->display('index', array(
            'staticTitle' => '2016潮流运势测试',
            'staticFile' => self::STATIC_FILE,
            'staticJS' => array(
                'home.js'
            ),
            'shareDesc' => '元宵节快乐!一起来YOHO!BUY有货玩2016年潮流开运测试!',
            'shareImg' => 'http://img02.yohoboys.com/staticimg/2016/02/19/16/02dbd38c84eccf1097b7e240452f0de856.png',
            'shareUrl' => Helpers::url('/cuxiao/yuanxiao/index'),
            'playUrl' => $this->isApp() ? $playUrl . '?openby:yohobuy={"action":"go.weblogin","params":{"jumpurl":{"url":"' . $playUrlEncode . '","param":{"from":"app"}},"requesturl":{"url":"","param":{}},"priority":"N"}}': $playUrl,
        ));
    }

    /**
     * 元宵抽签 信息
     */
    public function infoAction()
    {
        $uid = $this->getLoggedUid();
        if (!$uid) {
            if (!$this->_isApp) {
                $this->go(Helpers::url('/signin.html', array('refer' => Helpers::url('/cuxiao/yuanxiao/info')), 'default'));
            } else {
                $playUrl = Helpers::url('/cuxiao/yuanxiao/index');
                $this->go($playUrl . '?yohobuy={"action":"go.h5","params":{"islogin":"N","type":0,"url":"' . $playUrl . '","param":{}}}');
            }
        }

        // POST提交请求
        $posts = $this->post();
        if (!empty($posts)) {
            $nickName = $this->post('nick', '');
            $birthday = $this->post('birthday', '');
            $gender = $this->post('gender', 1);

            // 格式化日期以便接口接收
            $FormatBirthday = date_format(date_create_from_format('Y年m月d日', $birthday), 'Y-m-d');

            // 调用接口
            $result = YuanxiaoModel::getChouqianInfo($uid, $nickName, $FormatBirthday, $gender);

            if ($result['code'] === 200) { // 处理成功就跳转到等待页
                // 将返回的结果存入cookeie中15分钟
                $cookieData = array(
                    'name' => $nickName,
                    'type' => $result['data']['randomCode']
                );
                $this->setCookie('yuanxiaochouqian', json_encode($cookieData), time() + 15 * 60);

                $waitUrl = Helpers::url('/cuxiao/yuanxiao/wait');
                $this->go(!$this->isWeixin() ? $waitUrl . '?openby:yohobuy={"action":"go.h5","params":{"url":"' . $waitUrl . '","islogin":"N","param":{"from":"app"}}}' : $waitUrl);

            } else { // 不成功就显示返回的错误信息

                $this->_view->display('info', array(
                    'staticTitle' => '2016潮流运势测试',
                    'staticFile' => self::STATIC_FILE,
                    'staticJS' => array(
                        'info.js'
                    ),
                    'shareDesc' => '元宵节快乐!一起来YOHO!BUY有货玩2016年潮流开运测试!',
                    'shareImg' => 'http://img02.yohoboys.com/staticimg/2016/02/19/16/02dbd38c84eccf1097b7e240452f0de856.png',
                    'shareUrl' => Helpers::url('/cuxiao/yuanxiao/index'),
                    'birthday' => $birthday,
                    'birthdayNumber' => $FormatBirthday,
                    'gender' => $gender,
                    'isBoy' => $gender == 1, // 性别是否是女标志位
                    'message' => $result['message']
                ));
            }
        } else {
            $userData = YuanxiaoModel::getUserProfileData($uid);

            $this->_view->display('info', array(
                'staticTitle' => '2016潮流运势测试',
                'staticFile' => self::STATIC_FILE,
                'staticJS' => array(
                    'info.js'
                ),
                'shareDesc' => '元宵节快乐!一起来YOHO!BUY有货玩2016年潮流开运测试!',
                'shareImg' => 'http://img02.yohoboys.com/staticimg/2016/02/19/16/02dbd38c84eccf1097b7e240452f0de856.png',
                'shareUrl' => Helpers::url('/cuxiao/yuanxiao/index'),
                'birthday' => date_format(date_create($userData['birthday']), 'Y年m月d日'),
                'birthdayNumber' => $userData['birthday'],
                'gender' => $userData['gender'],
                'isBoy' => $userData['gender'] == 1 // 性别是否是女标志位
            ));
        }
    }

    /**
     * 元宵抽签 等待
     */
    public function waitAction()
    {
        $activityUrl = Helpers::url('/cuxiao/yuanxiao/result');
        $activityUrlEncode = strtr($activityUrl, array('/' => '\\/'));

        $this->_view->display('wait', array(
            'staticTitle' => '2016潮流运势测试',
            'staticFile' => self::STATIC_FILE,
            'activityUrl' => !$this->isWeixin() ? $activityUrl . '?openby:yohobuy={"action":"go.h5","params":{"url":"' . $activityUrlEncode . '","islogin":"N","param":{"from":"app"},"share":"'.$activityUrlEncode.'","shareparam":{"share_id":"19"}}}' : $activityUrl,
            'staticJS' => array(
                'wait.js'
            ),
            'shareDesc' => '元宵节快乐!一起来YOHO!BUY有货玩2016年潮流开运测试!',
            'shareImg' => 'http://img02.yohoboys.com/staticimg/2016/02/19/16/02dbd38c84eccf1097b7e240452f0de856.png',
            'shareUrl' => Helpers::url('/cuxiao/yuanxiao/index'),
        ));
    }

    /**
     * 元宵抽签 结果
     */
    public function resultAction()
    {
        $result = $this->getCookie('yuanxiaochouqian', null);
        if (empty($result)) { // 未取到信息就重新测试
            $this->go(Helpers::url('/cuxiao/yuanxiao/info'));
        }

        // cookie中存的结果
        $result = json_decode($result, true);
        $shareUrl = Helpers::url('/cuxiao/yuanxiao/share', array(
            'hash' => $this->encrypt($this->getUid()),
            'type' => $this->encrypt($result['type']),
            'name' => $this->encrypt($result['name'])
        ));

        $this->_view->display('result', array(
            'staticTitle' => '2016潮流运势测试',
            'needShare' => $this->checkNeedShare(), // 是否需要微信分享
            'staticFile' => self::STATIC_FILE,
            'result' => $result,
            'shareTitle' => $result['name'] . '的2016年潮流运势是' . $this->getChouqianTitle($result['type']),
            'shareDesc' => '元宵节快乐!一起来YOHO!BUY有货玩2016年潮流开运测试!',
            'shareImg' => 'http://img02.yohoboys.com/staticimg/2016/02/19/16/02dbd38c84eccf1097b7e240452f0de856.png',
            'shareUrl' => $shareUrl,
            'staticJS' => array(
                'result.js'
            )
        ));
    }

    /**
     * 元宵抽签 分享
     */
    public function shareAction()
    {
        // 用户UID
        $uid = $this->decrypt($this->get('hash', ''));
        if (empty($uid)) {
            $this->go(Helpers::url('/cuxiao/yuanxiao/index'));
        }
        // 抽签结果
        $type = $this->decrypt($this->get('type', ''));
        $name = $this->decrypt($this->get('name', ''));

        // 调用接口获取type和count
        $result = YuanxiaoModel::getChoujiangShareInfo($uid);

        $this->_view->display('share', array(
            'staticTitle' => '2016潮流运势测试',
            'staticFile' => self::STATIC_FILE,
            'result' => array(
                'name' => $name ?: $result['name'],
                'type' => $type ?: $result['type']
            ),
            'count' => $result['total'],
            'staticJS' => array(
                'share.js'
            ),
            'shareDesc' => '元宵节快乐!一起来YOHO!BUY有货玩2016年潮流开运测试!',
            'shareImg' => 'http://img02.yohoboys.com/staticimg/2016/02/19/16/02dbd38c84eccf1097b7e240452f0de856.png'
        ));
    }

    /**
     * 根据结果类型获取抽签结果标题
     * @param $type
     */
    private function getChouqianTitle($type)
    {
        $data = array(
            'P1' => '成为一个大写加粗的潮人!',
            'P2' => '逼格满载盐值爆表!',
            'P3' => '运气爆棚,拥有Yeezy不是梦!',
            'P4' => '街拍不断,成为网红不是梦!',
            'M1' => '穿着MA-1飞行夹克一飞冲天!',
            'M2' => '把妹不花钱!买鞋不排队!',
            'M3' => '穿着跑鞋到达人生巅峰!',
            'M4' => '帅气多金颜值高!',
            'F1' => '拥有拆不完的快递和礼物!',
            'F2' => '被男神强势壁咚!',
            'F3' => '腿细胸大屁股翘!',
            'F4' => '任何style都轻松驾驭!'
        );

        return $data[$type];
    }

    /**
     * 检测登录状态
     *
     * @return int
     */
    private function getLoggedUid()
    {
        if ($this->_isApp) {
            $uid = $this->get('uid');
        } else {
            $uid = $this->getUid();
        }

        return $uid;
    }

    /**
     * 判断是否是APP访问
     *
     * @return bool
     */
    private function isApp()
    {
        return (null !== $this->get('app_version'));
    }

    /**
     * 判断是否需要微信分享
     * @return bool
     */
    private function checkNeedShare()
    {
        if (strpos($_SERVER['HTTP_USER_AGENT'], 'MicroMessenger') !== false || $this->_isApp) {
            return true;
        }

        return false;
    }
    
    /**
     * 判断是否是微信访问
     */
    private function isWeixin()
    {
        return (strpos($_SERVER['HTTP_USER_AGENT'], 'MicroMessenger') !== false);
    }

    /**
     * 加密字符串
     *
     * @param string $data 需要加密的字符串
     * @return string 加密之后的字符串
     */
    private function encrypt($data)
    {
        $data = strval($data);
        $key = md5(self::ENCRYPT_KEY);
        $x = 0;
        $len = strlen($data);
        $l = strlen($key);
        $char = '';
        $str = '';

        for ($i = 0; $i < $len; $i++) {
            if ($x == $l) {
                $x = 0;
            }
            $char .= $key{$x};
            $x++;
        }

        for ($i = 0; $i < $len; $i++) {
            $str .= chr(ord($data{$i}) + (ord($char{$i})) % 256);
        }

        return base64_encode($str);
    }

    /**
     * 解密字符串
     *
     * @param string $data 需要解密的字符串
     * @return string 解密之后的字符串
     */
    private function decrypt($data)
    {
        $key = md5(self::ENCRYPT_KEY);
        $x = 0;
        $data = base64_decode($data);
        $len = strlen($data);
        $l = strlen($key);
        $char = '';
        $str = '';

        for ($i = 0; $i < $len; $i++) {
            if ($x == $l) {
                $x = 0;
            }
            $char .= substr($key, $x, 1);
            $x++;
        }

        for ($i = 0; $i < $len; $i++) {
            if (ord(substr($data, $i, 1)) < ord(substr($char, $i, 1))) {
                $str .= chr((ord(substr($data, $i, 1)) + 256) - ord(substr($char, $i, 1)));
            } else {
                $str .= chr(ord(substr($data, $i, 1)) - ord(substr($char, $i, 1)));
            }
        }

        return $str;
    }

}