验证免费增值产品订阅服务的方法是有效的

时间:2008-12-30 21:34:47

标签: credit-card billing

我们有免费增值产品,如果已经支付了每月订阅,那么可以使用某些功能;如果没有付款,那么免费功能仍然可用。

以下是我在考虑如何处理它,但想检查一下:

1)当有人购买订阅时,会创建定期结算时间表。

2)用户将字段(paid_up)设置为“y”

3)当用户重新登录时,验证脚本会检查paid_up是否为“y”。如果是,则创建会话令牌

4)我想我需要一个可以切换切换的批处理脚本。想知道怎么做?存储成功处理的最后一张信用卡的日期?

4 个答案:

答案 0 :(得分:0)

当然,你会创建一个名为'last_payment'的列。如果使用MySQL,您可以将其创建为DATE字段。每次收到您的月付款,我假设信用卡结算公司会在您的网站上发布一些脚本。 (即paypal发送IPN)。每次收到此消息时,您都会执行以下查询:

UPDATE members SET `last_payment`=CURDATE() WHERE user_id='$user_id';

我建议在CRON上运行一个每24小时运行一次的脚本,然后执行此查询:

UPDATE members SET paid_up='N' WHERE DATEDIFF(CURDATE(),last_payment) > '30';

这将更新30天或更长时间内未付款的所有记录,并将paid_up字段设置为N.然后您的正常登录代码将起作用。

如果您不想使用CRON,可以将登录查询更改为以下内容:

SELECT 1 FROM members WHERE 
username='$user' AND password='$password'
AND DATEDIFF(last_payment) <= '30';

顺便说一句,您的信用卡处理公司可能会在取消订阅时向您发送POST,这样您就可以将paid_up字段设置为N.

希望这会有所帮助。如果您有任何问题,请随时发表评论:)

答案 1 :(得分:0)

我会从另一端开始工作,并在那里存储付费日期的付费字段。通过这种方式,您可以让用户在那里取消,并且仍然可以获得他们所做的付款。

答案 2 :(得分:0)

如果经常性结算流程是您自己运行的,则可以将这些检查作为流程的一部分。我在算法上考虑这个问题的方式如下:

对于每个到期的客户 在其帐户上运行结算
如果成功:
重试重置为0
将他们标记为付费客户
继续下一个帐户
否则:
增加他们的重试计数器
向客户发送提醒
如果他们的重试计数器达到最大值:
切换开关将其标记为空闲

如果其他内容运行结算并且只是告诉您结果,您可以批量执行相同操作,只需将“在其帐户上运行结算”替换为“从上次结算尝试中读取结果”。假设您的计费按日计划运行,您的重试计数器会实现宽限期,这样他们就有机会解决结算问题,而不仅仅是因为他们的卡已过期或某些原因而撤销其高级功能。 / p>

答案 3 :(得分:0)

之前写过其中的一些内容,你应该做几件事。

首先,正如其他人所说,您需要某种paid_through_date字段。这一点很重要,原因很多,但主要原因是,如果您的服务器出现故障,它会为您提供额外的灵活性,并且您认为用户应该获得额外一天的免费服务。只需将他们的paid_through_date值推迟一天即可。这也使免费试用变得简单。

其次,即使您正在使用订阅系统,也不要使用像Authorize.net的Automated Recurring Billing这样的东西。您希望完全控制何时安排付款,并且在大多数情况下将该责任卸载到您的网关只是一个坏主意。大多数网关允许您在其服务器上存储信用卡。他们会给你一张该卡的身份证,你可以针对该中间身份证而不是卡本身发出指控。

第三,记录所有交易。我不能过分强调这一点。实际上,您可能也应该将此日志公开给用户。基本上只是他们所做的所有付款,金额和最终余额的表格。将发票放入此表也很常见。发票具有正数,支付和信用具有负数,并且仅为用户总结所有内容以获得最终余额。如果需要,您可以非常轻松地向该表引入任意信用。

运行一个每24小时触发一次的cron脚本,用于检查用户生成发票所需的内容。这个cron脚本应该有三个关键属性:首先,如果由于某种原因它没有运行,你不应该失去一天的收费。其次,如果它在一天中运行不止一次,或者如果它在中途中止并重新运行,则不应该向人们收取两次费用。第三,如果服务器上的日期被意外更改为2090,则不应自动向所有用户收取数百万美元的费用。同样,重置过去的日期(特别是1970年1月1日)也应该导致它提高地狱。根据我的经验,夏令时很少成为问题。

我认为这涵盖了大部分重要内容,但在结算系统中总是存在很少的问题需要注意。