【问题标题】:Retrieve customer email from ID contained in webhook in Parse.com从 Parse.com 的 webhook 中包含的 ID 检索客户电子邮件
【发布时间】:2015-07-10 13:49:23
【问题描述】:

我有一个使用 Parse.com 作为后端的应用程序和一个充当我的支付网关的外部站点。从 Stripe 收到客户/订阅 webhook 数据后,我希望查找用户的电子邮件,然后我可以运行云代码功能并将他们的用户状态更改为“付费”

我的 webhook 接收器是:

Parse.Cloud.define("update_user", function(request, response) {

  var data = request.params["data"]
  var customer = data.object.customer;

  response.success'Working' + request);
});

我可以使用以下方式从客户 ID 的条带中收到一封电子邮件:

Parse.Cloud.define("pay", function(request, response) {
Stripe.initialize(STRIPE_SECRET_KEY);
console.log(JSON.stringify(request.params));

    Stripe.Customers.retrieve(
        customerId, {
            success:function(results) {
                console.log(results["email"]);
                // alert(results["email"]);
                response.success(results);
            },
            error:function(error) {
                response.error("Error:" +error); 
            }
        }
    );
});

我需要帮助将其转换为一个完整的函数,该函数在收到来自 Stripe 的每个 webhook 时运行。如果无论出于何种原因这不起作用,我也在为后备选项而苦苦挣扎。

编辑

采取第一个答案的部分,我现在有:

Parse.Cloud.define("update_user", function(request, response) {
Stripe.initialize(STRIPE_SECRET_KEY);

    var data = request.params["data"]
    var customerId = data.object.customer;

    get_stripe_customer(customerId, 100).then(function(stripeResponse) {
        response.success(stripeResponse);
    }, function(error) {
        response.error(error);
    });
});

function get_stripe_customer (customerId) {
Stripe.initialize(STRIPE_SECRET_KEY);
    return Stripe.Customers.retrieve(
        customerId, {
            success:function(results) {
                console.log(results["email"]);
            },
            error:function(error) {
            }
        }
    );
};

我的知识确实落在了 Promise 方面以及回调(success:errorrequestresponse)等进一步阅读将不胜感激。

现在可以了

【问题讨论】:

  • 我认为您对这个问题没有什么吸引力,因为它相当于“我如何编写云函数来更新用户”?这没问题,但它需要:(a) 输入清晰,例如在那一大堆 JSON 中用户识别特征在哪里,(b) 删除那一大堆 JSON,以及 (c) 至少尝试代码——这里的门槛很低,但与 SO 人交谈就像与巴黎人交谈。如果你尝试英语,只是大声一点,你会被冷落,但一个谦虚的,甚至是拙劣的法语尝试通常会得到慷慨的帮助。
  • 谢谢...请看我的编辑
  • 太棒了。下面根据 parse.com 上描述的使用 Stripe 的流程回答。它假定登录用户是付款的用户。

标签: javascript parse-platform stripe-payments webhooks


【解决方案1】:

出于兴趣,我这样做了:

Parse.Cloud.define("update_user", function(request, response) {

    var data = request.params["data"]
    var customerId = data.object.customer;

    get_stripe_customer(customerId, 100).then(function(stripeResponse) {
        return set_user_status(username, stripeResponse);
    }).then(function(username) {
        response.success(username);
    }, function(error) {
        response.error(error);
    });
});

function get_stripe_customer (customerId) {
Stripe.initialize(STRIPE_SECRET_KEY);
    return Stripe.Customers.retrieve(
        customerId, {
            success:function(results) {
              // console.log(results["email"]);
            },
            error:function(error) {
            }
        }
    );
};

function set_user_status(stripeResponse) {

  Parse.Cloud.useMasterKey();
  var emailquery = new Parse.Query(Parse.User);
    emailquery.equalTo("username", stripeResponse['email']);  // find all the women
    return emailquery.first({
      success: function(results) {
          alert('running set_user_status success');
          var user = results;
              user.set("tier", "paid");
              user.save();
    },
      error:function(error) {
        console.log('error finding user');
    }
  });
};

欢迎改进...

编辑 - 我 (@danh) 稍微清理了一下。几点说明:

始终使用承诺。更容易阅读和处理错误

get_stripe_customer 只需要一个参数(100 是我的想法,收取 100 美元)

