from rest_framework import serializers class CreateOrderRequestSerializer(serializers.Serializer): # این فراخوانی سرور-به-سرور از اپ Subscription‌ه، نه از کلاینت؛ به همین # دلیل userId اینجا مستقیماً در بدنه ارسال می‌شه (نه از توکن استخراج). userId = serializers.CharField() amount = serializers.IntegerField() currency = serializers.CharField(required=False, default='IRT') subscriptionId = serializers.CharField(required=False, allow_null=True, allow_blank=True) class CreateOrderResponseSerializer(serializers.Serializer): orderId = serializers.CharField() status = serializers.CharField() paymentUrl = serializers.CharField() class WebhookRequestSerializer(serializers.Serializer): # کال‌بک از سمت درگاه پرداخت میاد، نه از اپ orderId = serializers.CharField() gateway = serializers.CharField(required=False, default='zarinpal') gatewayRefId = serializers.CharField(required=False, allow_blank=True) # ⚠️ اصلاح امنیتی: قبلاً status یک CharField آزاد بود و هر مقداری # (حتی مقادیر پشتیبانی‌نشده/اشتباه) رو مستقیم روی Order ذخیره می‌کرد. # حالا فقط دو وضعیت نهاییِ معتبرِ کال‌بک درگاه پذیرفته می‌شه؛ 'pending' # وضعیت اولیه‌ی داخلیه و نباید از بیرون توسط webhook قابل‌تنظیم باشه. status = serializers.ChoiceField(choices=['paid', 'failed']) class WebhookResponseSerializer(serializers.Serializer): received = serializers.BooleanField() class TransactionSerializer(serializers.Serializer): id = serializers.CharField() gateway = serializers.CharField() status = serializers.CharField() paidAt = serializers.DateTimeField(allow_null=True) class OrderDetailResponseSerializer(serializers.Serializer): orderId = serializers.CharField() status = serializers.CharField() amount = serializers.IntegerField() transactions = TransactionSerializer(many=True)