简体   繁体   English

使用Stripe + Parse和云代码存储信用卡

[英]Store credit card using Stripe + Parse with cloud code

I am attempting to store a users credit card into stripe. 我正在尝试将用户的信用卡存储到条带中。 Once the token is made, I attempt to save the token with the user to Stripe as a customer. 制作完令牌后,我尝试将用户的令牌保存到Stripe作为客户。 But I didnt find any answer to my problem, I just need to store a card to a user that already exist. 但是我没有找到问题的答案,我只需要将卡存储到已经存在的用户即可。

I tried to use the method Stripe.Customers.update but it store the new card removing the "default" card if the user had one. 我尝试使用方法Stripe.Customers.update,但是它存储新卡,如果用户有,则删除“默认”卡。 And using the method Stripe.Customers.create it create a new customer with the new card, but I need to store in specific user. 并使用Stripe.Customers.create方法使用新卡创建新客户,但我需要存储在特定用户中。

Cloud Code: 云代码:

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 Code: 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)")
        }
    }

I have tried several parameters to store the card as I need, but I always got error 'Received unknown parameters' 我尝试了几种参数来按需存储卡,但是总是收到错误消息“收到未知参数”

Anyone got any ideas how to store a card without removing or creating new customer? 任何人都知道如何在不删除或创建新客户的情况下存储卡?

Parse's stripe implementation is not as complete as it could be. 解析的带区实现不尽如人意。 In many cases you must use an HTTPRequest to perform stripe functions that Parse does not offer. 在许多情况下,您必须使用HTTPRequest来执行Parse不提供的条带功能。

For those cases I use the following iOS method and CloudCode to execute all of my stripe HTTPRequests. 对于这些情况,我使用以下iOS方法和CloudCode执行我所有的带区HTTPRequest。 It is very easy to code while following the stripe CURL API documentation. 遵循条纹CURL API文档时,编码非常容易。 I then build off this method to perform most stripe tasks, IE create/update/delete customers, cards, charges etc. 然后,我构建此方法来执行大多数条带化任务,例如IE创建/更新/删除客户,卡,费用等。

I start by feeding it a Method, ie GET, POST, DELETE depending on whether you want to retrieve, create/update, or remove a stripe object. 首先,根据要获取,创建/更新或删除条带对象,为它提供一个方法,即GET,POST,DELETE。

I then feed it a combination of optional pre/suf/postfixes to create a url. 然后,我将可选的pre / suf / postfix组合提供给它,以创建一个url。

Example URL created: 创建的示例URL:

在此处输入图片说明

Finally I give it the parameters, in the instance of creating a card and adding it to a customer this would only need to be a dictionary containing the tokenID. 最后,在创建卡并将其添加到客户的情况下,我给它提供参数,这只需要是一个包含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);
    }];
}

The cloud code that is executed: 执行的云代码:

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);
            }
    });
});

Using the method above I can create individual methods to perform most of the stripe tasks I need. 使用上面的方法,我可以创建单独的方法来执行我需要的大多数条纹任务。

Here is an example that will create a new card and attach it to a customer Stripe Card creation API 这是一个示例,它将创建一个新卡并将其附加到客户的Stripe Card创建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);
                             }];
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM