2017-11-30 6 views
2

스트라이프를 사용하는 iOS 프로젝트를 만들고 있습니다. 나는 STPCustomerContext를 사용하고 인스턴스를 생성하기위한 매개 변수는 아래 MainAPI의 객체이다. 인스턴스를 만들면 createCustomerKey()가 자동으로 호출되지만 오류 (404)가 발생합니다. URL은 "http://localhost:1337/ephemeral_keys"이고 이것이 내가 가지고있는 것임을 믿지만 아직 404를 던지고있다. MainAPI.swift, index.js, & api.js 코드가있다.스트라이프가 임시 키를 만들 수 없습니다.

코드는 다음과 같은

MainAPI.swift

class MainAPI:NSObject, STPEphemeralKeyProvider { 

// override init(){} 

    static let shared = MainAPI() 

    var baseURLString = Constants.BASE_URL 



    // MARK: STPEphemeralKeyProvider 

    enum CustomerKeyError: Error { 
     case missingBaseURL 
     case invalidResponse 
    } 
    func createCustomerKey(withAPIVersion apiVersion: String, completion: @escaping STPJSONResponseCompletionBlock) { 

     // the request 

     func request(id: String) { 
      print("creating a eph key request with customerId: \(id)") // good 
      let url = self.baseURLString.appending("/ephemeral_keys") 

      Alamofire.request(url, method: .post, parameters: [ 
       "api_version": apiVersion, 
       "customerId": id 
       ]) 
       .validate(statusCode: 200..<300) 
       .responseJSON { responseJSON in 

        switch responseJSON.result { 
        case .success(let json): 
         print("created customer ephemeral key!") 
         completion(json as? [String: AnyObject], nil) 
        case .failure(let error): 
         print("could not customer ephemeral key!\n Error info: ") 
         print(error.localizedDescription) 
         completion(nil, error) 

        } 

      } 
     } 


     print("attempting to create customer ephemeral key . . .(createCustomerKey())") 

     let customerId = . . . // get customer id 
     request(id: costumerId) // this passes on the CORRECT customerId each time 

    } 


} 

api.js

var express = require('express') 
var router = express.Router() 

var stripe_key = process.env.STRIPE_KEY || "sk_test_myTestKey" 
var stripe = require('stripe')(stripe_key); 
var request = require("request-promise-native") 

//API 
router.get('/', function (req, res) { 
    res.status(200).send(JSON.stringify({ message: 'API Gateway', success: true, error: null })); 
}) // Just for testing, just for error-handling 

//1. Create a customer account 
router.post('/new_customer', function (req, res) { 
    console.log("Creating new customer account...") 
    var body = req.body 

    stripe.customers.create({ email: body.email, }) 
    .then((customer) => { 
     console.log(customer) 
     // Send customerId -> Save this for later use 
     res.status(200).send(JSON.stringify({ success: true, error: null, customerId: customer.id })); 
    }) 
    .catch((err) => { 
     console.log(err) 
     res.status(400).send(JSON.stringify({ success: false, error: err })) 
    }); 
}) 

//2. Save Credit Card with token 
router.post('/new_card', function (req, res) { 
    var customerId = req.body.customerId 
    var token = req.body.token 

    stripe.customers.update(customerId, { source: token }) 
    .then((customer) => { 
     console.log(customer) 
     res.status(200).send(JSON.stringify({ success: true, error: null })); 
    }) 
    .catch((err) => { 
     console.log(err) 
     res.status(400).send(JSON.stringify({ success: false, error: err })) 
    }); 

}) 

//3. Use customerId to post a charge 
router.post('/new_charge', function (req, res) { 
    var customerId = req.body.customerId 
    var amount = req.body.amount 
    var source = req.body.source 
    stripe.charges.create({ 
    amount: amount,   //in cents 
    currency: "usd", 
    customer: customerId,  //CUSTOMER_STRIPE_ACCOUNT_ID 
    source: source, // obtained with Stripe.js 
    }).then((charge) => { 
    res.status(200).send(JSON.stringify({ message: 'Sucess.', success: true, error: null })); 
    }).catch((error) =>{ 
    res.status(400).send(JSON.stringify({ message: 'Error', success: false, error: error })); 
    }) 
}) 

