向 Cloud Function 添加额外的客户信息以创建 Stripe 客户

Adding Additional Customer Information to Cloud Function to Create Stripe Customer

我正在尝试向我的云功能添加额外的信息,以便我的 Stripe 客户将所有数据保存在 Firebase 数据库中。但是,我的问题是如何正确实现我的云函数中的常量以便正确上传信息?在我的云函数中没有全名、用户名和个人资料图像,在函数部分没有我的注册函数,它创建了 Stripe 客户。我如何构造这三个字段的常量以便它们也可以上传?或者我应该创建一个电子邮件和密码注册屏幕,以便我可以创建 stripeID,然后创建另一个屏幕以获取附加信息以添加到参考中?谢谢!

云函数:

exports.createStripeCustomer = functions.https.onCall( async (data, context) => {

    const email = data.email
    const uid = context.auth.uid
    const fullname = context.auth.uid.fullname
    const username = context.auth.uid.username
    const profileImage = context.auth.uid.profileImage
  
    if (uid === null) {
      console.log('Illegal access attempt due to unauthenticated attempt.')
      throw new functions.https.HttpsError('internal', 'Illegal access attempt')
    }
  
    return stripe.customers.create({
       email : email,
       fullname : fullname,
       username : username,
       profileImage : profileImage
    }).then( customer => {
      return customer["id"]
    }).then( customerId => {
      admin.database().ref("customers").child(uid).set(
        {
          stripeId: customerId,
          email: email,
          fullname: fullname,
          username: username,
          profileImage: profileImage,
          id: uid
        }
      )
    }).catch( err => {
      throw new functions.https.HttpsError('internal', 'Unable to create Stripe customer.')
    })
  
})

授权服务功能:

static func createCustomer(credentials: CustomerCredentials, completion: @escaping(DatabaseCompletion)) {
        
        guard let imageData = credentials.profileImage.jpegData(compressionQuality: 0.3) else { return }
        let filename = NSUUID().uuidString
        let storageRef = STORAGE_REF.reference(withPath: "/customer_profile_images/\(filename)")
        
        storageRef.putData(imageData, metadata: nil) { (meta, error) in
            if let error = error {
                debugPrint(error.localizedDescription)
                return
            }
            
            storageRef.downloadURL { (url, error) in
                guard let profileImageUrl = url?.absoluteString else { return }
                
                Auth.auth().createUser(withEmail: credentials.email, password: credentials.password) { (result, error) in
                    if let error = error {
                        debugPrint(error.localizedDescription)
                        return
                    }
                    
                    guard let uid = result?.user.uid else { return }
                    
                    let values = ["email" : credentials.email,
                                  "fullname" : credentials.fullname,
                                  "username" : credentials.username,
                                  "uid" : uid,
                                  "profileImageUrl" : profileImageUrl] as [String : Any]
                    
                    CustomerDataService.saveCustomerData(uid: uid, fullname: credentials.fullname, email: credentials.email,
                                                         username: credentials.username, profileImagUrl: profileImageUrl)
                    REF_CUSTOMERS.child(uid).setValue(values, withCompletionBlock: completion)
                }
            }
        }
        
}

注册函数:

@objc func handleCreateAccount() {
        
        guard let profileImage = profileImage else {
            self.simpleAlert(title: "Error", msg: "Please select a profile image.")
            return
        }
        
        guard let email = emailTextField.text?.lowercased() , email.isNotEmpty ,
            let fullname = fullnameTextField.text , fullname.isNotEmpty ,
            let username = usernameTextField.text?.lowercased() , username.isNotEmpty ,
            let password = passwordTextField.text , password.isNotEmpty ,
            let confirmPassword = confirmPasswordTextField.text , confirmPassword.isNotEmpty else {
                self.simpleAlert(title: "Error", msg: "Please fill out all fields.")
                return
        }
        
        if password != confirmPassword {
            self.simpleAlert(title: "Error", msg: "Passwords don't match, please try again.")
            return
        }
        
        showLoader(true, withText: "Registering Account")
        
        let credentials = CustomerCredentials(email: email, fullname: fullname, username: username,
                                              password: password, profileImage: profileImage)
        
        AuthService.createCustomer(credentials: credentials) { (error, ref) in
            if let error = error {
                Auth.auth().handleFireAuthError(error: error, vc: self)
                self.showLoader(false)
                return
            }
            
            Functions.functions().httpsCallable("createStripeCustomer").call(["email": credentials.email,
                                                                              "fullname": credentials.fullname,
                                                                              "username": credentials.username,
                                                                              "profileImage": credentials.profileImage]) { result, error in
                if let error = error {
                    Auth.auth().handleFireAuthError(error: error, vc: self)
                    self.showLoader(false)
                    return
                }
            }
            
            self.showLoader(false)
            guard let window = UIApplication.shared.windows.first(where: { [=12=].isKeyWindow }) else { return }
            guard let tab = window.rootViewController as? MainTabController else { return }
            tab.setupNavigationControllers()
            self.handleDismissal()
        }
        
} 

为了完成我想要完成的工作,我创建了一个屏幕供客户创建电子邮件和密码。这样就可以创建 StripeID,然后我创建了另一个屏幕来添加全名、用户名和个人资料图像,并更新了数据库引用。