【问题标题】:passing Stripe token to Firebase (obj-c)将 Stripe 令牌传递给 Firebase (obj-c)
【发布时间】:2018-08-06 23:15:33
【问题描述】:

我已经为我的 Firebase 部署了一个云功能,以便使用 Firebase 作为我的后端服务器来处理 Stripe 付款。 我使用过的示例 Firebase 云函数的链接:https://github.com/firebase/functions-samples/tree/master/stripe

这是我在应用中向用户收费时应该触发的功能

exports.createStripeCharge = functions.database.ref('/stripe_customers/{userId}/charges/{id}').onWrite((event) => {
  const val = event.data.val();


  if (val === null || val.id || val.error) return null;

  return admin.database().ref(`/stripe_customers/${event.params.userId}/customer_id`).once('value').then((snapshot) => {
    return snapshot.val();
  }).then((customer) => {

    const amount = val.amount;
    const idempotency_key = event.params.id;
    let charge = {amount, currency, customer};
    if (val.source !== null) charge.source = val.source;
    return stripe.charges.create(charge, {idempotency_key});
  }).then((response) => {

    return event.data.adminRef.set(response);
  }).catch((error) => {


    return event.data.adminRef.child('error').set(userFacingMessage(error));
  }).then(() => {
    return reportError(error, {user: event.params.userId});
  });
});

我知道当我的数据库发生变化时会触发上述功能。 我的问题是,将 Stripe 付款详细信息传递到我的 Firebase 数据库的正确方法是什么?阅读条带文档后,我不确定应该将什么传递给我的 firebase 数据库。

谁能帮我解答这个问题?谢谢!!

附:我的开发环境:Objective C,IOS应用。

【问题讨论】:

    标签: ios objective-c firebase firebase-realtime-database stripe-payments


    【解决方案1】:

    最简单的方法是让您的应用向HTTP Firebase function 发出 HTTP POST 请求。您的应用程序应该已经在执行此操作以创建 Stripe 临时密钥,并且您可以以类似的方式处理付款。收费成功后,您可以将结果信息保存到您的数据库中。

    功能:

    const functions = require('firebase-functions');
    const admin = require('firebase-admin');
    const express = require('express');
    const bodyParser = require('body-parser');
    
    const stripeApp = express();
    
    stripeApp.use(bodyParser.json());
    
    stripeApp.post('/order', (req, res) => {
      const { source } = req.body; // This is the token provided by your app
    
      return stripe.charges.create({...}) // the actual payment
    });
    
    exports.stripeAPI = functions.https.onRequest(stripeApp);
    

    试一试 Stripe 的演示 iOS 应用程序 - 它速度很快,但在 Obj-C 世界中应该仍然有意义。 https://github.com/stripe/stripe-connect-rocketrides/tree/master/ios/RocketRides

    特别是https://github.com/stripe/stripe-connect-rocketrides/blob/master/ios/RocketRides/MainAPIClient.swift#L39

    【讨论】:

    • 谢谢丹,但我对服务器的东西有点陌生。我可以将您答案中的功能代码上传到我的 Firebase 服务器,我的应用程序将通过 MyAPIClient.swift 与我的 Firebase 服务器通信吗?
    • 基本上是的! HTTP 函数将为您提供一个 url 端点,您的应用程序中的 APIClient 可以向该端点发出请求。
    【解决方案2】:

    所以对我有用的过程是-

    1) iOS 使用原生 SDK 向 Stripe 提供卡片详细信息

    2) Stripe 提供了一个令牌,您可以将其发送到您的 Firebase 后端

    you could store it in stripeTokens/userId/yourToken

    3) Firebase 云函数然后触发一个函数并使用此令牌创建 Stripe 客户(参见 saving for laterCustomer

    you could store it in stripe_customers/userId/stripeCustomerId like your example

    4) 记得删除yourToken,因为它只有效一次

    5) 最后你可以使用这个stripeCustomerId 付款

    这里的重要概念是创建一个客户并在您的后端存储以供将来付款。

    希望这会有所帮助。

    【讨论】:

    • 感谢 grgmo,如果我使用 Firebase 作为后端,在处理 Stripe 支付时,我们是否需要编写 APIClient 函数(如 Stripe 文档中的函数)?
    • 以及如何将 Stripe 令牌发送到 Firebase 后端?我的理解是将令牌“写入”到 firebase 数据库。但它似乎不起作用,因为当我尝试“编写”它时,firebase 告诉我它不支持令牌的类型。
    • 您只需要一个付费的 Firebase 帐户,因为 Stripe 是外部的,您可以使用 stripe 库进行条带调用。您的令牌应该类似于 tok_1234
    • 我只能使用 Stripe 的自定义集成吗?因为我找不到在 Stripe 文档的标准集成中生成令牌的位置。而且我无法将令牌直接写入我的 Firebase 数据库,您对此有任何线索吗?再次感谢 grgmo!
    • this 应该是获取令牌所需的全部内容,并且您需要自己实现 submitTokenToBackend 方法以写入 Firebase
    猜你喜欢
    • 2023-04-02
    • 2016-06-22
    • 2015-05-25
    • 2019-10-05
    • 2019-09-21
    • 2021-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多