App جائزہ معیار کی ضروریات
Stripe marketplace پر جمع کی گئی ہر app کو معیاری ضروریات کے ایک جامع سیٹ کے خلاف جانچتا ہے۔ ترقی سے پہلے ان معیارات کو سمجھنا وقت بچاتا ہے اور جائزہ کے چکروں کی تعداد کم کرتا ہے۔
جائزہ
Stripe App جائزہ آپ کی app کو چھ اہم شعبوں میں جانچتا ہے:
- شفاف قیمت, اخراجات کی واضح بات چیت
- App فعالیت, قابل اعتماد اور مکمل ہونا
- Developer معیارات, کوڈ کا معیار اور API کا استعمال
- UX معیار, صارف انٹرفیس اور تجربہ کے معیارات
- سیکیورٹی, ڈیٹا تحفظ اور محفوظ طریقے
- قانونی تعمیل, پرائیویسی اور ریگولیٹری ضروریات
شفاف قیمت
آپ کی app کو صارفین کو تمام اخراجات واضح طور پر بتانے چاہئیں:
- قیمت کا اظہار: تمام قیمتیں marketplace listing میں پیشگی بتائی جانی چاہئیں
- کوئی پوشیدہ فیس نہیں: صارفین کو انسٹالیشن کے بعد غیر متوقع اخراجات نہیں آنے چاہئیں
- آزمائشی شرائط: اگر آزمائش پیش کریں، تو مدت اور اس کے بعد کیا ہوتا ہے واضح بتائیں
- اپ گریڈ فلو: کوئی بھی upsell یا اپ گریڈ prompts غیر مداخلت پسندانہ اور واضح طور پر اختیاری ہونی چاہئیں
- کرنسی: جب ممکن ہو تو صارف کی مقامی کرنسی میں قیمتیں دکھائیں
Caution
وہ apps جو قیمت چھپاتی ہیں یا واضح رضامندی کے بغیر صارفین سے چارج کرتی ہیں انہیں فوری طور پر مسترد کر دیا جائے گا۔
تاریخ اور وقت کی فارمیٹنگ
آپ کی app میں دکھائی گئی تمام تاریخیں اور اوقات Stripe Dashboard کے طریقوں کے مطابق ہونی چاہئیں:
- جب دستیاب ہو تو تاریخ فارمیٹنگ کے لیے صارف کا locale استعمال کریں
- صارف کے مقامی time zone میں وقت دکھائیں
- حالیہ events کے لیے relative timestamps استعمال کریں (جیسے “2 گھنٹے پہلے”)
- پرانے events کے لیے مکمل تاریخ اور وقت کے ساتھ absolute timestamps استعمال کریں
- کسی بھی API-facing تاریخ fields کے لیے ISO 8601 کی پیروی کریں
// اچھا: Stripe کے تاریخ فارمیٹنگ utilities استعمال کریںimport { formatDate, formatRelativeTime } from '@stripe/ui-extension-sdk/utils';
const formattedDate = formatDate(timestamp); // Locale-awareconst relativeTime = formatRelativeTime(timestamp); // "2 گھنٹے پہلے"App کی ترتیبات
اگر آپ کی app کو کنفیگریشن کی ضرورت ہے:
- app کے viewport سے قابل رسائی ایک مخصوص Settings view فراہم کریں
- جہاں ممکن ہو معقول پہلے سے بھری گئی defaults استعمال کریں
- واضح error messages کے ساتھ تمام صارف inputs کی تصدیق کریں
- صارفین کو app دوبارہ انسٹال کیے بغیر ترتیبات اپ ڈیٹ کرنے کی اجازت دیں
- Stripe Secret Store API استعمال کرتے ہوئے sessions میں ترتیبات محفوظ رکھیں
Sandbox سپورٹ
آپ کی app کو Stripe کے sandbox (test) موڈ میں صحیح طریقے سے کام کرنا چاہیے:
- Test موڈ compatibility: تمام خصوصیات test موڈ میں کام کرنی چاہئیں
- Test ڈیٹا: app کی فعالیت کا مظاہرہ کرنے والا حقیقت پسندانہ test ڈیٹا استعمال کریں
- sandbox میں کوئی live ڈیٹا نہیں: test موڈ میں کبھی production ڈیٹا ظاہر نہ کریں
- شائستہ ہینڈلنگ: اگر sandbox میں کوئی خصوصیت دستیاب نہیں، تو واضح پیغام دکھائیں کیوں
- اپنے manifest میں
sandbox_install_compatible: trueسیٹ کریں
{ "sandbox_install_compatible": true}App فعالیت
قابل اعتماد
- app عام استعمال کے دوران crash یا منجمد نہیں ہونی چاہیے
- تمام مشتہر خصوصیات بیان کردہ طریقے سے کام کرنی چاہئیں
- نیٹ ورک errors کو retry کے اختیارات کے ساتھ شائستگی سے سنبھالا جانا چاہیے
- app پس منظر کی کارروائیوں کے دوران جوابی رہنی چاہیے
مکمل ہونا
- کوئی placeholder مواد، “جلد آ رہا ہے” خصوصیات، یا ٹوٹے ہوئے links نہیں
- تمام UI عناصر فعال ہونے چاہئیں, کوئی dead بٹن یا غیر فعال controls نہیں
- help متن اور دستاویزی links درست صفحات پر جانے چاہئیں
- ان انسٹال کرنے سے تمام app ڈیٹا اور webhooks صاف ہونے چاہئیں
کارکردگی
- UI کو معیاری کنکشن پر 3 سیکنڈ کے اندر render ہونا چاہیے
- پس منظر sync کارروائیاں UI کو block نہیں کرنی چاہئیں
- بڑے ڈیٹا سیٹس کو pagination یا lazy loading استعمال کرنا چاہیے
- rate limiting سے بچنے کے لیے API calls کم سے کم کریں
Developer معیارات
API کا استعمال
- Stripe API کا تازہ ترین مستحکم ورژن استعمال کریں
- pagination، error handling اور idempotency کے لیے Stripe API best practices پر عمل کریں
- rate limits سے تجاوز نہ کریں, retries کے لیے exponential backoff نافذ کریں
- polling کی بجائے event-driven updates کے لیے webhooks استعمال کریں
کوڈ کا معیار
- production builds میں کوئی console errors یا warnings نہیں
- جمع کرانے سے پہلے تمام debug logging ہٹا دیں
- تمام edge cases (خالی states، غائب ڈیٹا، نیٹ ورک failures) سنبھالیں
- یکساں UI کے لیے Stripe کے component library patterns پر عمل کریں
ورژن بندی
- semantic versioning (MAJOR.MINOR.PATCH) استعمال کریں
- ورژن اپ ڈیٹس میں breaking تبدیلیوں کو دستاویزی کریں
- جہاں ممکن ہو backward compatibility برقرار رکھیں
UX معیار
اشتہار بازی
- کوئی اشتہار نہیں: آپ کی app کسی بھی قسم کے اشتہارات نہیں دکھا سکتی
- کوئی cross-promotion نہیں: app UI میں دوسری مصنوعات یا خدمات کو فروغ نہ دیں
- برانڈ مواد: صرف اپنی برانڈ شناخت دکھائیں، تھرڈ پارٹی برانڈز نہیں (Brevo جیسے انٹیگریشن پارٹنرز کے علاوہ)
زبان اور مواد
- یکساں زبان: پوری app میں یکساں اصطلاحات استعمال کریں
- پیشہ ورانہ لہجہ: Stripe Dashboard کے پیشہ ورانہ، جامع مواصلاتی انداز سے مطابقت
- کوئی جرگن نہیں: ایسی تکنیکی اصطلاحات سے گریز کریں جو merchants کو سمجھ نہ آئیں
- ہجے کی جانچ: یقینی بنائیں کہ تمام متن ہجے اور گرامر کی غلطیوں سے پاک ہے
- صرف انگریزی: marketplace apps کے لیے تمام صارف نظر متن انگریزی میں ہونا چاہیے
تصدیقی Dialogs
تباہ کن یا اہم اعمال کے لیے صارف کی تصدیق درکار ہے:
// اچھا: تباہ کن اعمال سے پہلے تصدیق کریںconst handleDisconnect = async () => { const confirmed = await showConfirmation({ title: 'Disconnect Brevo Integration', message: 'This will stop syncing customer data to Brevo. You can reconnect at any time.', confirmLabel: 'Disconnect', cancelLabel: 'Cancel', destructive: true, });
if (confirmed) { await disconnectIntegration(); }};تصدیق کی ضرورت والے اعمال:
- انٹیگریشنز سے منقطع کرنا
- synced ڈیٹا حذف کرنا
- ڈیٹا فلو پر اثر انداز ترتیبات تبدیل کرنا
- کنفیگریشن کو defaults پر reset کرنا
Loading States
async کارروائیوں کے لیے ہمیشہ loading اشارے دکھائیں:
// اچھا: ڈیٹا fetch کے دوران loading state دکھائیںconst CustomerSyncStatus = () => { const { data, isLoading, error } = useSyncStatus();
if (isLoading) { return <Spinner label="Loading sync status..." />; }
if (error) { return <Banner type="critical" title="Failed to load sync status"> {error.message} </Banner>; }
return <SyncStatusDisplay data={data} />;};ضروریات:
- ڈیٹا loading کے دوران spinners یا skeleton screens دکھائیں
- form submission کے دوران بٹن disable کریں
- طویل چلنے والی کارروائیوں کے لیے progress اشارے دکھائیں
- loading کے دوران کبھی خالی اسکرین نہ دکھائیں
Error Messages
واضح، قابل عمل error messages فراہم کریں:
// برا: عام error"Something went wrong"
// اچھا: مخصوص اور قابل عمل"Unable to sync customer data to Brevo. Please verify your Brevo API keyin Settings and try again."Error message ہدایات:
- سادہ زبان میں بتائیں کیا ہوا
- ایک مخصوص عمل تجویز کریں جو صارف مسئلہ حل کرنے کے لیے کر سکتا ہے
- ناکام آپریشن دوبارہ کوشش کرنے کا طریقہ فراہم کریں
- debugging کے لیے تفصیلی error معلومات log کریں (صارفین کو نہ دکھائیں)
- جب قابل اطلاق ہو تو support reference کے لیے error codes شامل کریں
سیکیورٹی
Secret Store API
تمام حساس ڈیٹا storage کے لیے Stripe کی Secret Store API استعمال کریں:
import { createHttpClient, STRIPE_API_KEY } from '@stripe/ui-extension-sdk/http_client';
// اچھا: Secret Store API استعمال کرتے ہوئے secrets محفوظ کریںconst storeBrevoApiKey = async (apiKey: string) => { const stripe = createHttpClient(STRIPE_API_KEY); await stripe.apps.secrets.create({ name: 'brevo_api_key', payload: apiKey, scope: { type: 'account' }, });};
// اچھا: Secret Store سے secrets حاصل کریںconst getBrevoApiKey = async () => { const stripe = createHttpClient(STRIPE_API_KEY); const secret = await stripe.apps.secrets.find({ name: 'brevo_api_key', scope: { type: 'account' }, }); return secret.payload;};حساس ڈیٹا کبھی بھی ان جگہوں پر محفوظ نہ کریں:
- Local storage یا session storage
- Cookies
- URL parameters
- Source code میں hardcoded values
- Plain text کنفیگریشن files
Cryptography
- کوئی کسٹم cryptography نہیں: اپنے encryption algorithms خود نافذ نہ کریں
- Stripe کے built-in security primitives استعمال کریں (Secret Store، signing secrets)
- تمام بیرونی API calls کے لیے HTTPS استعمال کریں
- پروسیسنگ سے پہلے تمام webhook signatures کی تصدیق کریں
ڈیٹا ہینڈلنگ
- صرف وہ اجازتیں مانگیں جو آپ کی app کو واقعی درکار ہیں
- فعالیت کے لیے ضروری سے زیادہ Stripe ڈیٹا محفوظ نہ کریں
- اپنی privacy policy سے ہم آہنگ ڈیٹا retention policies نافذ کریں
- صارفین کو ڈیٹا حذف کرنے کی درخواست کرنے کا طریقہ کار فراہم کریں
قانونی تعمیل
پرائیویسی پالیسی
آپ کی app میں عوامی طور پر قابل رسائی privacy policy ہونی چاہیے جو احاطہ کرے:
- app Stripe سے کون سا ڈیٹا اکٹھا کرتی ہے
- ڈیٹا کیسے محفوظ، پروسیس اور شیئر کیا جاتا ہے
- ڈیٹا retention اور deletion policies
- اپنے ڈیٹا کے بارے میں صارف کے حقوق
- privacy سوالات کے لیے رابطہ معلومات
- قابل اطلاق ضوابط کی تعمیل (GDPR، CCPA وغیرہ)
سروس کی شرائط
- اپنی app کے لیے واضح سروس کی شرائط فراہم کریں
- ایسی شرائط شامل نہ کریں جو Stripe کی سروس کی شرائط سے متصادم ہوں
- کوئی بھی استعمال کی حدود یا پابندیاں واضح طور پر بتائیں
ریگولیٹری تعمیل
- تمام قابل اطلاق ڈیٹا تحفظ ضوابط کی تعمیل کریں
- مناسب ڈیٹا پروسیسنگ معاہدے نافذ کریں
- ڈیٹا portability اور حذف کرنے کی درخواستوں کی حمایت کریں
- ڈیٹا تک رسائی اور پروسیسنگ کے لیے audit logs برقرار رکھیں
جائزہ عمل کا ٹائم لائن
| مرحلہ | مدت |
|---|---|
| ابتدائی جمع کرانا | 5-10 کاروباری دن |
| نظرثانی جائزہ | 3-7 کاروباری دن |
| حتمی منظوری | 1-2 کاروباری دن |
| اشاعت | منظوری کے فوری بعد |
Tip
متعدد جائزہ چکروں سے بچنے کے لیے ایک نظرثانی میں تمام جائزہ تاثرات پر عمل کریں۔ Stripe ٹیم ہر پائے جانے والے مسئلے کے لیے مخصوص، قابل عمل تاثر فراہم کرتی ہے۔
عام مسترد ہونے کی وجوہات
- غائب error handling, نیٹ ورک errors یا غیر متوقع ڈیٹا پر app crash
- ناکافی loading states, ڈیٹا fetching کے دوران خالی اسکرینز
- غیر واضح قیمت, listing میں قیمت مکمل طور پر ظاہر نہیں
- ضرورت سے زیادہ اجازتیں, app کی ضرورت نہ ہونے والی اجازتیں مانگنا
- ٹوٹا ہوا sandbox موڈ, app test موڈ میں کام نہیں کرتی
- سیکیورٹی مسائل, Secret Store API سے باہر secrets محفوظ کرنا
- غائب privacy policy, قابل رسائی privacy policy URL نہیں
- نامکمل فعالیت, “جلد آ رہا ہے” خصوصیات یا placeholder مواد