2

我在我的应用程序中使用 Braintree 进行支付流程
[BTPaymentViewController paymentViewControllerWithVenmoTouchEnabled:NO]; 并使用此方法进行加密`

(void)paymentViewController:(BTPaymentViewController *)paymentViewController
        didSubmitCardWithInfo:(NSDictionary *)cardInfo
         andCardInfoEncrypted:(NSDictionary *)cardInfoEncrypted {
      NSDictionary *dict=[self encryptFormData:cardInfo];
      [self savePaymentInfoToServer:dict];
}

-(NSDictionary *) encryptFormData:(NSDictionary *) formData {
    BTEncryption *braintree = [[BTEncryption alloc] initWithPublicKey: PUBLIC_KEY];
    NSMutableDictionary *encryptedParams = [[NSMutableDictionary alloc] init];

    [formData enumerateKeysAndObjectsUsingBlock:^(id key, id object, BOOL *stop) {
        [encryptedParams setObject: [braintree encryptString: object] forKey: key];
    }];

    return encryptedParams;
}

call to this method to post the data to localhost server for testing
- (void) savePaymentInfoToServer:(NSDictionary *)paymentInfo {
    NSURL *url = [NSURL URLWithString: [NSString stringWithFormat:@"%@/card", 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;
    AppDelegate *appdelegate=(AppDelegate *) [[UIApplication sharedApplication]delegate];

    [paymentInfo setValue:appdelegate.referenceId forKey:@"bookingRefId"];
    [paymentInfo setValue:appdelegate.passengerId forKey:@"passengerId"];


    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 && requestError) {
             NSLog(@"requestError: %@", requestError);
             [self.paymentViewController showErrorWithTitle:@"Error" message:@"Unable to reach the network."];
             return;
         }

         NSDictionary *<b>responseDictionary</b> = [NSJSONSerialization JSONObjectWithData:body options:kNilOptions error:&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];

             }];

         } 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]];
         }
     }];
}`

包含 responseDictionary 为空且错误为空 如何解决此问题 任何人都可以帮助我

4

1 回答 1

1

您将paymentInfo字典发送到哪里(即是什么SAMPLE_CHECKOUT_BASE_URL)?Braintree 构建的示例项目模拟了一个后端,就好像你自己有一个一样。您需要将该 URL 替换为后端的 URL。

提供BTPaymentViewController客户端信用卡结帐页面,但您的后端仍需执行交易。为了让您的后端执行该事务,您必须将该paymentInfo字典发送到您的服务器。

如果您尚未为您的 iOS 应用程序构建后端,您可以在几分钟内通过Braintree快速设置并获得批准,以处理您的付款。

于 2013-08-07T15:01:25.377 回答