دفع الإخطارات من خادم SpringBoot

مقدمة


أحييكم لقد واجهت مؤخرًا تحدي إعداد إعلامات الدفع على الموقع. كانت هذه هي المرة الأولى التي صادفت فيها هذا ، وقد ساعدني هذا المقال كثيرًا. يحتوي بالفعل على وصف لجانب الخادم ، لكنني ، أثناء دراسة هذا الموضوع ، وجدت طريقة أكثر ملاءمة لتطبيق وسائل مكتبة Firebase نفسها. في الواقع ، أود أن أخبرك عنه ، لأنه لم أتمكن من العثور على تفسير واضح على الإنترنت.

قد تكون هذه المقالة مفيدة أيضًا للمبرمجين في Node.js و Python و Go ، حيث تتوفر المكتبة أيضًا بهذه اللغات.

مباشرة إلى هذه النقطة


في هذه المقالة ، سأتحدث فقط عن جانب الخادم.
(يمكنك تكوين جزء العميل باستخدام نفس المادة )
لذلك:

  • تحتاج أولاً إلى الذهاب إلى الموقع والتسجيل وإنشاء مشروع.
  • بعد ذلك ، في الزاوية اليسرى العليا ، انقر على الترس واختر "إعدادات المشروع".
  • انتقل إلى علامة التبويب "حسابات الخدمة" ، واختر اللغة التي تهمنا ، وانقر فوق "إنشاء مفتاح خاص" وتنزيل الملف الذي تم إنشاؤه
يحتوي ملف JSON هذا على التكوين اللازم لمكتبة Firebase.
الآن دعنا نعتني بالخادم

للراحة ، قم بتعريف المسار إلى الملف الذي تم تنزيله في application.properties

fcm.service-account-file = /path/to/file.json 

أضف التبعيات اللازمة في pom.xml

 <dependency> <groupId>com.google.firebase</groupId> <artifactId>firebase-admin</artifactId> <version>6.7.0</version> </dependency> 

قم بإنشاء حبة إرجاع JSON لدينا:

 @ConfigurationProperties(prefix = "fcm") @Component public class FcmSettings { private String serviceAccountFile; public String getServiceAccountFile() { return this.serviceAccountFile; } public void setServiceAccountFile(String serviceAccountFile) { this.serviceAccountFile = serviceAccountFile; } } 


كائن التكوين

 @Getter @Setter public class PushNotifyConf { private String title; private String body; private String icon; private String click_action; private String ttlInSeconds; public PushNotifyConf() { } public PushNotifyConf(String title, String body, String icon, String click_action, String ttlInSeconds) { this.title = title; this.body = body; this.icon = icon; this.click_action = click_action; this.ttlInSeconds = ttlInSeconds; } } 

الحقول:
  • العنوان - جدول المحتويات
  • نص إشعار الجسم
  • أيقونة - رابط إلى الصورة
  • click_action - الرابط الذي سيذهب إليه المستخدم عند النقر على الإشعار (مع اسم ، مثال في الخدمة)
    يمكنك إضافة العديد منها ، ولكن لن يعرض كل متصفح كل شيء (فيما يلي مثال من Chroma)
  • ttlInSeconds - وقت صلاحية الإخطار


والخدمة ، والتي ستكون المنطق الكامل لإرسال الإخطارات:

 @Service public class FcmClient { public FcmClient(FcmSettings settings) { Path p = Paths.get(settings.getServiceAccountFile()); try (InputStream serviceAccount = Files.newInputStream(p)) { FirebaseOptions options = new FirebaseOptions.Builder() .setCredentials(GoogleCredentials.fromStream(serviceAccount)) .build(); FirebaseApp.initializeApp(options); } catch (IOException e) { Logger.getLogger(FcmClient.class.getName()) .log(Level.SEVERE, null, e); } } public String sendByTopic(PushNotifyConf conf, String topic) throws InterruptedException, ExecutionException { Message message = Message.builder().setTopic(topic) .setWebpushConfig(WebpushConfig.builder() .putHeader("ttl", conf.getTtlInSeconds()) .setNotification(createBuilder(conf).build()) .build()) .build(); String response = FirebaseMessaging.getInstance() .sendAsync(message) .get(); return response; } public String sendPersonal(PushNotifyConf conf, String clientToken) throws ExecutionException, InterruptedException { Message message = Message.builder().setToken(clientToken) .setWebpushConfig(WebpushConfig.builder() .putHeader("ttl", conf.getTtlInSeconds()) .setNotification(createBuilder(conf).build()) .build()) .build(); String response = FirebaseMessaging.getInstance() .sendAsync(message) .get(); return response; } public void subscribeUsers(String topic, List<String> clientTokens) throws FirebaseMessagingException { for (String token : clientTokens) { TopicManagementResponse response = FirebaseMessaging.getInstance() .subscribeToTopic(Collections.singletonList(token), topic); } } private WebpushNotification.Builder createBuilder(PushNotifyConf conf){ WebpushNotification.Builder builder = WebpushNotification.builder(); builder.addAction(new WebpushNotification .Action(conf.getClick_action(), "")) .setImage(conf.getIcon()) .setTitle(conf.getTitle()) .setBody(conf.getBody()); return builder; } } 

Me: - Firebase ، لماذا هناك الكثير من البنيات؟
Firebase: - لأن
  1. يستخدم المنشئ لتهيئة FirebaseApp باستخدام ملف JSON الخاص بنا.
  2. يرسل الأسلوب sendByTopic () إعلامات للمستخدمين المشتركين في موضوع معين.
  3. تشترك طريقة subscribeUsers () في موضوع (موضوع) للمستخدمين (clientTokens).
    يمكن تنفيذها بشكل غير متزامن ، لهذا .subscribeToTopicAsync () يستخدم

  4. تطبق طريقة sendPersonal () إرسال إشعار شخصي للمستخدم (clientToken)
  5. تنشئ طريقة createBuilder () رسالة

النتيجة

الصورة

متصفح آخر

الصورة
لا توجد رموز لأن أوبونتو :)

لتلخيص



في جوهرها ، تجمع مكتبة Firebase JSON بالنسبة لنا مثل هذا:

 {from: "Server key"​ notification: {​​ title: " Habr" actions: (1) [​​​ 0: Object { action: "https://habr.com/ru/top/", title: "" } ]​​ length: 1​​ body: "- "​​ image: "https://habrastorage.org/webt/7i/k5/77/7ik577fzskgywduy_2mfauq1gxs.png"​​ } ​priority: "normal"} 

وعلى جانب العميل ، أنت تقوم بالفعل بتحليلها كما تريد.

شكرا لاهتمامكم!

روابط مفيدة:


firebase.google.com/docs/reference/admin/java/reference/com/google/firebase/messaging/WebpushNotification

habr.com/en/post/321924/#otpravka-uvedomleniy-s-servera

firebase.google.com/docs/web/setup

Source: https://habr.com/ru/post/ar442202/


All Articles