django - 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()
解决方案
您无法通过payload['object:id']
. 您需要将每个级别视为一个单独的字典,它是:
payment_id = payload['object']['id']
amount = payload['object']['amount']
paid = payload['object']['paid']
另请注意,您return
的代码就在此代码之前,因此其余部分将永远不会执行。您应该将该返回移动到函数的末尾。
推荐阅读
- loops - FOR/NEXT 带有多个 next 命令
- excel - 如何仅匹配单元格值的一部分而不是 VBA for Excel 中的完全匹配?
- excel - 是否可以从 vba 运行 Photoshop 动作或批处理
- r - 加入 2 个嵌套列表
- python - 使用 SQLAlchemy ORM 批量插入并返回主键
- group-by - groupby 之外的列的 pyspark collect_set
- r - 当我添加形状时,分组哑铃图变得不稳定
- javascript - 强制浏览器缓存 MP4 视频
- vagrant - 本地 Sugar 实例中的错误问题
- python - 在logging.StreamHandler中上升UnicodeEncodeError