Nano Hash - криптовалюты, майнинг, программирование

приложение создает клиентов Stripe, но не может получить эфемерный ключ из-за отсутствия такого клиента

Из моего приложения для iOS я вызываю Firebase, чтобы 1) создать клиента Stripe (и это работает, я получаю действительный идентификатор клиента) и 2) получить эфемерный ключ.

Вторая часть, где что-то терпит неудачу. Ошибка, которую я возвращаю, выглядит так:

message = "No such customer: \"cus_CFRA95y1cKuNH7\"";
param = customer;
requestId = "req_TKAARUJqcDqecK";
statusCode = 400;
type = "invalid_request_error";

Поскольку я успешно создаю и могу просматривать идентификаторы клиентов на панели инструментов, я почти уверен, что у меня есть правильный тестовый публикуемый ключ в моем приложении iOS и правильный секретный ключ в моем файле Firebase .js. У меня есть «просмотр тестовых данных», установленный на «ВКЛ» на панели инструментов Stripe.

Если вы посмотрите на приведенный ниже код, вы не увидите здесь ничего неправильного?

index.js

const functions = require('firebase-functions');
const stripe_key = "sk_test_y1otMY_SECRET_KEY"
var stripeFire = require("stripe-fire")(stripe_key);

// The Firebase Admin SDK to access the Firebase Realtime Database. 
const admin = require('firebase-admin');
var stripe = require('stripe')(stripe_key);
admin.initializeApp(functions.config().firebase);

exports.newCustomer = functions.https.onRequest((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).json(customer.id)
    }).catch((err) => {
           console.log('error while creating new customer account' + err)
           res.status(400).send(JSON.stringify({ success: false, error: err }))
    });
});

// Express
exports.StripeEphemeralKeys = functions.https.onRequest((req, res) => {
  const stripe_version = req.body.api_version;
  const customerId = req.body.customerId
  if (!stripe_version) {
    console.log('I did not see any api version')
    res.status(400).end()
    return;
  }

  stripe.ephemeralKeys.create(
    {customer: customerId},
    {stripe_version: stripe_version}
  ).then((key) => {
     console.log("Ephemeral key: " + key)
     res.status(200).json(key)
  }).catch((err) => {
    console.log('stripe version is ' + stripe_version + " and customer id is " + customerId + " for key: " + stripe_key + " and err is " + err.message )
    res.status(500).json(err)
  });
});

на стороне Swift в MyAPIClient.swift:

func createNewCustomer(withAPIVersion apiVersion : String, completion: @escaping STPJSONResponseCompletionBlock)
{
    // using our Facebook account's e-mail for now...
    let facebookDictionary = FacebookInfo.sharedInstance.graphDictionary
    if let facebookemail = facebookDictionary["email"] as? String {

        guard let key = Stripe.defaultPublishableKey() , !key.contains("#") else {
            let error = NSError(domain: StripeDomain, code: 50, userInfo: [
                NSLocalizedDescriptionKey: "Please set stripePublishableKey to your account's test publishable key in CheckoutViewController.swift"
                ])

            completion(nil, error)

            return
        }
        guard let baseURLString = self.baseURLString, let baseURL = URL(string: baseURLString) else {

            print("something broken... what should I do?")
            // how about some kind of error in the second parameter??
            completion(nil, nil)

            return
        }

        let path = "newCustomer"
        let url = baseURL.appendingPathComponent(path)
        var request = URLRequest(url: url)
        request.httpMethod = "POST"
        request.addValue("application/json", forHTTPHeaderField: "Content-Type")
        request.addValue("application/json", forHTTPHeaderField: "Accept")
        let parameters = ["email" : facebookemail]
        do {
            request.httpBody = try JSONSerialization.data(withJSONObject: parameters, options: .prettyPrinted)
        } catch let error {
            print("error while serialization parameters is \(error.localizedDescription)")
        }

        let task = self.session.dataTask(with: request) { (data, urlResponse, error) in

            if let actualError = error {
                print("error from createNewCustomer API is \(actualError)")
            }

            if let httpResponse = urlResponse as? HTTPURLResponse {
                print("httpResponse is \(httpResponse.statusCode)")

                if (httpResponse.statusCode == 200)
                {
                    // eventually we'll want to get this into an actual complex JSON response / structure
                    if let actualData = data
                    {
                        if let customerIDString = String(data: actualData, encoding: .utf8) {
                            print("customer id string is \(customerIDString)")

                            let defaults = UserDefaults.standard

                            let originalcustomerid = defaults.string(forKey: "CustomerID")
                            if customerIDString != originalcustomerid
                            {
                                defaults.set(customerIDString, forKey: "CustomerID")
                                defaults.set(facebookemail, forKey: "CustomerEmail")
                            }
                        }
                    }
                    self.createCustomerKey(withAPIVersion: apiVersion, completion: completion)
                }
            } else {
                assertionFailure("unexpected response")
            }
        }
        task.resume()
    }
}

