Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mongodb 具有多个支付提供商的商店计费模式设计_Mongodb_Mongoose_Paypal_Stripe Payments_Telegram - Fatal编程技术网

Mongodb 具有多个支付提供商的商店计费模式设计

Mongodb 具有多个支付提供商的商店计费模式设计,mongodb,mongoose,paypal,stripe-payments,telegram,Mongodb,Mongoose,Paypal,Stripe Payments,Telegram,我在做什么 我正在用TelegrafJS编写一个电报机器人TelegrafJS+MongoDB;此bot允许用户使用三种类型的计费订阅专用频道: 贝宝 条纹 手动(当用户没有任何信用卡时,我手动生成专用频道的访问码,当用户插入访问码时,创建订阅) 这里的主要问题是客户参考,事实上,当我使用PayPal或Stripe生成订阅时,customer\u id是不同的,因为他们是不同的支付提供商,所以我有以下情况: P. Provider | Customer Id | Subscription I

我在做什么

我正在用TelegrafJS编写一个
电报
机器人
TelegrafJS
+
MongoDB
;此bot允许用户使用三种类型的计费订阅专用频道:

  • 贝宝
  • 条纹
  • 手动(当用户没有任何信用卡时,我手动生成专用频道的访问码,当用户插入访问码时,创建订阅)
这里的主要问题是客户参考,事实上,当我使用
PayPal
Stripe
生成订阅时,
customer\u id
是不同的,因为他们是不同的支付提供商,所以我有以下情况:

P. Provider | Customer Id | Subscription Id
   PayPal        1ac            a
   Stripe        2ac            b
实际上,我创建了以下模型来存储客户和订阅:

客户模型

let CustomerSchema = new Schema({
    telegram_id: Number,
    email: {
        type: String
    },
    hasTrial: {
        type: Boolean,
        default: true
    },
    subscriptions: [SubscriptionSchema],
    created_at: {
        type: Date,
        default: Date.now,
        required: true
    }
});
let SubscriptionSchema = new Schema({
    _id: String,
    period_start: {
        type: Date,
        required: true
    },
    period_end: {
        type: Date,
        required: true
    },
    status: {
        type: String,
        required: true
    },
    plan_id: {
        type: String,
        required: true
    }
});
如您所见,这里有一个字段
telegram\u id
,这是使用用户的
telegram.chat.id
进行估值的,并允许我在专用频道(用户付费访问的资源)中管理用户

还有
hasTrial
字段,允许我只创建一次手动订阅,此订阅未链接到任何支付提供商,而是以与其他订阅相同的方式存储:

订阅模式

let CustomerSchema = new Schema({
    telegram_id: Number,
    email: {
        type: String
    },
    hasTrial: {
        type: Boolean,
        default: true
    },
    subscriptions: [SubscriptionSchema],
    created_at: {
        type: Date,
        default: Date.now,
        required: true
    }
});
let SubscriptionSchema = new Schema({
    _id: String,
    period_start: {
        type: Date,
        required: true
    },
    period_end: {
        type: Date,
        required: true
    },
    status: {
        type: String,
        required: true
    },
    plan_id: {
        type: String,
        required: true
    }
});
主要问题是:我如何跟踪订阅
a
b
,它们属于不同的支付提供商(因此不同的
customer\u id

我的想法

我想在
客户模型中创建两个附加字段,如下所示:

stripe_id: String
paypal_id: String
但我真的不喜欢这个解决方案。我需要以某种方式存储两个支付提供商的客户id,因为订阅状态通过
webhooks
更改,例如:

  • 条带发送
    订阅。已取消
    挂接到链接到
    2ac
    客户的
    b
    订阅
  • 我的应用程序将订阅
    状态设置为
    已取消
    ,并将具有as
    电报id:5的用户从频道中踢出
  • 根据当前的数据库设计,我无法知道订阅链接到哪个用户


    你能给我提点建议吗?

    我不明白这怎么会是个问题。任何RDBMS都能够在同一列中存储不同格式的PayPal和Stripe
    subscription\u id
    ,并使用简单的SELECT查询来查找相同的
    customer\u id


    如有必要,PayPal(也许还有Stripe)会允许您通过订阅状态更新中的“自定义”字段传递和接收客户id,但我不建议以任何方式依赖此功能(可能除了作为备份之外——在写入时设置自定义字段,即新订阅设置,但在业务逻辑期间永远不要读取它)


    支付提供商不是数据库,其数据存储功能的使用不应超出有效支付处理所需的范围。正如我在回答的第一部分中提到的,您应该自己存储和检索id。

    问题在于我有一个客户表,其中包含客户的电报id和id g由mongodb生成,此id不是与每个提供商的订阅相关联的
    客户id
    ,因此我应该将提供商的
    客户id
    存储在
    订阅
    模型中,这是我想知道订阅链接到哪个客户的唯一方法。您的客户模型应该有一个参考他们的活动订阅id…和/或,你的订阅模型应该有一个它所属的客户的引用…任何一种方式都有效,并允许你使用订阅id来查找其相应的客户id。简单的1:1关系我理解你的意思,但你错过了一个要点,当
    webhook
    尝试时要将订阅添加到我的数据库,如何了解与该订阅链接的客户?问题仍然是一样的,我应该将我的客户在支付提供商系统上的参考信息存储在自定义字段中。我认为问题实际上不存在。假设数据存储正确,模型正确,您应该能够询问您的数据base:通过SELECT查询:“这是我的订阅\u id,它属于哪个客户\u id?”数据库应回答“它属于此客户\u id”。您不应该需要自定义字段。我强烈建议您不要依赖支付提供商的自定义字段来实现数据库应该实现的基本功能。仅将写入此类自定义字段作为备份(以防数据丢失)或者对于报告,如果您第一次获得订阅id时,它只有一个条带客户id,而没有您自己的客户id,那么是的,这是一个问题。但问题不是您的客户id和数据库中的订阅id之间的1:1关联,这应该很容易。问题是条带(可能还有PayPal)当他们第一次给你订阅id时,没有发送你自己的客户id。因此,像CUSTOM这样的字段可能会很有用!(如果没有其他方法来解决这个问题)。但是在将来,当你得到子更新时,你应该已经知道哪个子id会转到哪个客户id