FirebaseHelper.php 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. <?php
  2. namespace app\components;
  3. use Kreait\Firebase\Factory;
  4. use Kreait\Firebase\Messaging\CloudMessage;
  5. class FirebaseHelper {
  6. const TIPO_PAGO = "pago";
  7. const TIPO_PEDIDO = "pedido";
  8. const TIPO_PROMOCION = "promocion";
  9. private $_firebase = null;
  10. private $_firestore = null;
  11. private $_messaging = null;
  12. function firebase() {
  13. $params = \Yii::$app->params;
  14. if($this->_firebase === null) {
  15. $this->_firebase = (new Factory)
  16. ->withServiceAccount($params['firebaseKey']);
  17. }
  18. return $this->_firebase;
  19. }
  20. function firestore() {
  21. if($this->_firestore === null) {
  22. $this->_firestore = self::firebase()
  23. ->createFirestore()
  24. ->database();
  25. }
  26. return $this->_firestore;
  27. }
  28. function messaging() {
  29. if($this->_messaging === null) {
  30. $this->_messaging = $this->firebase()
  31. ->createMessaging();
  32. }
  33. return $this->_messaging;
  34. }
  35. public static function enviarNotificacion($idCliente, CloudMessage $notificacion) {
  36. $model = new self();
  37. return $model->enviar($idCliente, $notificacion);
  38. }
  39. public function enviar($idCliente, CloudMessage $notificacion) {
  40. if(!$idCliente)
  41. return null;
  42. $firestore = $this->firestore();
  43. $doc = $firestore->collection("clientes")
  44. ->document($idCliente);
  45. $data = $doc->snapshot()->data();
  46. $tokens = $data["tokens"];
  47. if(empty($tokens))
  48. return null;
  49. $resultado = $this->messaging()->sendMulticast($notificacion, $tokens);
  50. # Actualizar los tokens en firestore con los que si funcionaron
  51. $tokenValidos = $resultado->validTokens();
  52. $doc->update([
  53. ["path" => "tokens", "value" => $tokenValidos],
  54. ]);
  55. }
  56. }