Skip to content

Instantly share code, notes, and snippets.

@cawa87
Last active May 30, 2016 21:04
Show Gist options
  • Save cawa87/7f0718fffdcb52c68ec03923ca646df4 to your computer and use it in GitHub Desktop.
Save cawa87/7f0718fffdcb52c68ec03923ca646df4 to your computer and use it in GitHub Desktop.
IOS\Android Push
<?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();
}
}
<?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');
}
<?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