client = $client; } public function setPlatform($platform) { # $required_keys = array('all', 'android', 'ios', 'winphone'); if (is_string($platform)) { $ptf = strtolower($platform); if ('all' === $ptf) { $this->platform = 'all'; } elseif (in_array($ptf, self::$EFFECTIVE_DEVICE_TYPES)) { $this->platform = array($ptf); } } elseif (is_array($platform)) { $ptf = array_map('strtolower', $platform); $this->platform = array_intersect($ptf, self::$EFFECTIVE_DEVICE_TYPES); } return $this; } public function setAudience($all) { if (strtolower($all) === 'all') { $this->addAllAudience(); return $this; } else { throw new InvalidArgumentException('Invalid audience value'); } } public function addAllAudience() { $this->audience = "all"; return $this; } public function addTag($tag) { if (is_null($this->tags)) { $this->tags = array(); } if (is_array($tag)) { foreach($tag as $_tag) { if (!is_string($_tag)) { throw new InvalidArgumentException("Invalid tag value"); } if (!in_array($_tag, $this->tags)) { array_push($this->tags, $_tag); } } } else if (is_string($tag)) { if (!in_array($tag, $this->tags)) { array_push($this->tags, $tag); } } else { throw new InvalidArgumentException("Invalid tag value"); } return $this; } public function addTagAnd($tag) { if (is_null($this->tagAnds)) { $this->tagAnds = array(); } if (is_array($tag)) { foreach($tag as $_tag) { if (!is_string($_tag)) { throw new InvalidArgumentException("Invalid tag_and value"); } if (!in_array($_tag, $this->tagAnds)) { array_push($this->tagAnds, $_tag); } } } else if (is_string($tag)) { if (!in_array($tag, $this->tagAnds)) { array_push($this->tagAnds, $tag); } } else { throw new InvalidArgumentException("Invalid tag_and value"); } return $this; } public function addAlias($alias) { if (is_null($this->alias)) { $this->alias = array(); } if (is_array($alias)) { foreach($alias as $_alias) { if (!is_string($_alias)) { throw new InvalidArgumentException("Invalid alias value"); } if (!in_array($_alias, $this->alias)) { array_push($this->alias, $_alias); } } } else if (is_string($alias)) { if (!in_array($alias, $this->alias)) { array_push($this->alias, $alias); } } else { throw new InvalidArgumentException("Invalid alias value"); } return $this; } public function addRegistrationId($registrationId) { if (is_null($this->registrationIds)) { $this->registrationIds = array(); } if (is_array($registrationId)) { foreach($registrationId as $_registrationId) { if (!is_string($_registrationId)) { throw new InvalidArgumentException("Invalid registration_id value"); } if (!in_array($_registrationId, $this->registrationIds)) { array_push($this->registrationIds, $_registrationId); } } } else if (is_string($registrationId)) { if (!in_array($registrationId, $this->registrationIds)) { array_push($this->registrationIds, $registrationId); } } else { throw new InvalidArgumentException("Invalid registration_id value"); } return $this; } public function setNotificationAlert($alert) { if (!is_string($alert)) { throw new InvalidArgumentException("Invalid alert value"); } $this->notificationAlert = $alert; return $this; } public function addWinPhoneNotification($alert=null, $title=null, $_open_page=null, $extras=null) { $winPhone = array(); if (!is_null($alert)) { if (!is_string($alert)) { throw new InvalidArgumentException("Invalid winphone notification"); } $winPhone['alert'] = $alert; } if (!is_null($title)) { if (!is_string($title)) { throw new InvalidArgumentException("Invalid winphone title notification"); } if(strlen($title) > 0) { $winPhone['title'] = $title; } } if (!is_null($_open_page)) { if (!is_string($_open_page)) { throw new InvalidArgumentException("Invalid winphone _open_page notification"); } if (strlen($_open_page) > 0) { $winPhone['_open_page'] = $_open_page; } } if (!is_null($extras)) { if (!is_array($extras)) { throw new InvalidArgumentException("Invalid winphone extras notification"); } if (count($extras) > 0) { $winPhone['extras'] = $extras; } } if (count($winPhone) <= 0) { throw new InvalidArgumentException("Invalid winphone notification"); } $this->winPhoneNotification = $winPhone; return $this; } public function setSmsMessage($content, $delay_time = 0) { $sms = array(); if (is_string($content) && mb_strlen($content) < 480) { $sms['content'] = $content; } else { throw new InvalidArgumentException('Invalid sms content, sms content\'s length must in [0, 480]'); } $sms['delay_time'] = ($delay_time === 0 || (is_int($delay_time) && $delay_time > 0 && $delay_time <= 86400)) ? $delay_time : 0; $this->smsMessage = $sms; return $this; } public function build() { $payload = array(); // validate platform if (is_null($this->platform)) { throw new InvalidArgumentException("platform must be set"); } $payload["platform"] = $this->platform; // validate audience $audience = array(); if (!is_null($this->tags)) { $audience["tag"] = $this->tags; } if (!is_null($this->tagAnds)) { $audience["tag_and"] = $this->tagAnds; } if (!is_null($this->alias)) { $audience["alias"] = $this->alias; } if (!is_null($this->registrationIds)) { $audience["registration_id"] = $this->registrationIds; } if (is_null($this->audience) && count($audience) <= 0) { throw new InvalidArgumentException("audience must be set"); } else if (!is_null($this->audience) && count($audience) > 0) { throw new InvalidArgumentException("you can't add tags/alias/registration_id/tag_and when audience='all'"); } else if (is_null($this->audience)) { $payload["audience"] = $audience; } else { $payload["audience"] = $this->audience; } // validate notification $notification = array(); if (!is_null($this->notificationAlert)) { $notification['alert'] = $this->notificationAlert; } if (!is_null($this->androidNotification)) { $notification['android'] = $this->androidNotification; if (is_null($this->androidNotification['alert'])) { if (is_null($this->notificationAlert)) { throw new InvalidArgumentException("Android alert can not be null"); } else { $notification['android']['alert'] = $this->notificationAlert; } } } if (!is_null($this->iosNotification)) { $notification['ios'] = $this->iosNotification; if (is_null($this->iosNotification['alert'])) { if (is_null($this->notificationAlert)) { throw new InvalidArgumentException("iOS alert can not be null"); } else { $notification['ios']['alert'] = $this->notificationAlert; } } } if (!is_null($this->winPhoneNotification)) { $notification['winphone'] = $this->winPhoneNotification; if (is_null($this->winPhoneNotification['alert'])) { if (is_null($this->winPhoneNotification)) { throw new InvalidArgumentException("WinPhone alert can not be null"); } else { $notification['winphone']['alert'] = $this->notificationAlert; } } } if (count($notification) > 0) { $payload['notification'] = $notification; } if (count($this->message) > 0) { $payload['message'] = $this->message; } if (!array_key_exists('notification', $payload) && !array_key_exists('message', $payload)) { throw new InvalidArgumentException('notification and message can not all be null'); } if (count($this->smsMessage)) { $payload['sms_message'] = $this->smsMessage; } if (count($this->options) <= 0) { $this->options(array('apns_production' => false)); } $payload['options'] = $this->options; return $payload; } public function toJSON() { $payload = $this->build(); $this->clearAll(); return json_encode($payload); } public function printJSON() { echo $this->toJSON(); return $this; } public function send() { $url = PushPayload::PUSH_URL; return Http::post($this->client, $url, $this->toJSON()); } public function validate() { $url = PushPayload::PUSH_VALIDATE_URL; return Http::post($this->client, $url, $this->toJSON()); } public function clearAudience() { $this->audience = null; $this->tags = null; $this->tagAnds = null; $this->alias = null; $this->registrationIds = null; } public function clearNotification() { $this->notificationAlert = null; $this->iosNotification = null; $this->androidNotification = null; $this->winPhoneNotification = null; } public function clearPlatform() { $this->platform = null; } public function clearMessage() { $this->message = null; } public function clearSmsMessage() { $this->smsMessage = null; } public function clearOptions() { $this->options = null; } public function clearAll() { $this->clearPlatform(); $this->clearAudience(); $this->clearNotification(); $this->clearMessage(); $this->clearSmsMessage(); $this->clearOptions(); } private function generateSendno() { return rand(100000, 4294967294); } # new methods public function iosNotification($alert = '', array $notification = array()) { # $required_keys = array('sound', 'badge', 'content-available', 'mutable-content', category', 'extras'); $ios = array(); $ios['alert'] = (is_string($alert) || is_array($alert)) ? $alert : ''; if (!empty($notification)) { if (isset($notification['sound']) && is_string($notification['sound'])) { $ios['sound'] = $notification['sound']; } if (isset($notification['badge'])) { $ios['badge'] = (int)$notification['badge'] ? $notification['badge'] : 0; } if (isset($notification['content-available']) && is_bool($notification['content-available']) && $notification['content-available']) { $ios['content-available'] = $notification['content-available']; } if (isset($notification['mutable-content']) && is_bool($notification['mutable-content']) && $notification['mutable-content']) { $ios['mutable-content'] = $notification['mutable-content']; } if (isset($notification['category']) && is_string($notification['category'])) { $ios['category'] = $notification['category']; } if (isset($notification['extras']) && is_array($notification['extras']) && !empty($notification['extras'])) { $ios['extras'] = $notification['extras']; } } if (!isset($ios['sound'])) { $ios['sound'] = ''; } if (!isset($ios['badge'])) { $ios['badge'] = '+1'; } $this->iosNotification = $ios; return $this; } public function androidNotification($alert = '', array $notification = array()) { # $required_keys = array('title', 'build_id', 'extras'); $android = array(); $android['alert'] = is_string($alert) ? $alert : ''; if (!empty($notification)) { if (isset($notification['title']) && is_string($notification['title'])) { $android['title'] = $notification['title']; } if (isset($notification['build_id']) && is_int($notification['build_id'])) { $android['build_id'] = $notification['build_id']; } if (isset($notification['extras']) && is_array($notification['extras']) && !empty($notification['extras'])) { $android['extras'] = $notification['extras']; } if (isset($notification['priority']) && is_int($notification['priority'])) { $android['priority'] = $notification['priority']; } if (isset($notification['category']) && is_string($notification['category'])) { $android['category'] = $notification['category`']; } if (isset($notification['style']) && is_int($notification['style'])) { $android['style'] = $notification['style']; } if (isset($notification['big_text']) && is_string($notification['big_text'])) { $android['big_text'] = $notification['big_text']; } if (isset($notification['inbox']) && is_array($notification['inbox'])) { $android['inbox'] = $notification['inbox']; } if (isset($notification['big_pic_path']) && is_string($notification['big_pic_path'])) { $android['big_pic_path'] = $notification['big_pic_path']; } } $this->androidNotification = $android; return $this; } public function message($msg_content, array $msg = array()) { # $required_keys = array('title', 'content_type', 'extras'); if (is_string($msg_content)) { $message = array(); $message['msg_content'] = $msg_content; if (!empty($msg)) { if (isset($msg['title']) && is_string($msg['title'])) { $message['title'] = $msg['title']; } if (isset($msg['content_type']) && is_string($msg['content_type'])) { $message['content_type'] = $msg['content_type']; } if (isset($msg['extras']) && is_array($msg['extras']) && !empty($msg['extras'])) { $message['extras'] = $msg['extras']; } } $this->message = $message; } return $this; } public function options(array $opts = array()) { # $required_keys = array('sendno', 'time_to_live', 'override_msg_id', 'apns_production', 'big_push_duration'); if (!empty($opts)) { $options = array(); if (isset($opts['sendno']) && is_int($opts['sendno'])) { $options['sendno'] = $opts['sendno']; } if (isset($opts['time_to_live']) && is_int($opts['time_to_live']) && $opts['time_to_live'] <= 864000 && $opts['time_to_live'] >= 0) { $options['time_to_live'] = $opts['time_to_live']; } if (isset($opts['override_msg_id']) && is_long($opts['override_msg_id'])) { $options['override_msg_id'] = $opts['override_msg_id']; } if (isset($opts['apns_production']) && is_bool($opts['apns_production'])) { $options['apns_production'] = $opts['apns_production']; } else { $options['apns_production'] = false; } if (isset($opts['big_push_duration']) && is_int($opts['big_push_duration']) && $opts['big_push_duration'] <= 1400 && $opts['big_push_duration'] >= 0) { $options['big_push_duration'] = $opts['big_push_duration']; } $this->options = $options; } return $this; } ############################################################################### ############# 以下函数已过期,不推荐使用,仅作为兼容接口存在 ######################### ############################################################################### public function addIosNotification($alert=null, $sound=null, $badge=null, $content_available=null, $category=null, $extras=null) { $ios = array(); if (!is_null($alert)) { if (!is_string($alert) && !is_array($alert)) { throw new InvalidArgumentException("Invalid ios alert value"); } $ios['alert'] = $alert; } if (!is_null($sound)) { if (!is_string($sound)) { throw new InvalidArgumentException("Invalid ios sound value"); } if ($sound !== Config::DISABLE_SOUND) { $ios['sound'] = $sound; } } else { // 默认sound为'' $ios['sound'] = ''; } if (!is_null($badge)) { if (is_string($badge) && !preg_match("/^[+-]{1}[0-9]{1,3}$/", $badge)) { if (!is_int($badge)) { throw new InvalidArgumentException("Invalid ios badge value"); } } if ($badge != Config::DISABLE_BADGE) { $ios['badge'] = $badge; } } else { // 默认badge为'+1' $ios['badge'] = '+1'; } if (!is_null($content_available)) { if (!is_bool($content_available)) { throw new InvalidArgumentException("Invalid ios content-available value"); } $ios['content-available'] = $content_available; } if (!is_null($category)) { if (!is_string($category)) { throw new InvalidArgumentException("Invalid ios category value"); } if (strlen($category)) { $ios['category'] = $category; } } if (!is_null($extras)) { if (!is_array($extras)) { throw new InvalidArgumentException("Invalid ios extras value"); } if (count($extras) > 0) { $ios['extras'] = $extras; } } if (count($ios) <= 0) { throw new InvalidArgumentException("Invalid iOS notification"); } $this->iosNotification = $ios; return $this; } public function addAndroidNotification($alert=null, $title=null, $builderId=null, $extras=null) { $android = array(); if (!is_null($alert)) { if (!is_string($alert)) { throw new InvalidArgumentException("Invalid android alert value"); } $android['alert'] = $alert; } if (!is_null($title)) { if(!is_string($title)) { throw new InvalidArgumentException("Invalid android title value"); } if(strlen($title) > 0) { $android['title'] = $title; } } if (!is_null($builderId)) { if (!is_int($builderId)) { throw new InvalidArgumentException("Invalid android builder_id value"); } $android['builder_id'] = $builderId; } if (!is_null($extras)) { if (!is_array($extras)) { throw new InvalidArgumentException("Invalid android extras value"); } if (count($extras) > 0) { $android['extras'] = $extras; } } if (count($android) <= 0) { throw new InvalidArgumentException("Invalid android notification"); } $this->androidNotification = $android; return $this; } public function setMessage($msg_content, $title=null, $content_type=null, $extras=null) { $message = array(); if (is_null($msg_content) || !is_string($msg_content)) { throw new InvalidArgumentException("Invalid message content"); } else { $message['msg_content'] = $msg_content; } if (!is_null($title)) { if (!is_string($title)) { throw new InvalidArgumentException("Invalid message title"); } $message['title'] = $title; } if (!is_null($content_type)) { if (!is_string($content_type)) { throw new InvalidArgumentException("Invalid message content type"); } $message["content_type"] = $content_type; } if (!is_null($extras)) { if (!is_array($extras)) { throw new InvalidArgumentException("Invalid message extras"); } if (count($extras) > 0) { $message['extras'] = $extras; } } $this->message = $message; return $this; } public function setOptions($sendno=null, $time_to_live=null, $override_msg_id=null, $apns_production=null, $big_push_duration=null) { $options = array(); if (!is_null($sendno)) { if (!is_int($sendno)) { throw new InvalidArgumentException('Invalid option sendno'); } $options['sendno'] = $sendno; } else { $options['sendno'] = $this->generateSendno(); } if (!is_null($time_to_live)) { if (!is_int($time_to_live) || $time_to_live < 0 || $time_to_live > 864000) { throw new InvalidArgumentException('Invalid option time to live, it must be a int and in [0, 864000]'); } $options['time_to_live'] = $time_to_live; } if (!is_null($override_msg_id)) { if (!is_long($override_msg_id)) { throw new InvalidArgumentException('Invalid option override msg id'); } $options['override_msg_id'] = $override_msg_id; } if (!is_null($apns_production)) { if (!is_bool($apns_production)) { throw new InvalidArgumentException('Invalid option apns production'); } $options['apns_production'] = $apns_production; } else { $options['apns_production'] = false; } if (!is_null($big_push_duration)) { if (!is_int($big_push_duration) || $big_push_duration < 0 || $big_push_duration > 1440) { throw new InvalidArgumentException('Invalid option big push duration, it must be a int and in [0, 1440]'); } $options['big_push_duration'] = $big_push_duration; } $this->options = $options; return $this; } }