如何将条带化付款与现有的django表单集成在一起,并且仅在成功付款后保存表单

时间:2019-03-10 20:44:58

标签: django django-forms stripe-payments

我想像的是一个非常标准的设置,一个带有购物车的电子商务应用程序,并且能够将订单存储在本地数据库中(需要知道要从批发商那里订购什么物品以及将它们运送到哪里)。

目前,所有这些功能都可以正常运行。我目前的“结帐”功能允许客户输入他们的详细信息,然后保存订单,每个订单都有多个订单项。

我想做的是使用此表单发送一些要分割的信息,如果收到返回指示成功的令牌,请将一些(但不是全部)字段保存到本地数据库。

我不是要在本地保存CC数据或类似的内容,我对安全风险和诸如PCI合规性之类的法律义务了如指掌。

我只是想拥有一种客户可以用来输入数据并点击付款的表格(就像大多数电子商务网站一样),而不是要用一种表格来输入数据,而要用另一种表格来付款。

非常缺少django-stripe文档,而Stripe API文档似乎仅包含ruby框架和javascript的示例,而django则没有。

我想做的是可能的,如果可以的话,正确的方法是什么?

如果需要,我可以发布我的模型,表单,视图和模板片段,但这似乎是一个逻辑和方法问题,而不是特定于代码的问题。

1 个答案:

答案 0 :(得分:0)

使用了Stripe,它实际上具有惊人的文档。您要查找的内容位于Stripe API Referencecharge部分下。您还需要创建一个token(可以通过HTTPS在服务器端或通过JS在客户端完成)。

实际上,您首先要通过Stripe向用户收费,如果响应成功,则将订单信息输入数据库。

示例如下:

from django.views.generic import View
import stripe
stripe.api_key = "sk_test_KEY_HERE"


class PaymentView(View):
    def post(self, request, *args, **kwargs):
        card_num = request.POST['card_num']
        exp_month = request.POST['exp_month']
        exp_year = request.POST['exp_year']
        cvc = request.POST['cvc']

        token = stripe.Token.create(
          card={
            "number": card_num,
            "exp_month": int(exp_month),
            "exp_year": int(exp_year),
            "cvc": cvc
          },
        )

        charge = stripe.Charge.create(
          amount=2000,
          currency="usd",
          source=token,  # obtained above
          #source="tok_visa", # obtained with Stripe.js (JS)
          description="Charge for jenny.rosen@example.com"
        )

        if charge['captured'] == True:
            Sale.objects.create(product=product, amount=amount)
            return redirect('app:success_page')

        return redirect('app:fail_page')