Αναφορά manifest εφαρμογής
Το αρχείο manifest stripe-app.json είναι η κεντρική διαμόρφωση της εφαρμογής σας για το Stripe. Δηλώνει την ταυτότητα της εφαρμογής, τα δικαιώματα, τις προβολές του περιβάλλοντος χρήστη, τις πολιτικές ασφαλείας και τη συμπεριφορά μετά την εγκατάσταση.
Πλήρες παράδειγμα manifest
{ "id": "com.tajo.brevo-integration", "version": "1.2.0", "name": "Tajo for Brevo", "icon": "./assets/icon.png", "distribution_type": "public", "sandbox_install_compatible": true, "stripe_api_access_type": "oauth", "allowed_redirect_uris": [ "https://tajo.io/stripe/callback", "https://tajo.io/stripe/oauth/complete" ], "permissions": [ { "permission": "customer_read", "purpose": "Read customer profiles to sync with Brevo contacts" }, { "permission": "customer_write", "purpose": "Update customer metadata with Brevo sync status" }, { "permission": "charge_read", "purpose": "Access payment history for Brevo event tracking" }, { "permission": "product_read", "purpose": "Sync product catalog to Brevo for personalized campaigns" }, { "permission": "event_read", "purpose": "Subscribe to real-time events for Brevo automation triggers" }, { "permission": "invoice_read", "purpose": "Track invoice lifecycle events in Brevo" } ], "ui_extension": { "views": [ { "viewport": "stripe.dashboard.customer.detail", "component": "CustomerDetailView" }, { "viewport": "stripe.dashboard.customer.list", "component": "CustomerListView" }, { "viewport": "stripe.dashboard.home.overview", "component": "OverviewView" }, { "viewport": "stripe.dashboard.drawer.default", "component": "DrawerView" }, { "viewport": "stripe.dashboard.settings", "component": "SettingsView" }, { "viewport": "stripe.dashboard.onboarding", "component": "OnboardingView" } ], "content_security_policy": { "connect-src": [ "https://api.tajo.io", "https://api.brevo.com" ], "image-src": [ "https://cdn.tajo.io", "https://assets.brevo.com" ], "purpose": "Connect to Tajo API for data sync and Brevo API for contact management" } }, "post_install_action": { "type": "onboarding" }, "constants": { "API_BASE_URL": "https://api.tajo.io/v1", "SYNC_INTERVAL_SECONDS": "300" }}Αναφορά σχήματος
Πεδία ανώτατου επιπέδου
| Πεδίο | Τύπος | Υποχρεωτικό | Περιγραφή |
|---|---|---|---|
id | string | Ναι | Μοναδικό αναγνωριστικό εφαρμογής σε αντίστροφη σημειογραφία domain (μορφή slug) |
version | string | Ναι | Συμβολοσειρά σημασιολογικής έκδοσης (π.χ. "1.2.0") |
name | string | Ναι | Εμφανιζόμενο όνομα στο marketplace (έως 35 χαρακτήρες) |
icon | string | Ναι | Σχετική διαδρομή προς το αρχείο εικονιδίου της εφαρμογής (PNG ή SVG 300x300) |
distribution_type | string | Ναι | "public" για το marketplace ή "private" για εσωτερική χρήση |
sandbox_install_compatible | boolean | Όχι | Αν η εφαρμογή μπορεί να εγκατασταθεί σε λειτουργία sandbox/δοκιμών |
stripe_api_access_type | string | Όχι | Μέθοδος πρόσβασης στο API: "oauth" ή "api_key" |
allowed_redirect_uris | string[] | Όχι | Επιτρεπόμενα URI ανακατεύθυνσης OAuth για τη ροή εγκατάστασης |
permissions | PermissionRequest[] | Ναι | Πίνακας αιτημάτων δικαιωμάτων |
ui_extension | UIExtensionManifest | Όχι | Διαμόρφωση της επέκτασης περιβάλλοντος χρήστη |
post_install_action | PostInstallAction | Όχι | Ενέργεια που εκτελείται μετά την εγκατάσταση της εφαρμογής |
constants | object | Όχι | Ζεύγη κλειδιού-τιμής προσβάσιμα στην εφαρμογή κατά την εκτέλεση |
id
Το αναγνωριστικό της εφαρμογής είναι μια συμβολοσειρά μορφής slug, συνήθως σε αντίστροφη σημειογραφία domain:
"id": "com.tajo.brevo-integration"- Πρέπει να είναι καθολικά μοναδικό σε όλες τις Stripe Apps
- Χρησιμοποιήστε μόνο πεζά γράμματα, αριθμούς, παύλες και τελείες
- Δεν μπορεί να αλλάξει μετά τη δημιουργία της εφαρμογής
- Καθορίζει το URL της εφαρμογής στο marketplace
version
Ακολουθεί τη σημασιολογική έκδοση:
"version": "1.2.0"- MAJOR: Αλλαγές που σπάνε τη συμβατότητα ή σημαντικές προσθήκες λειτουργιών
- MINOR: Νέες λειτουργίες, συμβατές προς τα πίσω
- PATCH: Διορθώσεις σφαλμάτων και μικρές βελτιώσεις
- Πρέπει να αυξάνεται σε κάθε μεταφόρτωση
distribution_type
Ελέγχει ποιος μπορεί να εγκαταστήσει την εφαρμογή σας:
| Τιμή | Περιγραφή |
|---|---|
"public" | Διαθέσιμη σε όλους τους χρήστες στο Stripe App Marketplace |
"private" | Εγκαθίσταται μόνο από τον δικό σας λογαριασμό Stripe |
stripe_api_access_type
Καθορίζει τον τρόπο με τον οποίο η εφαρμογή σας πιστοποιείται στο API του Stripe:
| Τιμή | Περιγραφή |
|---|---|
"oauth" | Χρησιμοποιεί ροή OAuth 2.0 για την πιστοποίηση (συνιστάται για δημόσιες εφαρμογές) |
"api_key" | Χρησιμοποιεί περιορισμένα κλειδιά API (κατάλληλο για ιδιωτικές εφαρμογές) |
PermissionRequest
Κάθε αίτημα δικαιώματος δηλώνει ένα συγκεκριμένο δικαίωμα του Stripe API που χρειάζεται η εφαρμογή σας:
{ "permission": "customer_read", "purpose": "Read customer profiles to sync with Brevo contacts"}| Πεδίο | Τύπος | Υποχρεωτικό | Περιγραφή |
|---|---|---|---|
permission | string | Ναι | Το αναγνωριστικό του δικαιώματος (δείτε την Αναφορά δικαιωμάτων) |
purpose | string | Ναι | Κατανοητή εξήγηση για τον λόγο που χρειάζεται αυτό το δικαίωμα |
Οδηγίες για το πεδίο purpose:
- Γράψτε σαφείς και συγκεκριμένες εξηγήσεις που μπορούν να καταλάβουν οι έμποροι
- Εξηγήστε σε τι χρησιμεύει το δικαίωμα, όχι μόνο τι παραχωρεί
- Κρατήστε τις περιγραφές σύντομες (μία πρόταση)
- Αποφύγετε την τεχνική ορολογία
UIExtensionManifest
Διαμορφώνει τα στοιχεία περιβάλλοντος χρήστη της εφαρμογής σας:
{ "ui_extension": { "views": [...], "content_security_policy": {...} }}| Πεδίο | Τύπος | Υποχρεωτικό | Περιγραφή |
|---|---|---|---|
views | ViewManifest[] | Ναι | Πίνακας δηλώσεων προβολών |
content_security_policy | CSPRequest | Όχι | Πολιτική ασφάλειας περιεχομένου για εξωτερικούς πόρους |
ViewManifest
Κάθε προβολή αντιστοιχίζει ένα στοιχείο React σε ένα viewport του Stripe Dashboard:
{ "viewport": "stripe.dashboard.customer.detail", "component": "CustomerDetailView"}| Πεδίο | Τύπος | Υποχρεωτικό | Περιγραφή |
|---|---|---|---|
viewport | string | Ναι | Η θέση στο Dashboard όπου αποδίδεται αυτή η προβολή (δείτε την Αναφορά viewports) |
component | string | Ναι | Όνομα του στοιχείου React που θα αποδοθεί (πρέπει να ταιριάζει με το εξαγόμενο όνομα του στοιχείου) |
Μία εφαρμογή μπορεί να δηλώσει πολλαπλές προβολές για διαφορετικά viewports:
"views": [ { "viewport": "stripe.dashboard.customer.detail", "component": "CustomerDetailView" }, { "viewport": "stripe.dashboard.payment.detail", "component": "PaymentDetailView" }, { "viewport": "stripe.dashboard.home.overview", "component": "OverviewView" }]CSPRequest
Η πολιτική ασφάλειας περιεχομένου ελέγχει σε ποια εξωτερικά domains μπορεί να συνδεθεί η εφαρμογή σας:
{ "content_security_policy": { "connect-src": [ "https://api.tajo.io", "https://api.brevo.com" ], "image-src": [ "https://cdn.tajo.io" ], "purpose": "Connect to Tajo API for data sync and load images from CDN" }}| Πεδίο | Τύπος | Υποχρεωτικό | Περιγραφή |
|---|---|---|---|
connect-src | string[] | Όχι | Domains στα οποία μπορεί να κάνει αιτήματα δικτύου η εφαρμογή |
image-src | string[] | Όχι | Domains από τα οποία μπορεί να φορτώνει εικόνες η εφαρμογή |
purpose | string | Ναι | Εξήγηση για τον λόγο που χρειάζονται αυτές οι εξωτερικές συνδέσεις |
Caution
Συμπεριλάβετε μόνο τα domains στα οποία πραγματικά χρειάζεται να συνδεθεί η εφαρμογή σας. Οι υπερβολικές καταχωρίσεις CSP μπορεί να προκαλέσουν αυστηρότερο έλεγχο κατά την αξιολόγηση.
PostInstallAction
Διαμορφώνει τι συμβαίνει αμέσως μόλις ένας χρήστης εγκαταστήσει την εφαρμογή σας:
{ "post_install_action": { "type": "onboarding" }}| Πεδίο | Τύπος | Υποχρεωτικό | Περιγραφή |
|---|---|---|---|
type | string | Ναι | Ο τύπος της ενέργειας (δείτε παρακάτω) |
url | string | Υπό όρους | URL για ενέργειες τύπου external |
Τύποι ενεργειών
| Τύπος | Συμπεριφορά |
|---|---|
"onboarding" | Ανοίγει την προβολή onboarding της εφαρμογής στο Dashboard |
"settings" | Ανοίγει την προβολή ρυθμίσεων της εφαρμογής στο Dashboard |
"external" | Ανακατευθύνει τον χρήστη σε εξωτερικό URL (απαιτεί το πεδίο url) |
Παραδείγματα:
// Open onboarding flow{ "post_install_action": { "type": "onboarding" }}
// Open settings page{ "post_install_action": { "type": "settings" }}
// Redirect to external setup{ "post_install_action": { "type": "external", "url": "https://app.tajo.io/stripe/setup" }}Δείτε τον οδηγό ενεργειών μετά την εγκατάσταση για αναλυτικά μοτίβα υλοποίησης.
Σταθερές
Ορίστε στατικά ζεύγη κλειδιού-τιμής που είναι προσβάσιμα κατά την εκτέλεση στην εφαρμογή σας:
{ "constants": { "API_BASE_URL": "https://api.tajo.io/v1", "SYNC_INTERVAL_SECONDS": "300", "MAX_BATCH_SIZE": "100" }}- Όλες οι τιμές πρέπει να είναι συμβολοσειρές
- Οι σταθερές ενσωματώνονται στην εφαρμογή κατά τη μεταγλώττιση
- Χρησιμοποιήστε σταθερές για διαμόρφωση που διαφέρει ανά περιβάλλον
- Ποτέ μην αποθηκεύετε μυστικά ή κλειδιά API ως σταθερές, χρησιμοποιήστε αντ’ αυτού το Secret Store API
Πρόσβαση στις σταθερές μέσα από τον κώδικα της εφαρμογής σας:
import { constants } from '@stripe/ui-extension-sdk/constants';
const apiUrl = constants.API_BASE_URL;Εκτεταμένο manifest για ανάπτυξη
Κατά την τοπική ανάπτυξη είναι διαθέσιμα επιπλέον πεδία:
{ "id": "com.tajo.brevo-integration", "version": "0.1.0", "name": "Tajo for Brevo (Dev)", "icon": "./assets/icon-dev.png", "distribution_type": "private", "sandbox_install_compatible": true, "dev": { "hot_reload": true, "port": 4242 }}Η ενότητα dev αφαιρείται κατά τις εκδόσεις παραγωγής και τις μεταφορτώσεις της εφαρμογής. Χρησιμοποιήστε την μόνο για ρυθμίσεις διευκόλυνσης της τοπικής ανάπτυξης.
Επικύρωση
Επικυρώστε το manifest σας πριν από τη μεταφόρτωση:
# Validate manifest syntax and schemastripe apps validate
# Check for common issuesstripe apps checkΣυνήθη σφάλματα επικύρωσης:
| Σφάλμα | Αιτία | Διόρθωση |
|---|---|---|
Invalid permission | Άγνωστο αναγνωριστικό δικαιώματος | Ελέγξτε την Αναφορά δικαιωμάτων |
Invalid viewport | Άγνωστο αναγνωριστικό viewport | Ελέγξτε την Αναφορά viewports |
Missing purpose | Δικαίωμα χωρίς πεδίο purpose | Προσθέστε μια συμβολοσειρά purpose σε κάθε δικαίωμα |
Invalid version | Συμβολοσειρά έκδοσης που δεν είναι semver | Χρησιμοποιήστε τη μορφή MAJOR.MINOR.PATCH |
Icon not found | Η διαδρομή του εικονιδίου δεν αναλύεται | Επαληθεύστε ότι το αρχείο εικονιδίου υπάρχει στη συγκεκριμένη διαδρομή |