set_user_status appears 只需要用户电子邮件作为参数,这显然在 stripeResponse 中

set_user_status 返回一个拯救用户的承诺。这将通过用户对象而不是用户名来实现

请确保您清楚如何识别用户。 stripe 显然提供了电子邮件地址,但在您的用户查询(set_user_status)中,您将电子邮件与“用户名”进行比较。一些系统设置username == email。确保您的查询执行或更改该查询。

Parse.Cloud.define("update_user", function(request, response) {
    var data = request.params["data"]
    var customerId = data.object.customer;

    get_stripe_customer(customerId).then(function(stripeResponse) {
        var email = stripeResponse.email;
        return set_user_status(email);
    }).then(function(user) {
        response.success(user);
    }, function(error) {
        response.error(error);
    });
});

function get_stripe_customer(customerId) {
    Stripe.initialize(STRIPE_SECRET_KEY);
    return Stripe.Customers.retrieve(customerId).then(function(results) {
        // console.log(results["email"]);
        return results;
    });
};

function set_user_status(email) {
    Parse.Cloud.useMasterKey();
    var emailquery = new Parse.Query(Parse.User);
    emailquery.equalTo("username", email);  // find all the women
    return emailquery.first().then(function(user) {
        user.set("tier", "paid");
        return user.save();
    }, function(error) {
        console.log('error finding user ' + error.message);
        return error;
    });
}

【讨论】:

  • 我使用电子邮件作为用户名。非常感谢您的时间、指导和代码 danh。我相信您可以看到我在 JS 中的弱点,您有什么建议可以改进,而无需像大多数教程一样从头开始进行所有操作。
  • 很高兴为您提供帮助。似乎你有了一个好的开始。我认为要走的路就是继续写作(和编辑,再编辑),力求简单明了。
  • 我认为var email = stripeResponse.email; 需要是var email = stripeResponse["email"];
  • 这些形式几乎是同义词。在大多数情况下,我选择点符号。看这里stackoverflow.com/questions/4968406/…
【解决方案2】:

快速浏览了有关条带的文档,步骤如下:(1) 从客户端进行条带 REST-api 调用以获取令牌,(2) 将该令牌传递给云函数,(3)从解析云调用stripe完成支付。我了解您希望包含 (4) 第四步,其中交易记录在付款用户的数据中。

来自客户端(假设是 JS 客户端):

var token = // we've retrieved this from Stripe's REST api
Parse.Cloud.run("pay", { stripeToken: token }).then(function(result) {
    // success
}, function(error) {
    // error
});

在服务器上:

Parse.Cloud.define("pay", function(request, response) {
    var user = request.user;
    var stripeToken = request.params.stripeToken;
    payStripeWithToken(stripeToken, 100).then(function(stripeResponse) {
        return updateUserWithStripeResult(user, stripeResponse);
    }).then(function(user) {
        response.success(user);
    }, function(error) {
        response.error(error);
    });
});

现在我们只需要构建称为 payStripeWithTokenupdateUserWithStripeResult 的承诺返回函数。

// return a promise to pay stripe per their api
function payStripeWithToken(stripeToken, dollarAmt) {
    Stripe.initialize(STRIPE_SECRET_KEY);  // didn't see this in the docs, borrowed from your code
    return Stripe.Charges.create({
        amount: dollarAmt * 10, // expressed in cents
        currency: "usd",
        card: stripeToken  //the token id should be sent from the client
    });
    // caller does the success/error handling
}

// return a promise to update user with stripeResponse
function updateUserWithStripeResult(user, stripeResponse) {
    var transactionId = // dig this out of the stripeResponse if you need it
    user.set("paid", true);
    user.set("transactionId", transactionId);
    return user.save();
}

【讨论】:

  • 首先这太棒了 - 谢谢。不过,我可能已经怀念带领你咯。我没有从我的应用程序中触发此代码 - 这是在外部站点上成功收取卡费用后从条带传入的 webhook。我只需要从 Stripe 获取客户电子邮件(需要回电给 Stripe)> 查询解析用户以获取该电子邮件/用户名,然后更新他们的记录。
猜你喜欢
  • 2014-08-05
  • 1970-01-01
  • 1970-01-01
  • 2016-08-18
  • 2020-10-31
  • 2012-12-17
  • 2015-06-13
  • 2020-11-15
  • 2017-08-27
相关资源
最近更新 更多