Braintree node.js w/iOS 9 Swift 2.1-客户端令牌错误

Braintree node.js w/iOS 9 Swift 2.1-客户端令牌错误,ios,node.js,swift,paypal,braintree,Ios,Node.js,Swift,Paypal,Braintree,我正试图在node.js上安装一个相对简单的Braintree服务器,我的客户端是用Swift 2.1为iOS 9编写的,虽然我能够记录客户端令牌,但我得到了以下错误: [BraintreeSDK]错误不支持客户端令牌版本。请确保您的服务器正在使用与此版本的Braintree iOS兼容的服务器端SDK生成有效的Braintree ClientToken。 下面是我的服务器代码(改编自BraintreeDev存储库): 这是我的iOS代码: class BaseViewController: U

我正试图在node.js上安装一个相对简单的Braintree服务器,我的客户端是用Swift 2.1为iOS 9编写的,虽然我能够记录客户端令牌,但我得到了以下错误:

[BraintreeSDK]错误不支持客户端令牌版本。请确保您的服务器正在使用与此版本的Braintree iOS兼容的服务器端SDK生成有效的Braintree ClientToken。

下面是我的服务器代码(改编自BraintreeDev存储库):

这是我的iOS代码:

class BaseViewController: UIViewController {

    var braintreeClient: BTAPIClient?

    override func viewDidLoad() {
        super.viewDidLoad()

        let clientTokenURL = NSURL(string: "https://my-heroku-app.herokuapp.com/token")!
        let clientTokenRequest = NSMutableURLRequest(URL: clientTokenURL)
        clientTokenRequest.setValue("text/plain", forHTTPHeaderField: "Accept")

        NSURLSession.sharedSession().dataTaskWithRequest(clientTokenRequest) { (data, response, error) -> Void in
            guard let data = data else {
                return
            }

            let clientToken = String(data: data, encoding: NSUTF8StringEncoding)
            print("Client Token: \(clientToken)")
            self.braintreeClient = BTAPIClient(authorization: clientToken!)
            print(response?.description)

        }.resume()
    }
...
这似乎是一个非常直截了当的问题,我很难理解为什么会出现这个错误

编辑:我正在使用最新版本的Braintree SDK for iOS和最新版本的Braintree node.js包。

完整披露:我在Braintree工作。如果您有任何进一步的问题,请随时与我们的团队联系

您似乎正在序列化来自
gateway.clientToken.generate
的整个响应,并将其传递给
BTAPIClient
。您应该从响应对象中删除
clientToken
,并且只将clientToken字符串值传递给
BTAPIClient

app.get('/token', function (req, res) {
  gateway.clientToken.generate({}, function (error, response) {
    res.json(response.clientToken);
  });
});

有关更多信息,请参阅文档。

上面的答案解决了我的服务器端代码问题。但是,我仍然在iOS应用程序中遇到一个错误:

错误BTClient无法初始化,因为提供的clientToken无效

我现在正在使用Alamofire,我的功能如下:

associatedType ClientTokenResult = (clientToken: String?) -> ()

func fetchToken(completion: ClientTokenResult) {
    let parameters = [String: AnyObject]()
    Alamofire.request(Router.Get("api/token", parameters))
        .validate()
        .response { (request, response, data, error) -> Void in
            guard let data = data else {
                return
            }

            if let error = error {
                print("Error: \(error.localizedDescription)")
                completion(clientToken: nil)
            } else {
                let clientToken = String(data: data, encoding: NSUTF8StringEncoding)!

                // NOTE: This shouldn't be necessary, but as of right now the server is returning the token
                // with quotation marks.
                let strippedClientToken = clientToken.stringByReplacingOccurrencesOfString("\"",
                    withString: "")

                print("Client Token: \(strippedClientToken)")
                print(response?.debugDescription)

                completion(clientToken: strippedClientToken)
            }
    }
}

更新:您可以在我的
注释中看到,问题是我的服务器返回带有引号的令牌(我还没有弄清楚原因),因此我不得不从令牌中“删除它们”。现在一切正常。

不幸的是,我现在收到以下错误:
[BraintreeSDK]错误无效的客户端令牌。请确保您的服务器正在生成有效的Braintree ClientToken。
以及此错误:
错误BTClient无法初始化,因为提供的ClientToken无效。
请联系我们,以获取解决问题的更多帮助。
associatedType ClientTokenResult = (clientToken: String?) -> ()

func fetchToken(completion: ClientTokenResult) {
    let parameters = [String: AnyObject]()
    Alamofire.request(Router.Get("api/token", parameters))
        .validate()
        .response { (request, response, data, error) -> Void in
            guard let data = data else {
                return
            }

            if let error = error {
                print("Error: \(error.localizedDescription)")
                completion(clientToken: nil)
            } else {
                let clientToken = String(data: data, encoding: NSUTF8StringEncoding)!

                // NOTE: This shouldn't be necessary, but as of right now the server is returning the token
                // with quotation marks.
                let strippedClientToken = clientToken.stringByReplacingOccurrencesOfString("\"",
                    withString: "")

                print("Client Token: \(strippedClientToken)")
                print(response?.debugDescription)

                completion(clientToken: strippedClientToken)
            }
    }
}