从 Parse.com 的 webhook 中包含的 ID 检索客户电子邮件
Retrieve customer email from ID contained in webhook in Parse.com
我有一个应用程序使用 Parse.com 作为后端和一个外部站点作为我的支付网关。从 Stripe 收到 customer/subscription webhook 数据后,我希望查找用户的电子邮件,这样我就可以 运行 Cloud Code 函数并将他们的用户状态更改为 'paid'
我的 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:
、error
、request
response
)等进一步阅读赞赏。
现在有效
快速浏览了与 stripe 相关的文档,步骤如下:(1) 从您的客户端调用 stripe 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);
});
});
现在我们只需要构建名为 payStripeWithToken
和 updateUserWithStripeResult
的承诺返回函数。
// 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();
}
出于兴趣,我这样做了:
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
returns一个拯救用户的承诺。将由用户对象实现,而不是用户名
确保您清楚如何识别用户。 stripe 显然提供了电子邮件地址,但在您的用户查询中(在 set_user_status
中)您将电子邮件与 "username" 进行了比较。一些系统设置 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;
});
}
我有一个应用程序使用 Parse.com 作为后端和一个外部站点作为我的支付网关。从 Stripe 收到 customer/subscription webhook 数据后,我希望查找用户的电子邮件,这样我就可以 运行 Cloud Code 函数并将他们的用户状态更改为 'paid'
我的 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:
、error
、request
response
)等进一步阅读赞赏。
现在有效
快速浏览了与 stripe 相关的文档,步骤如下:(1) 从您的客户端调用 stripe 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);
});
});
现在我们只需要构建名为 payStripeWithToken
和 updateUserWithStripeResult
的承诺返回函数。
// 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();
}
出于兴趣,我这样做了:
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
returns一个拯救用户的承诺。将由用户对象实现,而不是用户名
确保您清楚如何识别用户。 stripe 显然提供了电子邮件地址,但在您的用户查询中(在 set_user_status
中)您将电子邮件与 "username" 进行了比较。一些系统设置 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;
});
}