javascript - retrieve - stripe lib
Recupere el correo electrónico del cliente desde la ID contenida en el webhook en Parse.com (2)
Tengo una aplicación que usa Parse.com como servidor y un sitio externo que actúa como mi puerta de enlace de pago. Al recibir los datos del webhook del cliente / suscripción de Stripe, deseo buscar el correo electrónico de los usuarios para poder ejecutar una función de código de nube y cambiar su estado de usuario a ''pagado''.
Mi receptor webhook es:
Parse.Cloud.define("update_user", function(request, response) {
var data = request.params["data"]
var customer = data.object.customer;
response.success''Working'' + request);
});
Y puedo recibir un correo electrónico de vuelta desde la identificación del cliente usando:
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);
}
}
);
});
Necesito ayuda para convertir esto en una función completa que se ejecuta al recibir cada webhook de Stripe. También estoy luchando con opciones de recuperación si esto no funciona por alguna razón.
EDITAR
Tomando partes de la primera respuesta y ahora tengo:
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) {
}
}
);
};
Mi conocimiento realmente está cayendo en el lado de la Promesa y también se apreciará la devolución de llamada ( success:
error
, request
response
), etc.
Esto ahora está funcionando
Fuera de interés, hice esto:
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'');
}
});
};
abierto a mejoras ...
EDITAR - Yo (@danh) lo limpié un poco. Algunas notas:
promesas usadas en todas partes. mucho más fácil de leer y manejar errores
get_stripe_customer
requiere solo un param (ese 100 fue mi idea de cobrar $ 100)
set_user_status appears
necesitar solo el correo electrónico del usuario como param, que aparentemente está en stripeResponse
set_user_status
devuelve la promesa de salvar al usuario. eso se cumplirá con el objeto del usuario, no el nombre de usuario
asegúrese de tener claro cómo identificar al usuario. stripe aparentemente proporciona una dirección de correo electrónico, pero en su consulta de usuario (en set_user_status
) compara el correo electrónico con "username". algunos sistemas establecen username == email
. asegúrese de que el suyo haga o cambie esa consulta.
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;
});
}
Hice una rápida revisión de los documentos pertenecientes a la banda, y parece que los pasos son: (1) hacer una llamada REST-api de banda desde su lado del cliente para obtener un token, (2) pasar ese token a una función de nube, ( 3) call stripe desde la nube de análisis para terminar de pagar. Entiendo que le gustaría incluir un (4) cuarto paso en el que la transacción se registra en los datos para el usuario que paga.
Del cliente (asumiendo un cliente 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
});
En el servidor:
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);
});
});
Ahora solo necesitamos construir funciones de retorno de payStripeWithToken
llamadas payStripeWithToken
y 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();
}