Swift, Stripe и Google Cloud Функции: обработка ошибок, например;недействительная карта - PullRequest
0 голосов
/ 28 мая 2019

Я успешно реализовал функцию Stripe Google Cloud addPaymentSource найдено здесь , которая добавляет источник платежа пользователю, когда token записывается в базу данных.

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

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

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

Есть ли более эффективный способ обработки ошибок в этом случае?

postStripeToken функция Swift:

func postStripeToken(token: STPToken) {

        DataService.run.updateStripeTokenForUser(uid: (Auth.auth().currentUser?.uid)!, token: token.tokenId) { (success) in
            if success {

                DispatchQueue.main.asyncAfter(deadline: .now() + .milliseconds(3000)) {

                    DataService.run.checkForCardErrorMessage(handler: { (error, errorMsg) in

                        if error {

                            Utilities.run.dismissSVHUD(delay: 0.0)
                            print("errorMsg: \(errorMsg)")
                            self.errorMsgLbl.isHidden = false
                            self.errorMsgLbl.text = errorMsg
                            self.hideAndDeleteCardErrorMsg()

                        } else {

                            Utilities.run.dismissSVHUD(delay: 1.0)

                        }// end else

                    })//end checkForCardErrorMessage

                }//end asyncAfter

            }// end if-success

        }// end updateStripeTokenForUser

    }//end func

checkForCardErrorMessage функция Swift:

func checkForCardErrorMessage(handler: @escaping (Bool, String) -> ()){

        guard let uid = Auth.auth().currentUser?.uid else { return }

        let ref = REF_STRIPE_CUSTOMERS.child(uid).child("sources").child("sources").queryOrderedByKey().queryEqual(toValue: "error")

        ref.observeSingleEvent(of: .value) { (snapshot) in

            if snapshot.exists(){

                guard let snap = snapshot.value as? [String: Any] else { return }
                let errMsg = snap["error"] as? String ?? ""

                handler(true,errMsg)

            } else {

                handler(false, "")

            }//end if

        }//end observe


    }//end func

addPaymentSource Функция Google Cloud - JS:

exports.addPaymentSource = functions.database
    .ref('/stripe_customers/{userId}/sources/{pushId}/token').onWrite((change, context) => {
      const source = change.after.val();
      if (source === null){
        return null;
      }
      return admin.database().ref(`/stripe_customers/${context.params.userId}/customer_id`)
          .once('value').then((snapshot) => {
            return snapshot.val();
          }).then((customer) => {
            return stripe.customers.update(customer, {source}); //createSource(customer, {source});
          }).then((response) => {
            return change.after.ref.parent.set(response);
          }, (error) => {
            return change.after.ref.parent.child('error').set(userFacingMessage(error));
          }).then((error) => {
            return reportError(error, {user: context.params.userId});
          });
});
...