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

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

解决方法

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,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",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",response)
{
    Stripe.initialize(STRIPE_SECRET_KEY);
    Stripe.Charges.create
    (
        request.params,{
            success:function(results)
            {
                response.success(results);
            },error:function(error)
            {
                response.error("Error:" +error); 
            }
        }
    );
});

iOS Parse Stripe Integration的更多相关文章

  1. 关于h5中的fetch方法解读(小结)

    这篇文章主要介绍了关于h5中的fetch方法解读(小结),fetch身为H5中的一个新对象,他的诞生,是为了取代ajax的存在而出现,有兴趣的可以了解一下

  2. ios – 使用NSURLSession获取JSON数据

    我试图从谷歌距离api使用NSURLSession获取数据,但如下所示,当我打印响应和数据时,我得到的结果为NULL.可能是什么问题?

  3. ios – 我可以使用Apple Pay创建Stripe令牌而无需向用户收费吗?

    我正在制作一个应用程序,我需要在某个时刻收集用户信用卡信息,以便我可以在以后收费.现在我使用stripe和他们的PTKView来收集信用卡信息并存储它.然后,当用户想付款时,我已经准备好了,他们不需要做任何其他事情.我想为用户添加一个选项,以便从ApplePay导入一张我以后可以使用的卡.但是,在我看来,当使用ApplePay时,我必须立即向用户收费.我很好奇是否有人知道这个问题的解决方案,或者我

  4. ios – 错误域= com.alamofire.error.serialization.response代码= -1011“请求失败:禁止

    任何人都可以帮我解决以下错误–>在AFNetworking2.5中使用“删除”方法时出错解决方法我发现,如果我的手机时钟不同步……它不允许我更新…也许检查你的手机设置到正确的时间“自动区”,看看是否有效…

  5. iOS网页/原生应用Facebook登录弹出 – 失败?

    如果我重新启动app/web-app,用户将自动登录,并重定向到成功页面.我认为是导致问题的原因当您在Firefox/Chrome/Safari浏览器中运行网页时,Facebook登录对话框会弹出一个弹出窗口或另一个选项卡.我相信这是这个弹出页面的一个问题,以及当成功登录时Javascript如何与自身通信.window.close的东西没有返回的根页面…失败的解决方法由于应用程序挂在前面提到的URL上,我决定在shouldStartLoadWithRequest(…)中添加if语句以强制UIWebvie

  6. ios – 来自UIAlertController的self.navigationController?.popViewControllerAnimated

    我是新手,但我想我已经掌握了它.这让我的进步很难过.我想要做的是当我们无法找到他的查询的相关数据时向用户抛出错误消息,然后继续将他带回到之前的ViewController.但是,我在这方面遇到了麻烦.在我添加操作的行上,我收到以下错误:’UIViewController?’不是Void的子类型我该怎么做呢?

  7. ios – Watchkit新会话不起作用

    我的手表扩展中有两个视图控制器.每当我打电话时我只得到第一个视图控制器的响应,并在第二个viewcontroller中得到错误WCSession在app和watch扩展中启动.任何建议?

  8. 使用Firebase iOS Swift将特定设备的通知推送到特定设备

    我非常感谢PushNotifications的帮助.我的应用聊天,用户可以直接向对方发送短信.但是如果没有PushNotifications,它就没有多大意义.它全部设置在Firebase上.如何将推送通知从特定设备发送到特定设备?

  9. ios – 保存从查询中获取的用户的属性(即不在currentUser上)

    我有兴趣根据currentUser执行的操作将属性保存到数据库中的用户.基于以下代码,我收到错误消息“除非已通过logIn或signUp验证用户,否则无法保存用户”我想知道是否有一个解决方法,我可以将属性保存到foundUser,而无需登录该用户.谢谢你的帮助!解决方法如果要更新当前不是登录用户的用户,则需要使用主密钥调用Parse.您可以从CloudCode执行此操作;并从您的iOS项目中调用它;

  10. 在iOS中使用NSJSONSerialization进行JSON解析

    解决方法首先在您的JSON响应字典中,在“RESPONSE”键下,您有一个数组而不是字典,该数组包含字典对象.所以要提取用户名和电子邮件ID,如下所示

