/** * 执行签到 * @param string $act 活动token * @param string $user openId * @return int 签到排名,失败返回false */ public static function checkin($act, $user, $nickname) { $item = array('openid' => $user, 'time' => date("Y-m-d H:i:s", time()), 'nickname' => $nickname); $cache = Vera_Cache::getInstance(); $key = 'rollcall_' . $act . '_list'; $rank = false; do { $list = $cache->get($key, NULL, $cas); //使用Memcached特性cas,保证高并发时的准确性 if ($cache->getResultCode() == Memcached::RES_NOTFOUND) { if ($list = Library_File::load($act)) { if (!($rank = self::getRank($list, $user))) { $list[] = $item; $rank = count($list); } $newList = $list; } else { $newList = array($item); //两层Array $rank = 1; } $cache->add($key, $newList, 86400); //原子性的插入,签到记录的缓存保存二十四小时 } else { if (!($rank = self::getRank($list, $user))) { $list[] = $item; $cache->cas($cas, $key, $list); $rank = count($list); } } } while ($cache->getResultCode() != Memcached::RES_SUCCESS); return $rank; }
/** * 扫码送网薪接口 * @param string $num 厦大学号 * @param int $award 发放网薪额度 * @param string $act 扫码活动md5 * @param string $end 扫码活动结束时间 * @return string 网薪发放情况 * @author Nili */ public static function pay($num, $award, $act, $end) { $yibanInfo = Data_Db::getYibanInfoByXmuNum($num); $key = 'rollcall_' . $act . '_award' . $num; $cache = Vera_Cache::getInstance(); if (!empty($cache->get($key))) { return '您已在该活动获得过网薪'; } if (!$yibanInfo['yiban_islinked']) { return '未绑定易班身份,无法获得网薪'; } if ($yibanInfo['expire_time'] < date('Y-m-d H:i:s')) { return '易班身份已过期,无法获得网薪'; } Vera_Autoload::changeApp('yiban'); $ret = Data_Yiban::awardSalary($yibanInfo['yiban_uid'], $yibanInfo['access_token'], $award); Vera_Autoload::reverseApp(); if ($ret) { $cache->set($key, 1, $end); return "{$award}网薪已发往您的账户"; } else { return ''; //网薪发放失败 } }
public function run() { $acts = self::getActs(); $cache = Vera_Cache::getInstance(); foreach ($acts as $act) { $key = 'rollcall_' . $act['md5'] . '_list'; if ($list = $cache->get($key)) { Library_File::write($act['md5'], $list); } } return true; }
/** * 获取 access_token * @param string $appId appID * @param string $appSecret appSecret * @return string access_token */ public static function getJsTicket($appId, $appSecret) { $key = 'wechat_jsapi_ticket'; $cache = Vera_Cache::getInstance(); $ret = $cache->get($key); if ($cache->getResultCode() == Memcached::RES_SUCCESS) { return $ret; } $accessToken = self::getAccessToken($appId, $appSecret); $api = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=%s&type=jsapi"; $url = sprintf($api, $accessToken); $handle = curl_init(); $options = array(CURLOPT_URL => $url, CURLOPT_HEADER => 0, CURLOPT_RETURNTRANSFER => 1); curl_setopt_array($handle, $options); $content = curl_exec($handle); if (curl_errno($handle)) { //检查是否有误 return false; } curl_close($handle); $content = json_decode($content, true); $cache->set($key, $content['ticket'], $content['expires_in'] - 60); //保险起见减去60秒 return $content['ticket']; }
public function addUserToPushList($openid, $content, $time) { $cache = Vera_Cache::getInstance(); $key = 'wechat_push_list'; //单用户推送列表 }
/** * 插入和修改活动信息 * @param int $owner 所有者学工号 * @param string $name 活动名称 * @param datatime $start 活动开始时间 * @param datatime $end 活动结束时间 * @param string $extra 附加信息 * @param string $md5 活动token * @return int 影响的行数 */ public static function setAct($owner, $name, $start, $end, $extra = '', $md5 = NULL) { if ($md5 == NULL) { //如果需要修改活动,务必携带活动token作为md5 $md5 = md5($owner . $name . $start . $end); } $update = array('owner' => $owner, 'name' => $name, 'startTime' => $start, 'endTime' => $end, 'extra' => $extra); $insert = array_merge($update, array('md5' => $md5)); $cache = Vera_Cache::getInstance(); $key = 'rollcall_' . $md5 . '_info'; $cache->set($key, $update, strtotime($update['endTime']) + 3600); //活动详情的缓存多保留一小时 //利用MySQL特性 ON DUPLICATE KEY UPDATE,当违反md5的unique时,使用update //保证md5唯一并且自始至终都不变 return $db->insert('rollcall_Board', $insert, NULL, $update); }