Tech Stack - Django, Angular我一直在执行条纹订阅模式,但陷入了一些荒谬的场景。我得到的订阅没有被django发现。请阅读完整的场景。
首先,我成功创建了条带会话。代码
session = stripe.checkout.Session.create(
metadata={'price_id':request.data.get('price_id'),'product_id':request.data.get('product_id'),'product_name':request.data.get('product_name')},
client_reference_id=request.user.id,
customer=customer.stripe_customer_id,
success_url='http://localhost:4200/success?session_id={CHECKOUT_SESSION_ID}',
cancel_url='http://localhost:4200/canceled.html',
mode='subscription',
line_items=[{
'price': request.data['price_id'],
# For metered billing, do not pass quantity
'quantity': 1,
}],
)
人实现:
- checkout.session.completed我正在创建客户和订阅模型在我的数据库。
print(user)
customer = RecruiterUserProfile.objects.get(user = user)
print(customer)
customer.customer_id = session.customer
customer.save()
stripecustomer = Customer.objects.get(recruiter = customer, checkout_session_id = stripe_session_id)
print(stripecustomer)
stripecustomer.stripe_customer_id = stripe_customer_id
stripecustomer.save()
subscription,created = Subscriptions.objects.get_or_create(recruiter = customer,
sub_id=stripe_subscription_id,customer_id = stripecustomer,stripe_customer_id = stripe_customer_id,
payment_status=stripe_payment_status, amount = stripe_amount,
status = stripe_status, product_id = stripe_metadata['product_id'], price_id = stripe_metadata['price_id'], product_name = stripe_metadata['product_name'])
- invoice.paid然后它触发Invoice。付费,其中我获得订阅模式,并更新其中的其他值。但是由于webhooks不等待我们的调用,有时,它找不到订阅。
现在,如果我在发票中创建订阅和客户。付费webhook使用ger_or_create,我该如何将其链接到用户。
下面是我的模型:
class Customer(models.Model):
recruiter = models.OneToOneField(RecruiterUserProfile, on_delete=models.PROTECT)
stripe_customer_id = models.CharField(max_length=80, blank=True, null=True)
checkout_session_id = models.CharField(max_length=100,blank=True,null=True)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
def __str__(self):
return f"{self.recruiter.user.email} has a stripe customer id {self.stripe_customer_id}"
def expiration():
return now() + timedelta(days=30)
class Subscriptions(models.Model):
STATUS_CHOICES =(
('utilised','Utilised'),
('accessible','Accessible'),
('notaccessible','Notaccessible')
)
recruiter = models.ForeignKey(RecruiterUserProfile, on_delete=models.PROTECT)
customer_id = models.ForeignKey(Customer, on_delete=models.PROTECT)
stripe_customer_id = models.CharField(max_length=80, blank=True, null=True)
sub_id = models.CharField(max_length=80, blank=True, null=True)
product_id = models.CharField(max_length=80, blank=True, null=True)
product_name = models.CharField(max_length=80, null=True, blank=True)
price_id = models.CharField(max_length=80, blank=True, null=True)
offer_id = models.CharField(max_length=80, blank=True, null=True)
notes = models.JSONField(default=list,blank=True)
status = models.CharField(max_length=100, default="Initial")
payment_status = models.CharField(max_length = 100, default='')
amount = models.CharField(max_length=20,blank=True, null=True)
start_date = models.DateTimeField(null=True, blank=True)
expiration_date = models.DateTimeField(
default=expiration,
verbose_name='Expirate in'
)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
client_validity = models.CharField(max_length=20,choices= STATUS_CHOICES, default='accessible')
product_job_credits = models.IntegerField(default=0)
active_job_credits = models.IntegerField(default=0)
is_cancelled = models.BooleanField(default=False)
我设法通过简单的工作流程更改来解决这个问题。不要直接调用订阅API。首先自己创建一个条带客户,并将值存储在本地数据库中。因此,在创建订阅时,您将能够获得客户,并且可以轻松地将订阅与客户联系起来。
如果需要,我可以共享代码。