随机推荐

  1. iOS实现拖拽View跟随手指浮动效果

    这篇文章主要为大家详细介绍了iOS实现拖拽View跟随手指浮动,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  2. iOS – genstrings:无法连接到输出目录en.lproj

    使用我桌面上的项目文件夹,我启动终端输入:cd然后将我的项目文件夹拖到终端,它给了我路径.然后我将这行代码粘贴到终端中找.-name*.m|xargsgenstrings-oen.lproj我在终端中收到此错误消息:genstrings:无法连接到输出目录en.lproj它多次打印这行,然后说我的项目是一个目录的路径?没有.strings文件.对我做错了什么的想法?

  3. iOS 7 UIButtonBarItem图像没有色调

    如何确保按钮图标采用全局色调?解决方法只是想将其转换为根注释,以便为“回答”复选标记提供更好的上下文,并提供更好的格式.我能想出这个!

  4. ios – 在自定义相机层的AVFoundation中自动对焦和自动曝光

    为AVFoundation定制图层相机创建精确的自动对焦和曝光的最佳方法是什么?

  5. ios – Xcode找不到Alamofire,错误:没有这样的模块’Alamofire’

    我正在尝试按照github(https://github.com/Alamofire/Alamofire#cocoapods)指令将Alamofire包含在我的Swift项目中.我创建了一个新项目,导航到项目目录并运行此命令sudogeminstallcocoapods.然后我面临以下错误:搜索后我设法通过运行此命令安装cocoapodssudogeminstall-n/usr/local/bin

  6. ios – 在没有iPhone6s或更新的情况下测试ARKit

    我在决定下载Xcode9之前.我想玩新的框架–ARKit.我知道要用ARKit运行app我需要一个带有A9芯片或更新版本的设备.不幸的是我有一个较旧的.我的问题是已经下载了新Xcode的人.在我的情况下有可能运行ARKit应用程序吗?那个或其他任何模拟器?任何想法或我将不得不购买新设备?解决方法任何iOS11设备都可以使用ARKit,但是具有高质量AR体验的全球跟踪功能需要使用A9或更高版本处理器的设备.使用iOS11测试版更新您的设备是必要的.

  7. 将iOS应用移植到Android

    我们制作了一个具有2000个目标c类的退出大型iOS应用程序.我想知道有一个最佳实践指南将其移植到Android?此外,由于我们的应用程序大量使用UINavigation和UIView控制器,我想知道在Android上有类似的模型和实现.谢谢到目前为止,guenter解决方法老实说,我认为你正在计划的只是制作难以维护的糟糕代码.我意识到这听起来像很多工作,但从长远来看它会更容易,我只是将应用程序的概念“移植”到android并从头开始编写.

  8. ios – 在Swift中覆盖Objective C类方法

    我是Swift的初学者,我正在尝试在Swift项目中使用JSONModel.我想从JSONModel覆盖方法keyMapper,但我没有找到如何覆盖模型类中的Objective-C类方法.该方法的签名是:我怎样才能做到这一点?解决方法您可以像覆盖实例方法一样执行此操作,但使用class关键字除外:

  9. ios – 在WKWebView中获取链接URL

    我想在WKWebView中获取tapped链接的url.链接采用自定义格式,可触发应用中的某些操作.例如HTTP://我的网站/帮助#深层链接对讲.我这样使用KVO:这在第一次点击链接时效果很好.但是,如果我连续两次点击相同的链接,它将不报告链接点击.是否有解决方法来解决这个问题,以便我可以检测每个点击并获取链接?任何关于这个的指针都会很棒!解决方法像这样更改addobserver在observeValue函数中,您可以获得两个值

  10. ios – 在Swift的UIView中找到UILabel

    我正在尝试在我的UIViewControllers的超级视图中找到我的UILabels.这是我的代码:这是在Objective-C中推荐的方式,但是在Swift中我只得到UIViews和CALayer.我肯定在提供给这个方法的视图中有UILabel.我错过了什么?我的UIViewController中的调用:解决方法使用函数式编程概念可以更轻松地实现这一目标.

返回
顶部