iOS Parse Stripe Integration

 大学城贝岗彩虹屋屋公寓 发布于 2023-01-12 09:25

我对编程很新,我创建了一个应用程序来向客户收费,并希望存储他们的CC信息并在以后收费.我一直在阅读所有的教程和文档,我无法理解如何将其集成到我的应用程序中.我是否需要了解其他技术技能,例如Rest API,Curl,Ruby等才能进行此设置?所有指南和文档都指向了这个方向.我真的不明白GET/POST是什么以及它如何适合iOS Objective-C编程.

关于如何设置它的任何指导都将非常感激.我已经坚持了一段时间了.

1 个回答
  • Parse的条带API并不像它应该的那样完整.它本身不包含许多功能,但可以通过HTTP请求完成.我必须学习一点Javascript和HTTP请求以获得许多功能.当然,你的第一直觉应该告诉你不要在任何设备上存储CC号码!只要您有用户输入CC编号,立即获得一个令牌,然后就是您需要使用的全部内容.

    幸运的条纹使您能够节省客户,并将CC附加到客户,然后在未来再次获得CC编号时向该客户收费.Parse的api无法处理向客户添加CC,因此我自己添加了该功能.

    因此,步骤1和2使用Parse的API生成客户,并使用Parse的API再次从他们输入的CC信息生成令牌.如果您需要有关此方面的帮助,请告知我们所需的云代码.

    步骤3向客户添加CC.我正在使用自定义Customer对象,但您真正需要的主要是条形customerId,我的代码中是customer.identifier,CC中的tokenID,在我的例子中是token.tokenId.响应将是带有卡信息的JSON字符串,我将其转换为字典,然后从字典中创建STPCard.我还展示了如何从客户中删除卡.

    iOS代码:

        +(void)addToken:(STPToken *)token toCustomerId:(NSString *)customerId completionHandler:(PFIdResultBlock)block
    {
        [PFCloud callFunctionInBackground:@"stripeUpdateCustomer" withParameters:@{@"customerId":customerId,@"data":@{@"card":token.tokenId}} block:block];
    }
    
    + (void)removeCard:(STPCard *)card FromCustomer:(ELCustomer *)customer completion:(STPCardDeletionBlock)handler
    {
        if (!customer ||!customer.identifier || !card || !card.identifier || !handler) [NSException raise:@"RequiredParameter" format:@"Required Parameter Missing for deleting card from customer"];
    
        [PFCloud callFunctionInBackground:@"stripeDeleteCardFromCustomer" withParameters:@{@"cardId":card.identifier,@"customerId":customer.identifier} block:^(id object, NSError *error)
        {
                NSDictionary *dict = nil;
                NSError *jsonError = nil;
    
                if (object && [object isKindOfClass:[NSString class]] && !error) {
                    dict = [NSJSONSerialization JSONObjectWithData:[object dataUsingEncoding:NSUTF8StringEncoding] options:kNilOptions error:&jsonError];
                }
                if (!jsonError && dict) {
                    handler(dict[@"id"],[dict[@"deleted"] boolValue],error);
                }
                else if(jsonError) handler(nil,NO,jsonError);
                else handler(nil,NO,error);
        }];
    }
    

    需要云代码:

    Parse.Cloud.define("stripeUpdateCustomer", function(request, response) 
    {
            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); 
                }
            }
        );
    });
    
    Parse.Cloud.define("stripeDeleteCardFromCustomer", function(request, response) 
    {
            Stripe.initialize(STRIPE_SECRET_KEY);
            Parse.Cloud.httpRequest({
                    method:"DELETE",
                    //STRIPE_SECRET_KEY will be your stripe secrect key obviously, this is different from the public key that you will use in your iOS/Android side.
                    // STRIPE_API_BASE_URL = 'api.stripe.com/v1'
                    url: "https://" + STRIPE_SECRET_KEY + ':@' + STRIPE_API_BASE_URL + "/customers/" + request.params.customerId + "/cards/" + request.params.cardId,
                    success: function(httpResponse) {
                    response.success(httpResponse.text);
                    },
                    error: function(httpResponse) {
                    response.error('Request failed with response code ' + httpResponse.status);
                    }
            });
    });
    

    用于向客户或令牌收取费用的iOS代码通知字典中所需的参数是以美分而非美元,货币,然后是客户或tokenId的金额.请注意,客户可以拥有多张信用卡,但其中一张是活动信用卡.有效卡是在向客户收费时将收取的卡:

    //Will attempt to charge customer, if no customer exists, or it fails to charge the custoemr it will attempt to charge a card token directly;
    //*********Warning: This is the final step it will APPLY A CHARGE TO THE ACCOUNT.***************
    
    -(void)processChargeThroughStripeWithCompletionHandler:(STPChargeCompletionHandler)handler
    {
        if (![self validForCardProcessing] && ![self validForCustomerProcessing]) {
            handler(nil,[NSError errorWithDomain:MY_ERROR_DOMAIN code:elErrorCodeNoCustomerOrTokenID userInfo:[NSDictionary dictionary]]);
            return;
        }
        [self processChargeThroughStripeUsingCustomerWithCompletionHandler:^(STPCharge *charge, NSError *error)
        {
            if (!error) handler(charge,error);
            else{
                [self processChargeThroughStripeUsingCardWithCompletionHandler:^(STPCharge *charge, NSError *error) {
                    handler(charge, error);
                }];
            }
        }];
    }
    
    //Process payment using a customer to their active card. No token is required if customer exists with a card on record.
    //*********Warning: This is the final step it will APPLY A CHARGE TO THE ACCOUNT.***************
    
    -(void)processChargeThroughStripeUsingCustomerWithCompletionHandler:(STPChargeCompletionHandler)handler
    {
        if (!self.validForCustomerProcessing)
        {
            handler(self,[NSError errorWithDomain:MY_ERROR_DOMAIN code:elErrorCodeNoCustomerID userInfo:[NSDictionary dictionary]]);
            return;
        }
        [PFCloud callFunctionInBackground:@"chargeToken" withParameters:[STPCharge dictionaryFromSTPChargeForProccessingUsingCustomer:self] block:^(id object, NSError *error)
        {
            if (!error)
            {
                [self initSelfWithDictionary:object];
                NSLog(@"object:%@",object);
            }
            handler(self,error);
        }];
    }
    
    //Process payment using a token that is attached to the charge, when complete self will be updated with the new charge information
    //*********Warning: This is the final step it will APPLY A CHARGE TO THE ACCOUNT.***************
    
    -(void)processChargeThroughStripeUsingCardWithCompletionHandler:(STPChargeCompletionHandler)handler
    {
        if (!self.validForCardProcessing)
        {
            handler(self,[NSError errorWithDomain:MY_ERROR_DOMAIN code:elErrorCodeNoTokenID userInfo:[NSDictionary dictionary]]);
            return;
        }
        [PFCloud callFunctionInBackground:@"chargeToken" withParameters:[STPCharge dictionaryFromSTPChargeForProccessingUsingCard:self] block:^(id object, NSError *error)
         {
             if (!error)
             {
                 [self initSelfWithDictionary:object];
             }
             handler(self,error);
         }];
    }
    + (NSDictionary *)dictionaryFromSTPChargeForProccessingUsingCard:(STPCharge *)charge
    {
        NSMutableDictionary *dictionary = [NSMutableDictionary dictionary];
        dictionary[@"amount"] = charge.amountInCents;
        dictionary[@"currency"] = charge.currency;
        dictionary[@"card"] = charge.token.tokenId;
        return dictionary;
    }
    + (NSDictionary *)dictionaryFromSTPChargeForProccessingUsingCustomer:(STPCharge *)charge
    {
        NSMutableDictionary *dictionary = [NSMutableDictionary dictionary];
        dictionary[@"amount"] = charge.amountInCents;
        dictionary[@"currency"] = charge.currency;
        dictionary[@"customer"] = charge.customer.identifier;
        return dictionary;
    }
    

    用于向客户/令牌收费的云代码:

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

    2023-01-12 09:28 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有