【问题标题】:Client side IOS to Server using Braintree Payment Process使用 Braintree 支付流程的客户端 IOS 到服务器
【发布时间】:2013-08-07 12:58:23
【问题描述】:

我在我的应用程序中使用 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]];
         }
     }];
}`

contain responseDictionary 为 null 且 error 为 null 如何解决此问题,谁能帮帮我

【问题讨论】:

    标签: ios objective-c payment-gateway payment braintree


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2016-01-01
      • 2013-01-05
      • 2019-05-28
      • 2023-03-14
      • 2013-06-19
      • 2019-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多