BTVenmoAppSwitchRequestURL.m 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. #import "BTVenmoAppSwitchRequestURL.h"
  2. #if __has_include(<Braintree/BraintreeVenmo.h>) // CocoaPods
  3. #import <Braintree/BraintreeCore.h>
  4. #import <Braintree/Braintree-Version.h>
  5. #elif SWIFT_PACKAGE // SPM
  6. #import <BraintreeCore/BraintreeCore.h>
  7. #import "../BraintreeCore/Braintree-Version.h"
  8. #else // Carthage
  9. #import <BraintreeCore/BraintreeCore.h>
  10. #import <BraintreeCore/Braintree-Version.h>
  11. #endif
  12. #define kXCallbackTemplate @"scheme://x-callback-url/path"
  13. #define kVenmoScheme @"com.venmo.touch.v2"
  14. @implementation BTVenmoAppSwitchRequestURL
  15. + (NSURL *)baseAppSwitchURL {
  16. return [self appSwitchBaseURLComponents].URL;
  17. }
  18. +(NSURL *)appSwitchURLForMerchantID:(NSString *)merchantID
  19. accessToken:(NSString *)accessToken
  20. returnURLScheme:(NSString *)scheme
  21. bundleDisplayName:(NSString *)bundleName
  22. environment:(NSString *)environment
  23. paymentContextID:(NSString *)paymentContextID
  24. metadata:(BTClientMetadata *)metadata
  25. {
  26. NSURL *successReturnURL = [self returnURLWithScheme:scheme result:@"success"];
  27. NSURL *errorReturnURL = [self returnURLWithScheme:scheme result:@"error"];
  28. NSURL *cancelReturnURL = [self returnURLWithScheme:scheme result:@"cancel"];
  29. if (!successReturnURL || !errorReturnURL || !cancelReturnURL || !accessToken || !metadata || !scheme || !bundleName || !environment || !merchantID) {
  30. return nil;
  31. }
  32. NSMutableDictionary *braintreeData = [@{@"_meta": @{
  33. @"version": BRAINTREE_VERSION,
  34. @"sessionId": [metadata sessionID],
  35. @"integration": [metadata integrationString],
  36. @"platform": @"ios"
  37. }
  38. } mutableCopy];
  39. NSData *serializedBraintreeData = [NSJSONSerialization dataWithJSONObject:braintreeData options:0 error:NULL];
  40. NSString *base64EncodedBraintreeData = [serializedBraintreeData base64EncodedStringWithOptions:0];
  41. NSMutableDictionary *appSwitchParameters = [@{@"x-success": successReturnURL,
  42. @"x-error": errorReturnURL,
  43. @"x-cancel": cancelReturnURL,
  44. @"x-source": bundleName,
  45. @"braintree_merchant_id": merchantID,
  46. @"braintree_access_token": accessToken,
  47. @"braintree_environment": environment,
  48. @"braintree_sdk_data": base64EncodedBraintreeData,
  49. } mutableCopy];
  50. if (paymentContextID) {
  51. appSwitchParameters[@"resource_id"] = paymentContextID;
  52. }
  53. NSURLComponents *components = [self appSwitchBaseURLComponents];
  54. components.percentEncodedQuery = [BTURLUtils queryStringWithDictionary:appSwitchParameters];
  55. return components.URL;
  56. }
  57. #pragma mark Internal Helpers
  58. + (NSURL *)returnURLWithScheme:(NSString *)scheme result:(NSString *)result {
  59. NSURLComponents *components = [NSURLComponents componentsWithString:kXCallbackTemplate];
  60. components.scheme = scheme;
  61. components.percentEncodedPath = [NSString stringWithFormat:@"/vzero/auth/venmo/%@", result];
  62. return components.URL;
  63. }
  64. + (NSURLComponents *)appSwitchBaseURLComponents {
  65. NSURLComponents *components = [NSURLComponents componentsWithString:kXCallbackTemplate];
  66. components.scheme = kVenmoScheme;
  67. components.percentEncodedPath = @"/vzero/auth";
  68. return components;
  69. }
  70. @end