// here is the error I am assuming 
router.post('/ephemeral_keys', (req, res) => { 
    const stripe_version = req.body.api_version; 
    var customerId = req.body.customerId; 

    if (!stripe_version) { 
    res.status(400).end(); 
    return; 
    } 
    console.log(stripe_version) 
    // This function assumes that some previous middleware has determined the 
    // correct customerId for the session and saved it on the request object. 
    stripe.ephemeralKeys.create(
    {customer: customerId}, 
    {stripe_version: stripe_version} 
).then((key) => { 

    console.log("Ephemeral key: " + key) 
    res.status(200).json(key); 
    res.status(200).send(JSON.stringify({ message: 'AAAAhh', success: true, error: null })); 
    }).catch((err) => { 
    console.log("Ephemeral key error: " + err) 
    res.status(200).send(JSON.stringify({ message: 'ABBBBBB', success: true, error: null })); 
    res.status(500).end(); 
    }); 
}); 

module.exports = router; 

하는 index.js

//Environment Vars 
var uri = process.env.NODE_ENV || "development" 
console.log(uri + " environment") 

//Express App 
var express = require('express'); 
var app = express(); 

//Api for reading http post request body in express 
var bodyParser = require('body-parser'); 
app.use(bodyParser.urlencoded({ extended: true })); 
app.use(bodyParser.json()) 

//Log Connections 
app.use(function timeLog (req, res, next) { 
    console.log('incoming connection . . . ') 
    next() 
}) 

//API middelware 
var api = require('./api') 
app.use('/api', api) 

app.get('/', function (req, res) { 
    res.status(200).send(JSON.stringify({ message: 'Welcome!', success: true, error: null })); 
}); 

//Create Server 
var port = process.env.PORT || 1337; 
var httpServer = require('http').createServer(app); 
httpServer.listen(port, function() { 
    console.log('server running on port ' + port + '.'); 
}); 

나는 STPCustomerContext 만들

() :

let apiKeyObject = MainAPI.shared 
    customerContext = STPCustomerContext(keyProvider: apiKeyObject) 

다음 오류 인쇄는 (나중에 표시 할 STPPaymentContext을 허용하지) :

Response status code was unacceptable: 404. 

답변

0

난 당신이 어떤 원격 서버를 사용할 필요가 생각 https://www.youtube.com/watch?v=NdszUvzroxQ

에서 참조하시기 바랍니다, 대신 로컬 서버,

내 스위프트 파일에 .responseJSON 대신 .responseString을 사용하고 있습니다. success하지만 응답은 코드가 사용하는 구문이 정확하지 않을 수도 있기 때문에, 나는 당신과 같은 코드를 사용하지만 나중에 변경되었습니다 구글 로그인 완료

1

는 아래 nodejs 코드로 시도하십시오 요청의 HTML 파일입니다 구현 & 당신은 로그의 종류 아래 얻을 수 있습니다 CLI

exports.createEphemeralKeys = functions.https.onRequest((req, res) => { 
var api_version = req.body.api_version; 
var customerId = req.body.customerId; 

if (!api_version) { 
    res.status(400).end(); 
    return; 
} 

stripe.ephemeralKeys.create(
    { customer: customerId }, 
    { stripe_version: api_version }, 

    function(err, key) { 
    return res.send(key); 
    }); 
}); 

을 중포 기지에 배치했다. .swift 파일

Please Click here

를 들어

{ 
id: 'ephkey_1BramAFjruqsvjkVQGdZLiV5', 
object: 'ephemeral_key', 
associated_objects: [ { type: 'customer', id: 'cus_CEPMtLbshv7EaP' } ], 
created: 1517701830, 
expires: 1517705430, 
livemode: false, 
secret: 'ek_test_YWNjdF8xQmxUb0FGanJ1cXN2amtWLHVPcUdMN3d4UEhncW1sQkNJYmlOdzhwUGdjVUxOd1Y' 
}