2015-05-20 2 views
0

Я пытаюсь сохранить кредитную карту пользователей в полоску. После того, как маркер сделан, я пытаюсь сохранить маркер с пользователем на Stripe в качестве клиента. Но я не нашел ответа на свою проблему, мне просто нужно сохранить карту для пользователя, который уже существует.Храните кредитную карту, используя Stripe + Parse with cloud code

Я попытался использовать метод Stripe.Customers.update, но он сохранил новую карту, удалив «карточку по умолчанию», если у нее ее была. И используя метод Stripe.Customers.create, создайте нового клиента с новой картой, но мне нужно сохранить его у конкретного пользователя.

Облако Код:

Parse.Cloud.define("stripeCreateCard", function(request,response) 
{ 
    Stripe.initialize(STRIPE_SECRET_KEY); 
    Stripe.Customers.create 
    (
     request.params, 
     { 
      success:function(results) 
      { 
       response.success(results); 
      }, 
      error:function(error) 
      { 
       response.error("Error:" +error); 
      } 
     } 
    ); 
}); 

Parse.Cloud.define("stripeUpdateCustomer", function(request, response) 
{ 
    Stripe.initialize(STRIPE_SECRET_KEY); 
    Stripe.Customers.update 
    (
     request.params["customerId"], 
     request.params["data"], 
     { 
      success:function(results) 
      { 
       console.log(results["id"]); 
       response.success(results); 
      }, 
      error:function(error) 
      { 
       response.error("Error:" +error); 
      } 
     } 
    ); 
}); 

IOS Код:

class func getParamsForAddingCardToCustomer(custormerId: String, cardToken: String) -> NSDictionary { 
     let params = NSMutableDictionary() 

     params.setObject(["card" : cardToken], forKey: "data") 
     params.setObject(custormerId, forKey: "customerId") 

     return params 
} 

var params = ParamsHelper.getParamsForAddingCardToCustomer(stripeId, cardToken: token) 

PFCloud.callFunctionInBackground("stripeCreateCard", withParameters: params as [NSObject : AnyObject]) { 
     (response: AnyObject?, error: NSError?) -> Void in 
     let responseString = response as? String 

     if (error === nil) { 
      println("Response: \(responseString) ") 
     } 
     else if (error != nil) { 
      println("Error: \(error) \(error!.userInfo)") 
     } 
    } 

Я попробовал несколько параметров, чтобы сохранить карту, как мне нужно, но у меня всегда ошибка 'Received неизвестные параметры'

У кого-нибудь есть идеи, как хранить карту без удаления или создания нового клиента?

+0

Глядя на документации Stripe в этом намерении при обновлении поля карты. Или они называют это источником сейчас. Полоса Parse Api не является полной для всех возможностей полосы. Я добавлю ответ утром для обхода, использующего http-запрос. – hybrdthry911

ответ

2

Реализация полос Парса не такая полная, как могла бы быть. Во многих случаях вы должны использовать HTTPRequest для выполнения функций stripe, которые Parse не предлагает.

Для этих случаев я использую следующий метод iOS и CloudCode для выполнения всех моих запросов HTTPRequests. Его очень легко закодировать, следуя за документацией CURL API. Затем я отлаживаю этот метод для выполнения большинства задач stripe, IE создает/обновляет/удаляет клиентов, карты, сборы и т. Д.

Я начинаю с подачи метода, т.е. GET, POST, DELETE в зависимости от того, хотите ли вы получить , создать/обновить или удалить объект stripe.

Затем я передаю ему комбинацию необязательных pre/suf/postfixes для создания URL-адреса.

Пример URL создан:

enter image description here

Наконец я даю ему параметры, в случае создания карты и добавить его к клиенту это нужно будет только быть словарем, содержащий tokenID.

