Проблемы при интеграции Stripe с Parse
Код для создания токена
- (IBAction)save:(id)sender
{
STPCard *card = [[STPCard alloc] init];
card.number = self.paymentView.card.number;
card.expMonth = self.paymentView.card.expMonth;
card.expYear = self.paymentView.card.expYear;
card.cvc = self.paymentView.card.cvc;
[[STPAPIClient sharedClient] createTokenWithCard:card
completion:^(STPToken *token, NSError *error) {
if (error) {
NSLog(@"%@",error);
} else {
NSString *myVal = [NSString stringWithFormat:@"%@",token];
NSLog(@"%@",token);
[PFCloud callFunctionInBackground:@"chargeMoney"
withParameters:@{@"token":myVal}
block:^(NSString *result, NSError *error) {
if (!error) {
NSLog(@"from Cloud Code: %@",result);
}
}];
};
}];
}
Код для зарядки
Parse.Cloud.define("chargeMoney", function(request, response) {
response.success(request.params.token);
var stripe = require('stripe');
stripe.initialize('sk_test_ldqwdqwdqwdqwdwqdqwd ');
var stripeToken = request.params.token;
var charge = stripe.charges.create({
amount: 1000, // amount in cents, again
currency: "usd",
source: stripeToken,
description: "payinguser@example.com"
}, function(err, charge) {
if (err && err.type === 'StripeCardError') {
// The card has been declined
}
});
});
Я получаю ошибку
[Error]: TypeError: Cannot call method 'create' of undefined
at main.js:11:31 (Code: 141, Version: 1.7.1)
В чем проблема с моим кодом. Я не изменил ничего, что я делаю в соответствии с документацией. Любой, пожалуйста, предложите, что проблема в моем коде.
2 ответа
Решение
Проведя одну ночь, наконец, я обнаружил свои ошибки. В моем коде есть три ошибки:
Ошибка 1
Замени это
NSString *myVal = [NSString stringWithFormat:@"%@",token];
с
NSString *myVal = [NSString stringWithFormat:@"%@",token.tokenId];
Ошибка 2
stripe.initialize('sk_test_ldqwdqwdqwdqwdwqdqwd ');
Это дополнительный пробел в ключе после последнего слова, т. Е. "D".
Ошибка 3
Удали это
response.success(request.params.token);
сверху
Наконец рабочий код:
Создать токен
- (IBAction)save:(id)sender
{
STPCard *card = [[STPCard alloc] init];
card.number = self.paymentView.card.number;
card.expMonth = self.paymentView.card.expMonth;
card.expYear = self.paymentView.card.expYear;
card.cvc = self.paymentView.card.cvc;
[[STPAPIClient sharedClient] createTokenWithCard:card
completion:^(STPToken *token, NSError *error) {
if (error) {
NSLog(@"%@",error);
} else {
NSString *myVal = token.tokenId;
NSLog(@"%@",token);
[PFCloud callFunctionInBackground:@"hello" withParameters:@{@"token":myVal}
block:^(NSString *result, NSError *error) {
if (!error) {
NSLog(@"from Cloud Code Res: %@",result);
}
else
{
NSLog(@"from Cloud Code: %@",error);
}
}];
};
}];
}
Код Parse Cloud (main.js)
// Use Parse.Cloud.define to define as many cloud functions as you want.
// For example:
var stripe = require('stripe');
stripe.initialize('sk_test_lweGasdaqwMKnZRndg5123G');
Parse.Cloud.define("hello", function(request, response) {
var stripeToken = request.params.token;
var charge = stripe.Charges.create({
amount: 1000, // express dollars in cents
currency: 'usd',
card: stripeToken
}).then(null, function(error) {
console.log('Charging with stripe failed. Error: ' + error);
});
});
Эй, я смог продублировать вашу ошибку. В javascript измените var charge = stripe.charges.create({
в var charge = stripe.Charges.create({
Также вы можете передать токен напрямую, если хотите, вам не нужно преобразовывать его в строку.