func createCustomerKey(withAPIVersion apiVersion: String, completion: @escaping STPJSONResponseCompletionBlock)
{
    // first, let's see if we have a valid customer ID for the facebook e-mail we're using

    if weHaveCustomerIDSaved() == false
    {
        createNewCustomer(withAPIVersion: apiVersion, completion: completion)
        return
    }

    guard let key = Stripe.defaultPublishableKey() , !key.contains("#") else {
        let error = NSError(domain: StripeDomain, code: 50, userInfo: [
            NSLocalizedDescriptionKey: "Please set stripePublishableKey to your account's test publishable key in CheckoutViewController.swift"
            ])

        completion(nil, error)

        return
    }
    guard let baseURLString = baseURLString, let baseURL = URL(string: baseURLString) else {

        print("something broken... what should I do?")
        // how about some kind of error in the second parameter??
        completion(nil, nil)

        return
    }

    let defaults = UserDefaults.standard

    if let customerid = defaults.string(forKey: "CustomerID")
    {
        let path = "StripeEphemeralKeys"
        let url = baseURL.appendingPathComponent(path)
        var request = URLRequest(url: url)
        request.httpMethod = "POST"
        request.addValue("application/json", forHTTPHeaderField: "Content-Type")
        request.addValue("application/json", forHTTPHeaderField: "Accept")
        let parameters = ["api_version" : apiVersion, "customerId" : customerid]
        do {
            request.httpBody = try JSONSerialization.data(withJSONObject: parameters, options: .prettyPrinted)
        } catch let error {
            print("error while serialization parameters is \(error.localizedDescription)")
        }

        let task = self.session.dataTask(with: request) { (data, urlResponse, error) in

            if let httpResponse = urlResponse as? HTTPURLResponse {
                print("httpResponse is \(httpResponse.statusCode)")
            } else {
                assertionFailure("unexpected response")
            }

            if let actualError = error {
                print("error from EphemeralKey API is \(actualError)")
            }

            DispatchQueue.main.async {
                do {
                    if let actualData = data
                    {
                        if let json = try JSONSerialization.jsonObject(with: actualData) as? [AnyHashable : Any]
                        {
                            print("json is \(json)")
                            completion(json, nil)
                        }
                    }
                } catch let error {
                    print("error from json \(error.localizedDescription)")
                }
            }
        }
        task.resume()
    }
}

Вот моя панель инструментов Firebase

Панель управления Firebase

И моя вкладка клиента Stripe, показывающая созданную мной учетную запись клиента, действительно там...

Вкладка

Наконец, вот журнал типичной транзакции с эфемерным ключом: Ошибка в моем журнале Stripe


  • index.js выглядит нормально... Я бы настроил простой скрипт node.js, который создает клиента, а затем пытается сгенерировать эфемерный ключ, просто чтобы проверить, что серверная сторона делает то, что должна. Ваша проблема связана с несоответствием ключа ИЛИ тем фактом, что вы создали клиента и сразу же просите создать эфемерный ключ, а полоса имеет кэширование/другие проблемы. Я предполагаю, что вы можете взять request_id и посмотреть его на панели инструментов. 02.02.2018
  • @BrianPutt спасибо за быстрые взгляды. Я не могу представить, что это ключевое несоответствие, так как новый идентификатор клиента создан успешно. Когда я запускаю приложение более чем через 60 секунд, я ранее сохранил идентификатор клиента, и он обходит создание новой учетной записи и по-прежнему получает строку «Нет такого клиента» в консоли Firebase, хотя все значения выглядят очень правильно на мой взгляд. Я отредактировал вопрос, чтобы показать ввод и вывод запроса в журнале Stripe. 02.02.2018
  • @MichaelDautermann Как вы создали это выражение if. if weHaveCustomerIDSaved() == false { createNewCustomer(withAPIVersion: apiVersion, завершение: завершение) return } . Я пытаюсь воссоздать ваш код, но постоянно получаю сообщение об ошибке для этого метода weHaveCustomerIDSaved(). Я сначала подумал, что это просто Буль 04.03.2018
  • Привет @Markinson. Эта функция в основном проверяет, сохранил ли я ранее идентификатор клиента в UserDefaults. 09.03.2018

Ответы:


1

Используйте cus_CFRA95y1cKuNH7, а не \" cus_CFRA95y1cKuNH7 \"

Вам не нужны \" до и после вашего идентификатора клиента. Идентификатор клиента, который нужен Stripe, должен выглядеть как cus_CFRA95y1cKuNH7 вместо того, чтобы вы отправляли \"cus_CFRA95y1cKuNH7\". И это должно работать в конце концов.

Сообщение об ошибке должно выглядеть как No such customer: cus_CFRA95y1cKuNH7;, а не "No such customer: \"cus_CFRA95y1cKuNH7\"";.

09.02.2018
  • Да, это была проблема (и прямо передо мной тоже). Мне нужно выяснить, как кавычки попадают в идентификатор клиента, который я сохраняю, но пока я просто удаляю их из строки, которую отправляю в Firebase/Stripe. 22.02.2018
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..