title: Use Braintree payment api in iOS app
body: <p>I want to use Braintree API in my iOS app.</p>
  
  <p>My app is used for renting purpose i.e. requester user has to make payment to the owner of asset he wanted for rent.</p>
  
  <p>I have checked following links : 
  <a href="http://www.youtube.com/watch?v=s7GlgBFM20I" rel="nofollow">http://www.youtube.com/watch?v=s7GlgBFM20I</a></p>
  
  <p><a href="https://www.braintreepayments.com/developers" rel="nofollow">https://www.braintreepayments.com/developers</a></p>
  
  <p><a href="http://www.youtube.com/watch?v=2y8Tsml6JYo" rel="nofollow">http://www.youtube.com/watch?v=2y8Tsml6JYo</a></p>
  
  <p><a href="https://www.braintreepayments.com/braintrust/venmo-touch-screencasts-add-one-touch-payments-to-your-app-in-15-minutes" rel="nofollow">https://www.braintreepayments.com/braintrust/venmo-touch-screencasts-add-one-touch-payments-to-your-app-in-15-minutes</a>
  etc.</p>
  
  <p>But I didn't get any idea where to provide receiver's account details using Braintree or Venmo api, For Example we can pass e-mail of receiver in PayPal iOS sdk, and then PayPal pays the amount to the user registered with that e-mail.</p>
  
  <p>The same thing I am searching in Braintree Payment API.</p>
  
  <p>Any help is greatly appreciated.</p>
  
  <p>Thanks in advance.</p>
  
  <p>I am using below code :  (Used from a sample code given by braintree)</p>
  
  <pre><code>/* Get called when user pay on Pay button on screen. 
     User wil see a form for entering his credit card number, CVV and expiration date. */
  -(IBAction)payButtonClicked 
  {
      self.paymentViewController =
      [BTPaymentViewController paymentViewControllerWithVenmoTouchEnabled:YES];
      self.paymentViewController.delegate = self;
  
      [self presentViewController:self.paymentViewController animated:YES completion:nil];
  }
  
  // When a user types in their credit card information correctly, the BTPaymentViewController sends you
  // card details via the `didSubmitCardWithInfo` delegate method.
  //
  // NB: you receive raw, unencrypted info in the `cardInfo` dictionary, but
  // for easy PCI Compliance, you should use the `cardInfoEncrypted` dictionary
  // to securely pass data through your servers to the Braintree Gateway.
  - (void)paymentViewController:(BTPaymentViewController *)paymentViewController
          didSubmitCardWithInfo:(NSDictionary *)cardInfo
           andCardInfoEncrypted:(NSDictionary *)cardInfoEncrypted {
      [self savePaymentInfoToServer:cardInfoEncrypted]; // send card through your server to Braintree Gateway
  }
  
  // When a user adds a saved card from Venmo Touch to your app, the BTPaymentViewController sends you
  // a paymentMethodCode that you can pass through your servers to the Braintree Gateway to
  // add the full card details to your Vault.
  - (void)paymentViewController:(BTPaymentViewController *)paymentViewController
  didAuthorizeCardWithPaymentMethodCode:(NSString *)paymentMethodCode {
      // Create a dictionary of POST data of the format
      // {"payment_method_code": "[encrypted payment_method_code data from Venmo Touch client]"}
      NSMutableDictionary *paymentInfo = [NSMutableDictionary dictionaryWithObject:paymentMethodCode
                                                                            forKey:@"payment_method_code"];
      [self savePaymentInfoToServer:paymentInfo]; // send card through your server to Braintree Gateway
  }
  
  #define SAMPLE_CHECKOUT_BASE_URL @"http://venmo-sdk-sample-two.herokuapp.com"
  //#define SAMPLE_CHECKOUT_BASE_URL @"http://localhost:4567"
  
  // Pass payment info (eg card data) from the client to your server (and then to the Braintree Gateway).
  // If card data is valid and added to your Vault, display a success message, and dismiss the BTPaymentViewController.
  // If saving to your Vault fails, display an error message to the user via `BTPaymentViewController showErrorWithTitle`
  // Saving to your Vault may fail, for example when
  // * CVV verification does not pass
  // * AVS verification does not pass
  // * The card number was a valid Luhn number, but nonexistent or no longer valid
  - (void) savePaymentInfoToServer:(NSDictionary *)paymentInfo {
  
      NSURL *url;
      if ([paymentInfo objectForKey:@"payment_method_code"]) {
          url = [NSURL URLWithString: [NSString stringWithFormat:@"%@/card/payment_method_code", SAMPLE_CHECKOUT_BASE_URL]];
      } else {
          url = [NSURL URLWithString: [NSString stringWithFormat:@"%@/card/add", SAMPLE_CHECKOUT_BASE_URL]];
      }
      NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url];
  
      // You need a customer id in order to save a card to the Braintree vault.
      // Here, for the sake of example, we set customer_id to device id.
      // In practice, this is probably whatever user_id your app has assigned to this user.
      NSString *customerId = [[UIDevice currentDevice] identifierForVendor].UUIDString;
      [paymentInfo setValue:customerId forKey:@"customer_id"];
  
      request.HTTPBody = [self postDataFromDictionary:paymentInfo];
      request.HTTPMethod = @"POST";
  
      [NSURLConnection sendAsynchronousRequest:request
                                         queue:[NSOperationQueue mainQueue]
                             completionHandler:^(NSURLResponse *response, NSData *body, NSError *requestError)
       {
           NSError *err = nil;
           if (!response &amp;&amp; requestError) {
               NSLog(@"requestError: %@", requestError);
               [self.paymentViewController showErrorWithTitle:@"Error" message:@"Unable to reach the network."];
               return;
           }
  
           NSDictionary *responseDictionary = [NSJSONSerialization JSONObjectWithData:body options:kNilOptions error:&amp;err];
           NSLog(@"saveCardToServer: paymentInfo: %@ response: %@, error: %@", paymentInfo, responseDictionary, requestError);
  
           if ([[responseDictionary valueForKey:@"success"] isEqualToNumber:@1]) { // Success!
               // Don't forget to call the cleanup method,
               // `prepareForDismissal`, on your `BTPaymentViewController`
               [self.paymentViewController prepareForDismissal];
               // Now you can dismiss and tell the user everything worked.
               [self dismissViewControllerAnimated:YES completion:^(void) {
                   [[[UIAlertView alloc] initWithTitle:@"Success" message:@"Saved your card!" delegate:nil
                                     cancelButtonTitle:@"OK" otherButtonTitles:nil] show];
                   [[VTClient sharedVTClient] refresh];
               }];
  
           } else { // The card did not save correctly, so show the error from server with convenenience method `showErrorWithTitle`
               [self.paymentViewController showErrorWithTitle:@"Error saving your card" message:[self messageStringFromResponse:responseDictionary]];
           }
       }];
  }
  </code></pre>