Swift & Stripe получает способ оплаты от клиента - PullRequest
0 голосов
/ 08 мая 2020

Я пытаюсь использовать сохраненный клиентом способ оплаты в полосе для совершения платежей, но у меня возникают две проблемы.

1). Я не могу декодировать ответ JSON, который мой серверный вызов отправляет приложению, и получить Payment Method Id. Я получаю полный ответ JSON, но когда я пытаюсь распечатать ID, он возвращает ноль.

2). Если у пользователей сохранено несколько способов оплаты, как я узнаю, какие из них они собираются использовать при декодировании ответа JSON, чтобы получить Payment Method Id?

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

Сторона сервера:

exports.listUserSavedCards = functions.https.onRequest(async (req, res) => {

var customerId = req.body.customer_id

const paymentMethods = await stripe.paymentMethods.list({
  customer: customerId,
  type: 'card',
}).then(function(paymentMethods) {
  // asynchronously called
  return res.send(paymentMethods);
});
})

Сторона приложения:

func listUserSavedCards(customerId: String) {

    let URLString = "https://us-central1-example.cloudfunctions.net/" + "listUserSavedCards" as String

    var requestData : [String : String]? = [String : String]()
    requestData?.updateValue(customerId, forKey: "customer_id");

    submitDataToURL(URLString, withMethod: "POST", requestData: requestData!) { (jsonResponse, err) in
        if err != nil {
            print(err)
            return
        }
        else {

            let response = jsonResponse["id"]


        }
    }
}

JSON Ответ:

["url": /v1/payment_methods, "object": list, "has_more": 0, "data": <__NSSingleObjectArrayI 
0x600002c46800>(
{
"billing_details" =     {
    address =         {
        city = "<null>";
        country = "<null>";
        line1 = "<null>";
        line2 = "<null>";
        "postal_code" = 4553;
        state = "<null>";
    };
    email = "<null>";
    name = "<null>";
    phone = "<null>";
};
card =     {
    brand = mastercard;
    checks =         {
        "address_line1_check" = "<null>";
        "address_postal_code_check" = pass;
        "cvc_check" = pass;
    };
    country = US;
    "exp_month" = 2;
    "exp_year" = 2021;
    fingerprint = OqzEjapFroTZ3Lqn;
    funding = credit;
    "generated_from" = "<null>";
    last4 = 4444;
    "three_d_secure_usage" =         {
        supported = 1;
    };
    wallet = "<null>";
};
created = 1588901399;
customer = "cus_HDdTb2Me8W6MUM";
  id = "pm_1GgL2JB7pjuLNBFRl48k0nyg";
  livemode = 0;
  metadata =     {
  };
  object = "payment_method";
  type = card;
}
)
]

Отправить данные на URL:

do {
      guard let url = URL(string: urlString) else {return};

      let defaultSession = URLSession(configuration: .default)

      var urlRequest = URLRequest(url: url, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 540)

      urlRequest.httpMethod = method;
      urlRequest.setValue("application/json; charset=utf-8", forHTTPHeaderField: "Content-Type")  // the request is JSON
      urlRequest.setValue("application/json; charset=utf-8", forHTTPHeaderField: "Accept")        // the expected response is also JSON

      let httpBodyData : Data?

    try httpBodyData = JSONSerialization.data(withJSONObject: data, options: [.fragmentsAllowed]);

      urlRequest.httpBody = httpBodyData;

      let dataTask = defaultSession.dataTask(with: urlRequest, completionHandler: { (responseData, urlResponse, error) in

          if error == nil {
              do {
                let response = try JSONSerialization.jsonObject(with: responseData!, options: [.fragmentsAllowed]) as! [String : Any];
                  completion(response, nil);
              }
              catch {
                  print("Exception")
                  let response : [String : Any] = [String : Any]()
                  completion(response, error);
              }
          }
          else {
              let response : [String : Any] = [String : Any]()
              completion(response, error);
          }
      });

      dataTask.resume();
  }
  catch {
      print("Excetion in submitDataToURL")
  }
}

Ответы [ 2 ]

0 голосов
/ 11 мая 2020

Я получил Id, используя приведенный ниже код.

let response = jsonResponse

let results = response["data"] as? [[String: Any]]

let firstDict = results?.first

guard let id = firstDict?["id"] as? String else { return }
0 голосов
/ 08 мая 2020

paymentMethods.list возвращает объект со свойством data, который содержит массив PaymentMethods. В вашем коде вы можете получить доступ к этому примерно так:

jsonResponse["data"][0]["id]

Предполагая, что вы правильно сериализуете объект JSON в своей функции submitDataToURL.

...