2015-02-26 18 views
5

Tôi đang đấu tranh với các câu hỏi triết học trong cấu trúc DRF của mình bằng cách sử dụng trình xử lý thanh toán Stripe. Tôi đang bán một sản phẩm có mẫu django Product thông qua API REST DRF của tôi. Tôi tự hỏi nếu tôi nên tạo các Product và sau đó xử lý các thanh toán trong create tôi xem như sau:Django Rest Framework và Stripe, thực hành tốt nhất?

class ProductViewSet(viewsets.ModelViewSet): 

... 

def create(self, request): 
    serializer = ProductSerializer(data=request.data) 
    serializer.is_valid(raise_exception=True) 
    product = serializer.save() 

    try: 
     response = stripe.Charge.create(
      amount=product.cost, 
      currency="usd", 
      source=request.data["token"], # Done with Stripe.js 
      description="Product" 
     ) 
     product.charge_id = response.charge_id 

     ... 

hoặc thay vào đó, nếu tôi nên xử lý các payement trong serializer của Product:

class ProductSerializer(serializers.Serializer): 

    ... 

    def create(self, validated_data): 
     product = Product.objects.create(**validated_data) 

     # Will raise an Excetpion and stop the creation: 
     response = stripe.Charge.create(
      amount=product.cost, 
      currency="usd", 
      source=validated_data["token"], # Done with Stripe.js 
      description="Product" 
     ) 


     return product 

Phương pháp nào tốt hơn? Hoặc, tôi hoàn toàn bỏ lỡ điểm và nên làm điều đó một cách khác nhau?

Thứ hai, có cách nào để nhúng Stripe.js và biểu mẫu bắt buộc trong mẫu API có thể duyệt cho tuyến đường create để tôi có thể kiểm tra REST của mình mà không cần bất kỳ giao diện người dùng nào không?

Cảm ơn bạn đã giúp đỡ của bạn

Trả lời

1

Theo tôi cách tiếp cận đúng là một kết hợp của hai phương pháp được cung cấp bởi vì bạn nên gửi yêu cầu Stripe trong lớp ModelViewSet nhưng tiết kiệm đơn vị Product chỉ sau khi phản ứng thành công của dịch vụ.

Nếu không, nếu phản hồi của dịch vụ không thành công, tôi sẽ khôi phục từng thao tác cơ sở dữ liệu (với Django 1.6+ bạn có thể thực hiện bằng cách sử dụng transaction.atomic() được ghi lại here).

Tôi không thích phương pháp thứ hai của bạn vì theo tài liệu DRF về phương pháp create của serializers.Serializer phương pháp này chỉ trả về một thực thể mới cho dữ liệu đã xác thực, vì vậy tôi sẽ không thêm logic nghiệp vụ khác.

Về câu hỏi thứ hai tôi sẽ cấu trúc phương pháp create để sử dụng đối tượng giả được chèn cho yêu cầu Stripe, theo cách này, bạn có thể kiểm tra mã của mình về bất kỳ tương tác giao diện người dùng nào (rõ ràng theo cách này bạn không làm thử nghiệm tích hợp nhưng một thử nghiệm đơn vị).

+0

Cảm ơn. Tôi chỉ đơn giản là sạc sau khi xác nhận dữ liệu 'serializer.is_valid (raise_exception = True)' nhưng trước khi tạo đối tượng 'product = serializer.save()' trong khung nhìn của tôi. Đó là một chút buồn tôi phải lấy một số dữ liệu từ 'request.data' để tính phí ... Bạn có thể thêm chi tiết hơn (ví dụ bit bit) vào phần thứ hai không? – user2024621

Các vấn đề liên quan