Last active
May 30, 2016 21:04
-
-
Save cawa87/7f0718fffdcb52c68ec03923ca646df4 to your computer and use it in GitHub Desktop.
IOS\Android Push
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
namespace AppBundle\APNS; | |
use AppBundle\BasePush; | |
use Doctrine\Common\Persistence\ObjectManager; | |
/** | |
* Class APNS Класс отвечает за отправку сообщений (apple push notification service) | |
* @package AppBundle\APNS | |
*/ | |
class APNS extends BasePush | |
{ | |
/** @var array */ | |
private $messages = []; | |
/** | |
* Отправка уведомлений | |
* | |
* @param string $deviceId Идентификатор устройства (поле deviceToken сущности User) | |
* @param null $type Тип сообщения. Константа этого класса TYPE_* или текст сообщения | |
* @param array $extra Добполнительные параметры (ключ - значение) которые передаются с сообщением | |
* @param string @env | |
* @return bool | |
* @throws \ApnsPHP_Exception | |
* @throws \ApnsPHP_Message_Exception | |
* @throws \ApnsPHP_Push_Exception | |
* @throws \Exception | |
*/ | |
public function send($deviceId, $type = 0, $extra = [], $text = null, $env = 'dev') | |
{ | |
if(!$this->checkByDeviceToken($deviceId)){ | |
return false; | |
} | |
// $environment = $this->isDebug | |
// ? \ApnsPHP_Abstract::ENVIRONMENT_SANDBOX | |
// : \ApnsPHP_Abstract::ENVIRONMENT_PRODUCTION; | |
$logger = new APNSLogger(); | |
$environment = \ApnsPHP_Abstract::ENVIRONMENT_PRODUCTION; | |
$push = new \ApnsPHP_Push($environment, __DIR__ . '/../Resources/apns/'.$env.'/server_certificates_bundle_sandbox.pem'); | |
$push->setRootCertificationAuthority(__DIR__ .'/../Resources/apns/'.$env.'/entrust_root_certification_authority.pem'); | |
$push->setLogger($logger); | |
$push->connect(); | |
$msg = new \ApnsPHP_Message($deviceId); | |
$msg->setSound(true); | |
$msg->setExpiry(12000); | |
if ($type) { | |
$msg->setCustomProperty('sc-event-type', $type); | |
} | |
foreach ($extra as $key => $val) { | |
$msg->setCustomProperty($key, $val); | |
} | |
$user = $this->manager->getRepository('AppBundle:User')->findOneBy([ | |
'deviceToken' => $deviceId | |
], [ | |
'lastLogin' => 'DESC' | |
]); | |
$badge = $this->manager->getRepository('AppBundle:User')->fetchNotices($user); | |
$badge = | |
(int) $badge["item_requests"] | |
+ (int) $badge["support_noread_cnt"]; | |
$msg->setBadge($badge); | |
$locale = $user->getLastLoginLocale(); | |
if($text ) { | |
$message = $text; | |
} else { | |
$message = is_numeric($type) ? $this->getMessageByType($type, $locale) : $type; | |
} | |
$msg->setText($message); | |
$push->add($msg); | |
$push->send(); | |
$push->disconnect(); | |
return 1; | |
} | |
/** | |
* Check if user have access token | Проверка существования токена у юзера | |
* @param null $deviceToken | |
* @return bool|void | |
*/ | |
public function checkByDeviceToken($deviceToken = null) | |
{ | |
if (!$deviceToken) { | |
return false; | |
} | |
$user = $this->manager->getRepository('AppBundle:User')->findOneBy([ | |
'deviceToken' => $deviceToken | |
], [ | |
'lastLogin' => 'DESC' | |
]); | |
if (!$user) { | |
return false; | |
} | |
return ($user->getAccessToken() !== null) ? true : false; | |
} | |
/** | |
* Add message to queue | |
* @param \ApnsPHP_Message $message | |
*/ | |
public function add(\ApnsPHP_Message $message) | |
{ | |
$this->messages[] = $message; | |
} | |
/** | |
* Run queue | |
* @param string $env | |
*/ | |
public function run($env = 'prod') | |
{ | |
$environment = \ApnsPHP_Abstract::ENVIRONMENT_PRODUCTION; | |
$push = new \ApnsPHP_Push($environment, __DIR__ . '/../Resources/apns/'.$env.'/server_certificates_bundle_sandbox.pem'); | |
$push->setRootCertificationAuthority(__DIR__ .'/../Resources/apns/'.$env.'/entrust_root_certification_authority.pem'); | |
$push->connect(); | |
foreach($this->messages as $message) { | |
$push->add($message); | |
} | |
$push->send(); | |
$push->disconnect(); | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
namespace AppBundle; | |
use Doctrine\Common\Persistence\ObjectManager; | |
abstract class BasePush | |
{ | |
const TYPE_UNKNOWN = 0; | |
const TYPE_NEW_SUPPORT_MSG = 1; | |
const TYPE_NEW_REQUEST = 2; | |
const TYPE_NEW_REQUEST_MSG = 3; | |
const TYPE_MEMBERSHIP_ENDING = 4; | |
const TYPE_MEMBERSHIP_END = 5; | |
const TYPE_NEW_REQUEST_MSG_YES = 6; | |
const TYPE_NEW_REQUEST_MSG_NO = 7; | |
const TYPE_ITEM_COMMENT = 8; | |
const TYPE_ITEM_HELLO_MSG = 9; | |
const TYPE_NEW_PRIVATE_MESSAGE = 10; | |
const TYPE_ADMIN_ACCOUNT_LOCK = 100; | |
const TYPE_ADMIN_ITEM_LOCK = 101; | |
const TYPE_SHIPPING_SEND = 1000; | |
const TYPE_SHIPPING_CANCELED_REQUEST = 1010; | |
const TYPE_SHIPPING_SENDED = 1020; | |
const TYPE_SHIPPING_DONE = 1030; | |
const TYPE_SHIPPING_CONFIRM = 1040; | |
const TYPE_SHIPPING_COMPLAINT_OPEN = 1050; | |
const TYPE_SHIPPING_COMPLAINT_WIN_SELLER = 1060; | |
const TYPE_SHIPPING_COMPLAINT_WIN_BUYER = 1070; | |
const TYPE_SHIPPING_CHECKOUT = 1080; | |
const TYPE_SHIPPING_MONEY_SEND = 1090; | |
/** | |
* Entity manager (Doctrine) | |
* @var ObjectManager | |
*/ | |
protected $manager; | |
/** | |
* Translator - для локализации строк | |
* @var $translator | |
*/ | |
protected $translator; | |
/** | |
* @var bool Используется песочница (режим отладки) или нет | |
*/ | |
protected $isDebug; | |
/** | |
* Конструктор (Кеп.) | |
* | |
* @todo Параметр должен задаваться через конфигурацию бандла в духе DI!!! | |
* @param bool|false $isDebug | |
*/ | |
public function __construct($isDebug = false) | |
{ | |
$this->isDebug = $isDebug; | |
} | |
/** | |
* Устанавливаем entity manager для использования внутри сервиса | |
* | |
* @param ObjectManager $manager | |
*/ | |
public function setManager(ObjectManager $manager) | |
{ | |
$this->manager = $manager; | |
} | |
/** | |
* Устанавливаем translator для изспользования внутри сервиса | |
* @param $translator | |
*/ | |
public function setTranslator($translator) | |
{ | |
$this->translator = $translator; | |
} | |
/** | |
* Получение уведомлений по типу | |
* | |
* @param $type | |
* @param string $locale | |
* @return string | |
*/ | |
public function getMessageByType($type, $locale = 'en') { | |
$messages = [ | |
self::TYPE_UNKNOWN => 'TYPE_UNKNOWN.push', | |
self::TYPE_NEW_SUPPORT_MSG => 'TYPE_NEW_SUPPORT_MSG.push', | |
self::TYPE_NEW_REQUEST => 'TYPE_NEW_REQUEST.push', | |
self::TYPE_NEW_REQUEST_MSG => 'TYPE_NEW_REQUEST_MSG.push', | |
self::TYPE_MEMBERSHIP_ENDING => 'TYPE_MEMBERSHIP_ENDING.push', | |
self::TYPE_MEMBERSHIP_END => 'TYPE_MEMBERSHIP_END.push', | |
self::TYPE_ADMIN_ACCOUNT_LOCK => 'TYPE_ADMIN_ACCOUNT_LOCK.push', | |
self::TYPE_ADMIN_ITEM_LOCK => 'TYPE_ADMIN_ITEM_LOCK.push', | |
self::TYPE_NEW_REQUEST_MSG_YES => 'TYPE_NEW_REQUEST_MSG_YES.push', | |
self::TYPE_NEW_REQUEST_MSG_NO => 'TYPE_NEW_REQUEST_MSG_NO.push', | |
self::TYPE_ITEM_COMMENT => 'TYPE_ITEM_COMMENT.push', | |
self::TYPE_NEW_PRIVATE_MESSAGE => 'TYPE_NEW_PRIVATE_MESSAGE.push', | |
self::TYPE_SHIPPING_SEND => 'TYPE_SHIPPING_SEND.push', | |
self::TYPE_SHIPPING_SENDED => 'TYPE_SHIPPING_SENDED.push', | |
self::TYPE_SHIPPING_DONE => 'TYPE_SHIPPING_DONE.push', | |
self::TYPE_SHIPPING_CONFIRM => 'TYPE_SHIPPING_CONFIRM.push', | |
self::TYPE_SHIPPING_COMPLAINT_OPEN => 'TYPE_SHIPPING_COMPLAINT_OPEN.push', | |
self::TYPE_SHIPPING_COMPLAINT_WIN_SELLER => 'TYPE_SHIPPING_COMPLAINT_WIN_SELLER.push', | |
self::TYPE_SHIPPING_COMPLAINT_WIN_BUYER => 'TYPE_SHIPPING_COMPLAINT_WIN_BUYER.push', | |
self::TYPE_SHIPPING_CHECKOUT => 'TYPE_SHIPPING_CHECKOUT.push', | |
self::TYPE_SHIPPING_MONEY_SEND => 'TYPE_SHIPPING_MONEY_SEND.push' | |
]; | |
$return = ''; | |
if (array_key_exists($type, $messages)) { | |
$return = $this->translator->trans($messages[$type], [], null, $locale); | |
} | |
return $return; | |
} | |
/** | |
* Отправка сообщения | |
* | |
* @param $deviceId | |
* @param null $type | |
* @param array $extra | |
* @param string $env | |
* @return mixed | |
*/ | |
abstract public function send($deviceId, $type = 0, $extra = [], $text = null, $env = 'dev'); | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
namespace AppBundle\GCM; | |
use AppBundle\BasePush; | |
use GuzzleHttp\Client; | |
/** | |
* Class GCM | |
* | |
* @description Класс отвечает за отправку пушей в Android приложение | |
* @package AppBundle\GCM | |
*/ | |
class GCM extends BasePush | |
{ | |
/** | |
* @var string | |
*/ | |
private $googleAPIKey = "AIzaSyChbRquIJcCH1kOky6nDQc63X8wVv1Wb34"; | |
/** | |
* Отправка уведомлений | |
* | |
* @param string $deviceId Идентификатор устройства (поле deviceToken сущности User) | |
* @param null $type Тип сообщения. Константа этого класса TYPE_* | |
* @param array $extra Добполнительные параметры (ключ - значение) которые передаются с сообщением | |
* @param string $text | |
* @param string @env | |
* @return bool | |
*/ | |
public function send($deviceId, $type = null, $extra = [], $text = null, $env = 'dev') | |
{ | |
$client = new Client(); | |
$user = $this->manager->getRepository('AppBundle:User')->findOneBy([ | |
'deviceToken' => $deviceId | |
], [ | |
'lastLogin' => 'DESC' | |
]); | |
$headers = [ | |
'Content-Type' => 'application/json', | |
'Authorization' => 'key='.$this->googleAPIKey, | |
]; | |
$locale = $user->getLastLoginLocale(); | |
if($text ) { | |
$message = $text; | |
} else { | |
$message = is_numeric($type) ? $this->getMessageByType($type, $locale) : $type; | |
} | |
$pushData = [ | |
'action' => $type | |
]; | |
$data = array_merge($pushData, $extra); | |
$body = [ | |
'notification' => [ | |
'title' => 'Push', | |
'body' => ['message' => $message, 'data' => $data] | |
], | |
'to' => $deviceId, | |
]; | |
try { | |
$request = $client->request('POST', 'https://gcm-http.googleapis.com/gcm/send', [ | |
'headers' => $headers, | |
'json' => $body | |
]); | |
} catch(\Exception $e) { | |
//do nothing | |
} | |
if(!$request) return; | |
$responseStatus = $request->getStatusCode(); | |
return $responseStatus == 200 ? true : false; | |
} | |
} | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment