2016-02-28 43 views
2

我試圖設置一個相對簡單的Braintree服務器上運行node.js與我的客戶端寫在Swift 2.1 iOS 9,雖然我能登錄客戶端令牌,我發現了以下錯誤:Braintree node.js瓦特/ iOS 9 Swift 2.1 - 客戶端令牌錯誤

[BraintreeSDK] ERROR Unsupported client token version. Please ensure your server is generating a valid Braintree ClientToken with a server-side SDK that is compatible with this version of Braintree iOS.

下面是我的服務器代碼(這是改編自BraintreeDev庫):

'use strict'; 

var express = require('express'); 
var app = express(); 

var braintree = require('braintree'); 

var bodyParser = require('body-parser'); 
var parseUrlEnconded = bodyParser.urlencoded({ 
    extended: false 
}); 

var gateway = braintree.connect({ 
    environment: braintree.Environment.Sandbox, 
    merchantId: 'xxxxxxxxxxxxx', 
    publicKey: 'xxxxxxxxxxxxxxx', 
    privateKey: 'xxxxxxxxxxxxxxxxxxxxxxx' 
}); 

app.use(express.static('public')); 

app.set('views', __dirname + '/views'); 
app.set('view engine', 'ejs'); 

// Creates a new token and returns it in the response. 
app.get('/token', function (req, res) { 
    gateway.clientToken.generate({}, function (error, response) { 
    res.json(response); 
    }); 
}); 

app.post('/payment', function (req, res) { 
    var sale = { 
    amount: "10", 
    payment_method_nonce: req.param('payment_method_nonce') 
    }; 

    gateway.transaction.sale(sale, function (error, response) { 
    if (!error && response.success) { 
     res.json(response); 
    } else { 
     // do something else 
    } 
    }); 
}); 


app.listen(process.env.PORT || 5000) 

module.exports = app; 

這裏是我的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包。

回答

1

完全披露:我在布倫特裏工作。如果您還有其他問題,請隨時聯繫我們的support團隊。

看起來您正在序列化來自gateway.clientToken.generate的整個響應並將其傳遞給BTAPIClient。您應該從響應對象中刪除clientToken,並且只將clientToken字符串值傳遞給BTAPIClient

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

有關更多信息,請參閱clientToken.generate文檔。

+0

不幸的是,我現在得到以下錯誤:'[BraintreeSDK]錯誤無效的客戶端令牌。請確保你的服務器正在生成一個有效的Braintree ClientToken。' – damianesteban

+0

而且這個錯誤:'錯誤BTClient無法初始化,因爲提供的clientToken無效' – damianesteban

+0

請聯繫我們的[support team](https://support.braintreepayments。 com /)更多幫助解決您的問題。 – pblesi

0

上面的答案解決了我與服務器端代碼的問題。不過,我仍然得到一個錯誤的iPhone應用程序:

ERROR BTClient could not initialize because the provided clientToken was invalid

我現在用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) 
      } 
    } 
} 

更新:你可以看到我的NOTE評論說,問題是我的服務器正在用引號返回令牌(我還沒弄明白爲什麼),所以我不得不從令牌中「去除它們」。現在一切正常。

相關問題