我正在尝试为我的烧瓶应用程序生成优惠券。
我需要一些不易制作的优惠券,可以使用正确的密钥阅读,并且随时间推移是唯一的。
我已经尝试过类似的哈希:
from hashids import Hashids
hash_id = Hashids(salt='Super salt', min_length=8)
hash_id.encrypt(30)
# 'voRDznrz'
问题是生成的密钥总是相同的。
我也尝试过更危险的解决方案:
import itsdangerous
signer = itsdangerous.URLSafeTimedSerializer("Super salt")
coupon = signer.dumps("30 days free!")
signer.load(coupon, max_age=3600*24*30)
# IjMwIGRheXMgZnJlZSEi.Dl1JAQ.u_ilEm7nQ_8XIQt3nbwe31hyyRc
解决方案要好得多,但我需要存储已使用的优惠券以禁止任何重复使用。此优惠券非常难看,很难为我们的用户打字。
好的,所以我使用Stripe进行付款,答案就在他们的文档中。在python中使用Stripe,你可以这样创建优惠券:
stripe.api_key = "Your secret api key"
coupon = stripe.Coupon.create(
duration='repeating',
duration_in_month=2,
percent_off=100,)
这意味着优惠券将为任何订阅提供2个月的免费月份,但我没有找到如何选择可以应用优惠券的特定产品。
创建优惠券对象后,您只需使用他的ID,这是您的优惠券代码。要将它绑定到订阅(并应用它),您可以:
subscription = stripe.Subscription.retrieve("Subscription ID")
subscription.coupon = coupon.id
subscription.save()
Normaly优惠券不是散列键,只是一些文本,如30FREE,并存储在一个表格中,其中一列表明优惠券是否已被使用(如果在表格中,则存在优惠券)。
如果您现在不使用ORM,我建议使用Flask-SQLAlchemy的SQLAlchemy,非常容易设置和启动。
注意:您可以将优惠券分配给在优惠券表和用户表之间建立关系的一部分用户,然后实现该组内只有用户的逻辑可以兑换优惠券或类似的东西。