我在我的应用程序中使用 Braintree 进行付款流程
[BTPaymentViewController paymentViewControllerWithVenmoTouchEnabled:NO];并使用此方法进行加密
`
(void)paymentViewControllerBTPaymentViewController *)paymentViewController
didSubmitCardWithInfoNSDictionary *)cardInfo
andCardInfoEncryptedNSDictionary *)cardInfoEncrypted {
NSDictionary *dict=[self encryptFormData:cardInfo];
[self savePaymentInfoToServer:dict];
}
-(NSDictionary *) encryptFormDataNSDictionary *) 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) savePaymentInfoToServerNSDictionary *)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 = @"OST";
[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"] isEqualToNumber1]) { // 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 且错误为 null 如何解决此问题,谁能帮帮我
Best Answer-推荐答案 strong>
您要将 paymentInfo 字典发送到哪里(即 SAMPLE_CHECKOUT_BASE_URL 是什么)? Braintree 构建的示例项目模拟了一个后端,就好像你自己有一个一样。您需要将该 URL 替换为后端的 URL。
BTPaymentViewController 提供客户端信用卡结账页面,但您的后端仍需执行交易。为了让您的后端执行该交易,您必须将该 paymentInfo 字典发送到您的服务器。
如果您还没有为您的 iOS 应用程序构建后端,您可以通过 Braintree 快速设置并在几分钟内获得批准处理您的付款。
关于ios - 使用 Braintree 支付流程的客户端 IOS 到服务器,我们在Stack Overflow上找到一个类似的问题:
https://stackoverflow.com/questions/18081548/
|