与Parse Cloud Code通信的Swift / Stripe错误

时间:2015-06-06 04:44:15

标签: swift parse-platform stripe-payments cloud-code

我已经工作了好几天,试图弄清楚如何使用Swift将卡片收费并使用Stripe将卡片保存给客户,并将Parse.com Cloud Code作为后端。我成功地将Stripe pod与我的项目集成,并且我创建了一个令牌,并在控制台中打印出来以验证其存在。但我不能用它做任何事情!我到处寻找答案,无法弄清楚为什么我会一直收到错误。我认为这与我试图提供给Cloud Code的参数有关,但我不确定。我已阅读Cloud Code和Stripe的文档,但无济于事。这是我的PaymentViewController.swift:

list::insert

我添加了“Hello World”示例,以查看Cloud Code是否设置正确,以及callFunction是否正常工作。我的Cloud Code是:

import UIKit
import Stripe
import PaymentKit
import Parse
import Bolts




class PaymentViewController: UIViewController, PTKViewDelegate {


@IBOutlet weak var saveBtn: UIButton!

var paymentView: PTKView = PTKView()

override func viewDidLoad() {
    super.viewDidLoad()



    var view : PTKView = PTKView(frame: CGRectMake(15,20,290,55))

    paymentView = view
    paymentView.delegate = self;
    self.view.addSubview(self.paymentView)

    saveBtn.enabled = false



}

func paymentView(view: PTKView!, withCard card: PTKCard!, isValid valid: Bool) {
    if (valid) {
        saveBtn.enabled = true
    } else {
        saveBtn.enabled = false
    }
}



override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}





@IBAction func save(sender: AnyObject) {

    var card: STPCard = STPCard()
    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: { (tokenId: STPToken?, error: NSError?) -> Void in
        if (error != nil) {
            println(error)
            println("what the..")
        } else {
            println(tokenId)


            PFCloud.callFunctionInBackground("hello", withParameters: nil) {
                (response: AnyObject?, error: NSError?) -> Void in
                let responseString = response as? String
                println(responseString)
            }




            PFCloud.callFunctionInBackground("createCharge", withParameters: nil, block: { (success: AnyObject?, error: NSError?) -> Void in
                if error != nil {
                    println("error")
                }
            })








        }
    })



}







@IBAction func cancel(sender: AnyObject) {
    self.dismissViewControllerAnimated(true, completion: nil)
}






}

真正感谢任何帮助!我一直在不知疲倦地努力解决这个问题!控制台打印出来

var Stripe = require('stripe');
Stripe.initialize('My_Secret_Key');

Parse.Cloud.define("hello", function(request, response) {
               response.success("Hello world!");
               });

Parse.Cloud.define("createCharge", function(request, response) {
               Stripe.Charges.create({
                                     amount: 100 * 10, // $10 expressed in cents
                                     currency: "usd",
                                     card: "tok_3TnIVhEv9P24T0"
                                     },{
                                     success: function(httpResponse) {
                                     response.success("Purchase made!");
                                     },
                                     error: function(httpResponse) {
                                     response.error("Uh oh, something went wrong");
                                     }
                                     });


               });

2 个答案:

答案 0 :(得分:0)

您看到的错误Uh oh, something went wrong (Code: 141, Version: 1.7.2)表示您的createCharge Parse函数返回了错误。您可能需要记录httpResponse的值以从Stripe中找到确切的错误。

查看代码最有可能出现错误:Invalid Request Error: Cannot use token tok_3TnIVhEv9P24T0 more than once。您可以在Stripe Dashboard的Logs部分确认这一点。

我看到您打印令牌println(tokenId),您还想要将其发送到您的Parse功能并将卡设置为您刚刚创建的令牌的值。

答案 1 :(得分:0)

class PaymentViewController: UIViewController, PTKViewDelegate {


@IBOutlet weak var saveBtn: UIButton!

var paymentView: PTKView = PTKView()

override func viewDidLoad() {
    super.viewDidLoad()



    var view : PTKView = PTKView(frame: CGRectMake(15,20,290,55))

    paymentView = view
    paymentView.delegate = self;
    self.view.addSubview(self.paymentView)

    saveBtn.enabled = false



}

func paymentView(view: PTKView!, withCard card: PTKCard!, isValid valid: Bool) {
    if (valid) {
        saveBtn.enabled = true
    } else {
        saveBtn.enabled = false
    }
}



override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}





@IBAction func save(sender: AnyObject) {

    var card: STPCard = STPCard()
    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: { (token: STPToken?, error: NSError?) -> Void in
        if (error != nil) {
            println(error)
            println("not working")
        } else {
            //println(tokenId)
            var coin = token!.tokenId


            PFCloud.callFunctionInBackground("hello", withParameters: nil) {
                (response: AnyObject?, error: NSError?) -> Void in
                let responseString = response as? String
                println(responseString)
            }

            var name = PFUser.currentUser()?.username as String!
            var customer = PFUser.currentUser()?.objectId as String!


            PFCloud.callFunctionInBackground("createCustomer", withParameters: ["coin" : coin, "name": name, "customer": customer], block: { (success: AnyObject?, error: NSError?) -> Void in
                if error != nil {
                    println("create customer not working")
                }




            })

            var customerId = customer!

            PFCloud.callFunctionInBackground("createCharge", withParameters: ["customerId" : customerId], block: { (success: AnyObject?, error: NSError?) -> Void in
                if error != nil {
                    println("not working")
                }
            })








        }
    })



}



@IBAction func cancel(sender: AnyObject) {
    self.dismissViewControllerAnimated(true, completion: nil)
}

}

我的更新云代码在这里:

var Stripe = require('stripe');
Stripe.initialize('sk_test_xxxxxxxxxxxxxx');

Parse.Cloud.define("hello", function(request, response) {
               response.success("Hello world!");
               });



Parse.Cloud.define("createCustomer", function(request, response) {
                                  Stripe.Customers.create({
                                                         card:     request.params.coin,
                                                          account_balance: -10*100,
                                                          metadata: {
                                                          name: request.params.name,
                                                          customer: request.params.customer, // e.g PFUser object ID
                                                          }

                                                         }, {
                                                         success: function(customer) {
                                                         response.success(customer.id);
                                                         },
                                                         error: function(error) {
                                                         response.error("Error:" +error);
                                                         }
                                                         })
                                  });

Parse.Cloud.define("createCharge", function(request, response) {
               Stripe.Charges.create({
                                     amount: 100 * 10, // $10 expressed in cents
                                     currency: "usd",
                                     //card: request.params.coin
                                     customer: request.params.customerId
                                     },{
                                     success: function(httpResponse) {
                                     response.success("Purchase made!");
                                     },
                                     error: function(httpResponse) {
                                     response.error(httpResponse)
                                     response.error("Uh oh, something went wrong");
                                     }
                                     });


               });

最终我希望将创建客户放在另一个viewController.swift文件中并在应用程序的另一部分收费,但是现在我正在使用它们在同一个PaymentViewController.swift文件中对它进行测试