الاشتراك في المحتوى
في هذا المثال، نوضح كيفية إدارة الوصول إلى المحتوى القائم على الاشتراك باستخدام واجهة برمجة التطبيقات OneEntry. نتحقق مما إذا كان لدى المستخدم اشتراك نشط ونمنح الوصول إلى المحتوى المتميز أو نحثهم على الاشتراك.
✅ هدف السيناريو:
- فقط المستخدمون الذين لديهم اشتراك يمكنهم الوصول إلى المحتوى
- الفحص يعتمد على الطلبات، المستخدم.
- أولئك الذين ليس لديهم تفويض أو لم يشتروا سيحصلون على عرض للاشتراك.
✅ ما تحتاجه:
- عنوان PROJECT_URL و APP_TOKEN صالحين للمصادقة مع واجهة برمجة التطبيقات OneEntry.
- نموذج مع علامة "الاشتراكات"، السمات "expired_date" و "subscription_time" ونوع "نموذج الطلب"
- مستخدم مسجل
📌 مهم:
- هذه الأمثلة لا تشمل معالجة الأخطاء.
- يمكنك إدارة الأخطاء باستخدام كتلة try-catch أو من خلال استخدام بناء مثل await Promise.catch((error) => error).
📚 انظر في الوثائق:
📦 مرجع SDK:
جربها مباشرة
قم بتشغيل هذه الطريقة بشكل تفاعلي في JS SDK sandbox — قم بتوصيل عنوان مشروعك و رمز التطبيق عند الزيارة الأولى، ثم افتح:
- الاشتراك في المحتوى — في هذا المثال، نوضح كيفية إدارة الوصول إلى المحتوى القائم على الاشتراك باستخدام واجهة برمجة التطبيقات OneEntry. نتحقق مما إذا كان لدى المستخدم اشتراك نشط ونمنح الوصول إلى المحتوى المتميز أو نحثهم على الاشتراك.
السيناريو
1. استيراد defineOneEntry من SDK وتعريف PROJECT_URL و APP_TOKEN
مثال:
import { defineOneEntry } from 'oneentry';
const PROJECT_URL = 'your-project-url';
const APP_TOKEN = 'your-app-token';
2. إنشاء عميل API باستخدام defineOneEntry()
مثال:
const { Users, Orders, Pages, Payments, AuthProvider, Forms } = defineOneEntry(
PROJECT_URL,
{
token: APP_TOKEN,
},
);
3. الحصول على النموذج
مثال:
const form = await Forms.getFormByMarker('subscription');
console.log(form);
// expired_date - Date
// subscription_time - list
النتيجة:
{
"id": 6,
"attributeSetId": 8,
"type": "order",
"localizeInfos": {
"title": "Subscription",
"titleForSite": "Subscription",
"successMessage": "Message about successful data processing",
"unsuccessMessage": "Message about unsuccessful data processing",
"urlAddress": "",
"database": "0",
"script": "0"
},
"version": 21,
"position": 1,
"identifier": "subscription",
"processingType": "script",
"templateId": null,
"attributes": [
{
"type": "date",
"marker": "expired_date",
"position": 2,
"settings": {},
"isVisible": true,
"listTitles": [],
"validators": {},
"initialValue": null,
"localizeInfos": {
"title": "Expired date"
},
"additionalFields": {}
},
{
"type": "list",
"marker": "subscription_time",
"position": 5,
"settings": {},
"isVisible": true,
"listTitles": [
{
"title": "1 month",
"value": "1",
"extended": {
"type": "real",
"value": "100"
},
"position": 1
},
{
"title": "6 months",
"value": "6",
"extended": {
"type": "real",
"value": "500"
},
"position": 2
},
{
"title": "1 year",
"value": "12",
"extended": {
"type": "real",
"value": "999"
},
"position": 3
}
],
"validators": {},
"initialValue": null,
"localizeInfos": {
"title": "Subscription time"
},
"additionalFields": {}
}
],
"total": "1",
"moduleFormConfigs": []
}
4. إعداد البيانات لتفويض المستخدم
مثال:
const authData = [
{ marker: 'email_reg', value: 'your-email' },
{ marker: 'password_reg', value: 'your-password' },
];
النتيجة:
[
{
"marker": "email_reg",
"value": "kvasssukr.net@gmail.com"
},
{
"marker": "password_reg",
"value": "123456"
}
]
5. التفويض والحصول على بيانات المستخدم باستخدام AuthProvider.auth()
مثال:
const authResponse = await AuthProvider.auth('email', { authData });
console.log(authResponse);
const user = await Users.getUser();
console.log(user);
النتيجة:
{
"id": 39,
"total": "1",
"identifier": "kvasssukr.net@gmail.com",
"authProviderIdentifier": "email",
"formData": [
{
"marker": "name_reg",
"type": "string",
"value": "Ivan"
},
{
"marker": "phone_reg",
"type": "string",
"value": "+10000000001"
},
{
"marker": "email_notification_reg",
"type": "string",
"value": "test@example.com"
}
],
"formIdentifier": "reg",
"groups": [
1
],
"state": {},
"rating": {},
"moduleFormConfigs": []
}
6. نحصل على قائمة طلبات المستخدم باستخدام Orders.getAllOrdersByMarker()
مثال:
const orders = await Orders.getAllOrdersByMarker('subscriptions');
if ('statusCode' in orders) {
throw new Error(orders.message);
}
النتيجة:
{
"items": [
{
"id": 119,
"storageId": 2,
"createdDate": "2026-06-06T11:50:12.995Z",
"statusIdentifier": "active",
"statusLocalizeInfos": {
"title": "Active"
},
"formIdentifier": "subscription",
"formData": [
{
"type": "date",
"marker": "expired_date",
"value": {
"fullDate": "2026-05-07T00:00:00.000Z",
"formattedValue": "07-05-2026 00:00",
"formatString": "DD-MM-YYYY HH:mm"
}
},
{
"type": "list",
"marker": "subscription_time",
"value": [
"1"
]
}
],
"attributeSetIdentifier": "subscriptions",
"paymentStrategy": "once",
"totalSum": "400",
"totalSumRaw": "400",
"currency": "USD",
"paymentAccountIdentifier": "cash",
"paymentAccountLocalizeInfos": {
"title": "Cash"
},
"products": [
{
"id": 15,
"title": "Orange ball",
"sku": null,
"previewImage": "[]",
"price": 400,
"quantity": 1,
"isGift": false
}
],
"paymentUrl": null,
"discountConfig": {
"orderDiscounts": [],
"productDiscounts": [],
"coupon": null,
"settings": {
"allowStacking": false,
"maxDiscountValue": null,
"allowGiftStacking": false,
"maxBonusPaymentPercent": null,
"minBonusAmount": null,
"minOrderAmountForBonus": null,
"giftRefundPolicy": "KEEP_GIFT"
},
"additionalDiscountsMarkers": [],
"totalRaw": 400,
"totalSumWithDiscount": 400,
"excludedGiftProductIds": [],
"bonus": {
"availableBalance": 0,
"maxBonusDiscount": 0,
"minBonusAmount": null,
"minOrderAmountForBonus": null,
"bonusApplied": 0
},
"bonusApplied": 0,
"totalDue": 400
},
"isPartial": false,
"isCompleted": false
}
],
"total": 1
}
7. التحقق من وجود اشتراك نشط
مثال:
const now = new Date();
const hasActiveSubscription = orders.items?.some(
(order: any) =>
new Date(
order.formData.find(
(d: { marker: string }) => d.marker === 'expired_date',
).value.fullDate,
) > now,
);
8. إذا كان الاشتراك نشطًا، نقدم الوصول، وإلا نقوم بإنشاء طلب وتوليد الدفع
مثال:
let content = null;
if (hasActiveSubscription) {
// ✅ Subscription active → show content
content = await Pages.getPageByUrl('premium_page');
console.log('🎉 Access is open:', content);
} else {
// ❌ No subscription → create an order and generate payment
const body = {
formIdentifier: 'subscription',
paymentAccountIdentifier: 'cash',
formData: [
{
type: 'date',
marker: 'expired_date',
value: {
fullDate: '2026-05-07T00:00:00.000Z',
formattedValue: '07-05-2026 00:00',
formatString: 'DD-MM-YYYY HH:mm',
},
},
{
// A `list` field takes an array of the selected option values
// (plain strings), not option objects. '1' = the "1 month" option.
type: 'list',
marker: 'subscription_time',
value: ['1'],
},
],
products: [
{
productId: 15,
quantity: 1,
},
],
};
const order = await Orders.createOrder('subscriptions', body);
if ('statusCode' in order) {
throw new Error(order.message);
}
const payment = await Payments.createSession(order.id, 'session', false);
console.log('💸 Proceed to pay for your subscription:', payment);
}
المثال النهائي
// 1. Import defineOneEntry from SDK and define PROJECT_URL and APP_TOKEN
import { defineOneEntry } from 'oneentry';
const PROJECT_URL = 'your-project-url';
const APP_TOKEN = 'your-app-token';
// 2. Creating an API client with [defineOneEntry()](/docs/index/#Installation)
const { Users, Orders, Pages, Payments, AuthProvider, Forms } = defineOneEntry(
PROJECT_URL,
{
token: APP_TOKEN,
},
);
// 3. Get form
const form = await Forms.getFormByMarker('subscription');
console.log(form);
// expired_date - Date
// subscription_time - list
// 4. Preparing data for user authorization
const authData = [
{ marker: 'email_reg', value: 'your-email' },
{ marker: 'password_reg', value: 'your-password' },
];
// 5. Authorization and obtaining user data with [AuthProvider.auth()](/docs/auth-provider/auth)
const authResponse = await AuthProvider.auth('email', { authData });
console.log(authResponse);
const user = await Users.getUser();
console.log(user);
// 6. We get a list of user orders with [Orders.getAllOrdersByMarker()](/docs/orders/getAllOrdersByMarker)
const orders = await Orders.getAllOrdersByMarker('subscriptions');
if ('statusCode' in orders) {
throw new Error(orders.message);
}
// 7. Checking for an active subscription
const now = new Date();
const hasActiveSubscription = orders.items?.some(
(order: any) =>
new Date(
order.formData.find(
(d: { marker: string }) => d.marker === 'expired_date',
).value.fullDate,
) > now,
);
// 8. If the subscription is active, we provide access, otherwise we create an order and generate payment
let content = null;
if (hasActiveSubscription) {
// ✅ Subscription active → show content
content = await Pages.getPageByUrl('premium_page');
console.log('🎉 Access is open:', content);
} else {
// ❌ No subscription → create an order and generate payment
const body = {
formIdentifier: 'subscription',
paymentAccountIdentifier: 'cash',
formData: [
{
type: 'date',
marker: 'expired_date',
value: {
fullDate: '2026-05-07T00:00:00.000Z',
formattedValue: '07-05-2026 00:00',
formatString: 'DD-MM-YYYY HH:mm',
},
},
{
// A `list` field takes an array of the selected option values
// (plain strings), not option objects. '1' = the "1 month" option.
type: 'list',
marker: 'subscription_time',
value: ['1'],
},
],
products: [
{
productId: 15,
quantity: 1,
},
],
};
const order = await Orders.createOrder('subscriptions', body);
if ('statusCode' in order) {
throw new Error(order.message);
}
const payment = await Payments.createSession(order.id, 'session', false);
console.log('💸 Proceed to pay for your subscription:', payment);
}