从Parse.com中的webhook中包含的ID中检索客户电子邮件

时间:2015-04-30 18:11:48

标签: javascript parse-platform stripe-payments webhooks

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

我的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:errorrequest response)等等,我们将不胜感激。

现在正在运作

2 个答案:

答案 0 :(得分:3)

出于兴趣,我做到了这一点:

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只需要用户电子邮件作为param,显然是在stripeResponse中

set_user_status返回保存用户的承诺。将使用用户对象而不是用户名

来实现

确保您清楚了解如何识别用户。条纹显然提供了电子邮件地址,但在您的用户查询中(在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;
    });
}

答案 1 :(得分:2)

快速浏览了与stripe有关的文档,看起来步骤如下:(1)从客户端进行条带REST-api调用以获取令牌,(2)将该令牌传递给云功能,(3)从解析云调用条带完成支付。我知道您希望包括(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();
}