+(void)executeStripeCloudCodeWithMethod:(NSString *)method 
           prefix:(NSString *)prefix 
           suffix:(NSString *)suffix 
           postfix:(NSString *)postfix 
          secondPostfix:(NSString *)secondPostfix 
          parameters:(NSDictionary *)params 
         completionHandler:(ELStripeCompletionBlock)handler 
{ 
    NSDictionary *parameters = @{@"method":method, 
           @"prefix":prefix?prefix:@"", 
           @"suffix":suffix?suffix:@"", 
           @"postfix":postfix?postfix:@"", 
           @"secondPostfix":secondPostfix?secondPostfix:@"", 
           @"params":params?params:[NSNull null] 
           }; 

    [PFCloud callFunctionInBackground:@"stripeHTTPRequest" 
         withParameters:parameters 
           block:^(id object, NSError *error) { 
     id jsonObject; 
     if (!error) { 
      NSError *jsonError = nil; 
      //Turn the json string into an NSDictionary 
      jsonObject = [NSJSONSerialization JSONObjectWithData:[object dataUsingEncoding:NSUTF8StringEncoding] 
                 options:kNilOptions error:&jsonError]; 

     } 
     handler(jsonObject,error); 
    }]; 
} 

код облако, которое выполняется:

var STRIPE_SECRET_KEY = 'sk_test_your_test_code_here'; 
var STRIPE_API_BASE_URL = 'api.stripe.com/v1/' 
Parse.Cloud.define("stripeHTTPRequest", function(request, response) 
{ 
    //Check for valid pre/suf/postfixes, if they are not there do not include them. 
    var prefix = request.params["prefix"]; 
    var suffix = ""; 
    var postfix = ""; 
    var secondPostfix = ""; 
    if (!isEmpty(request.params["suffix"])) suffix = '/'+request.params['suffix']; 
    if (!isEmpty(request.params["postfix"])) postfix = '/'+request.params['postfix']; 
    if (!isEmpty(request.params["secondPostfix"])) secondPostfix = '/'+request.params['secondPostfix']; 

    Parse.Cloud.httpRequest(
    { 
      method: request.params["method"], 
      //Create URL from base url and pre/suf/postfixes 
      url: 'https://'+STRIPE_API_BASE_URL + prefix + suffix + postfix + secondPostfix, 
      headers: { 
       'Authorization': "Bearer " + STRIPE_SECRET_KEY 
      }, 
      params:request.params["params"], 
      success: function(httpResponse) 
      { 
       //response text is a json dictionary 
       response.success(httpResponse.text); 
      }, 
      error: function(httpResponse) 
      { 
       response.error(httpResponse.text); 
      } 
    }); 
}); 

Используя описанный выше метод можно создать отдельные методы для выполнения большинства задач полосковых мне нужно.

Вот пример, который будет создавать новую карту и прикрепить его к клиенту Stripe Card creation API

+ (void)createCardFromToken:(NSString *)tokenId customerId:(NSString *)customerId completionHandler:(ELCardCompletionBlock)handler 
{ 

    [ELStripe executeStripeCloudCodeWithMethod:@"POST" //I use post here because we are creating a card. POST would also be used for updating a customer/card or refunding a charge for example 
             prefix:@"customers" //If you look at the documentation and the example URL I use "customers" here as the prefix 
             suffix:customerId //The customerID is the suffix, this will be the customer you are going to add the card to 
             postfix:@"cards" //I believe this is "sources" now 
           secondPostfix:nil //Not needed for this URL 
            parameters:@{ 
               @"card":tokenId //Only parameter is a tokenId, and I wrap this inside an NSDictionary 
               } 
          completionHandler:^(id jsonObject, NSError *error) { 
           if (error) 
           { 
            //Handle the error code here 

            handler(nil,rejectError); 
            return; 
           } 
           //If no error stripe returns a dictionary containing the card information. You can use this information to create a card object if so desired. 
           handler([ELCard cardFromDictionary:jsonObject],error); 
          }]; 
} 
Смежные вопросы