首页 > 解决方案 > Django Stripe webhook json数据如何在管理员中查看该数据

问题描述

我现在可以发送 webhook 并收到它并向 Stripe 返回 200 状态,但我不明白如何获取 json 中的信息。

{
  "object": {
    "id": "ch_1D2mVJEiQxrCiRvRgbqdtpbI",
    "object": "charge",
    "amount": 5000,
    "amount_refunded": 0,
    "application": null,
    "application_fee": null,
    "balance_transaction": "txn_1D2mVKEiQxrCiRvRAQ61MjSt",
    "captured": true,
    "created": 1535144857,
    "currency": "usd",
    "customer": null,
    "description": "A Django charge",
    "destination": null,
    "dispute": null,
    "failure_code": null,
    "failure_message": null,
    "fraud_details": {
    },
    "invoice": null,
    "livemode": false,
    "metadata": {
    },
    "on_behalf_of": null,
    "order": null,
    "outcome": {
      "network_status": "approved_by_network",
      "reason": null,
      "risk_level": "normal",
      "seller_message": "Payment complete.",
      "type": "authorized"
    },
    "paid": true,
    "receipt_email": null,
    "receipt_number": null,
    "refunded": false,
    "refunds": {
      "object": "list",
      "data": [
      ],
      "has_more": false,
      "total_count": 0,
      "url": "/v1/charges/ch_1D2mVJEiQxrCiRvRgbqdtpbI/refunds"
    },
    "review": null,
    "shipping": null,
    "source": {
      "id": "card_1D2mVEEiQxrCiRvRTa2poVVT",
      "object": "card",
      "address_city": null,
      "address_country": null,
      "address_line1": null,
      "address_line1_check": null,
      "address_line2": null,
      "address_state": null,
      "address_zip": null,
      "address_zip_check": null,
      "brand": "Visa",
      "country": "US",
      "customer": null,
      "cvc_check": null,
      "dynamic_last4": null,
      "exp_month": 9,
      "exp_year": 2021,
      "fingerprint": "p6BWjMSv83IqjoCg",
      "funding": "credit",
      "last4": "4242",
      "metadata": {
      },
      "name": "marie.pier.cm@gmail.com",
      "tokenization_method": null
    },
    "source_transfer": null,
    "statement_descriptor": null,
    "status": "succeeded",
    "transfer_group": null
  },
  "previous_attributes": null
}

我想检索创建的(作为日期)、object.id、object.amount 和 object.paid,以便能够在 django admin 中查看。

views.py 中的代码是

@require_POST
@csrf_exempt
def webhook(request):
    # Retrieve the request's body and parse it as JSON:
    jsondata = request.body
    data = json.loads(jsondata)

    return HttpResponse(status=200)

我想填充的模型是这样的

class StripePayment(models.Model):
    paymentId = models.CharField(max_length=200)
    paymentAmount = models.CharField(max_length=10)
    paid =  models.BooleanField()
    created = models.DateTimeField()

    def __str__(self):
        return self.paymentId

我知道它会像

@require_POST
@csrf_exempt
def webhook(request):
jsondata = request.body
    data = json.loads(jsondata)
    meta = copy.copy(request.META)
    for k, v in meta.items():
        if not isinstance(v, basestring):
            del meta[k]

    modelname.objects.create(
        .......)

但我无法弄清楚,请帮助:)


如果有人需要在某一点上解决这个问题:views.py

  @require_POST
@csrf_exempt
def webhook(request):
    payload = request.body
    sig_header = request.META['HTTP_STRIPE_SIGNATURE']
    event = None

    try:
        event = stripe.Webhook.construct_event(
        payload, sig_header, endpoint_secret
        )
    except ValueError as e:
        # Invalid payload
        return HttpResponse(status=400)
    except stripe.error.SignatureVerificationError as e:
        # Invalid signature
        return HttpResponse(status=400)

    # Do something with event

    return HttpResponse(status=200)

    paymentId = payload['object:id']
    amount = payload['object:amount']
    paid = payload['paid']

    StripePayment.objects.create(
        paymentId=paymentId,
        amount=amount,
        paid=paid,
    )

和models.py

class StripePayment(models.Model):
paymentId = models.CharField(max_length=150)
amount = models.CharField(max_length=150)
paid = models.BooleanField()

标签: djangodjango-viewsdjango-adminstripe-payments

解决方案


您无法通过payload['object:id']. 您需要将每个级别视为一个单独的字典,它是:

payment_id = payload['object']['id']
amount = payload['object']['amount']
paid = payload['object']['paid']

另请注意,您return的代码就在此代码之前,因此其余部分将永远不会执行。您应该将该返回移动到函数的末尾。


推荐阅读