{"record":{"id":"b7ae175d04354a09","repo":"signalapp/Signal-Server","slug":"result-getmessage","errorCode":null,"errorMessage":"result.getMessage()","messagePattern":"result\\.getMessage\\(\\)","errorType":"exception","errorClass":"BraintreeException","httpStatus":null,"severity":"error","filePath":"service/src/main/java/org/whispersystems/textsecuregcm/subscriptions/BraintreeManager.java","lineNumber":336,"sourceCode":"\n  }\n\n  public record PayPalChargeSuccessDetails(String paymentId) {\n\n  }\n\n  @Override\n  public ProcessorCustomer createCustomer(final byte[] subscriberUser, @Nullable final ClientPlatform clientPlatform) {\n    final CustomerRequest request = new CustomerRequest()\n        .customField(\"subscriber_user\", HexFormat.of().formatHex(subscriberUser));\n\n    if (clientPlatform != null) {\n      request.customField(\"client_platform\", clientPlatform.name().toLowerCase());\n    }\n\n    final Result<Customer> result = braintreeGateway.customer().create(request);\n    if (!result.isSuccess()) {\n      throw new BraintreeException(result.getMessage());\n    }\n    return new ProcessorCustomer(result.getTarget().getId(), PaymentProvider.BRAINTREE);\n  }\n\n  @Override\n  public String createPaymentMethodSetupToken(final String customerId) {\n    final ClientTokenRequest request = new ClientTokenRequest().customerId(customerId);\n\n    return braintreeGateway.clientToken().generate(request);\n  }\n\n  @Override\n  public void setDefaultPaymentMethodForCustomer(final String customerId, final String billingAgreementToken,\n      @Nullable final String currentSubscriptionId) throws IOException {\n    final Optional<String> maybeSubscriptionId = Optional.ofNullable(currentSubscriptionId);\n    final TokenizePayPalBillingAgreementMutation.TokenizePayPalBillingAgreement tokenizePayPalBillingAgreement =\n        braintreeGraphqlClient.tokenizePayPalBillingAgreement(billingAgreementToken);\n    final VaultPaymentMethodMutation.VaultPaymentMethod vaultPaymentMethod =","sourceCodeStart":318,"sourceCodeEnd":354,"githubUrl":"https://github.com/signalapp/Signal-Server/blob/100ab61c82627582c867d19e1c0561ba2781e927/service/src/main/java/org/whispersystems/textsecuregcm/subscriptions/BraintreeManager.java#L318-L354","documentation":"BraintreeManager.createCustomer calls braintreeGateway.customer().create(request); when the Braintree gateway returns an unsuccessful Result (validation errors, declined, gateway problems), Signal wraps result.getMessage() in a BraintreeException. The message text is whatever Braintree's SDK reported, so the underlying cause is a rejected Braintree customer-creation request.","triggerScenarios":"braintreeGateway.customer().create(request) returns isSuccess() == false — e.g. invalid merchant credentials, processor/AVS validation errors, duplicate customer id, or Braintree API outage.","commonSituations":"Misconfigured Braintree environment (sandbox keys used against production or vice versa), expired/rotated API keys, invalid customer fields (bad id format, too-long custom fields), Braintree transient outage during signup.","solutions":["Inspect result.getMessage() / result.getErrors() in logs to get Braintree's specific validation error and fix the corresponding field.","Verify Braintree gateway credentials (merchantId, publicKey, privateKey) and that environment matches the key set (SANDBOX vs PRODUCTION).","If a duplicate customer id is being sent, generate a unique customer id or look up the existing customer first.","Retry with backoff if Braintree reports a transient gateway/system error."],"exampleFix":"// before\nResult<Customer> result = braintreeGateway.customer().create(request);\nif (!result.isSuccess()) {\n  throw new BraintreeException(result.getMessage());\n}\n// after: surface detailed errors\nif (!result.isSuccess()) {\n  logger.warn(\"Braintree customer create failed: {}\", result.getErrors().getAllDeepValidationErrors());\n  throw new BraintreeException(result.getMessage());\n}","handlingStrategy":"try-catch","validationCode":"// verify credentials and environment at startup\nbraintreeGateway.clientToken().generate(); // fails fast on bad credentials/environment","typeGuard":null,"tryCatchPattern":"try {\n  processorCustomer = braintreeManager.createCustomer(...);\n} catch (BraintreeException e) {\n  log.warn(\"Braintree customer create failed: {}\", e.getMessage());\n  showPaymentProviderUnavailable();\n}","preventionTips":["Validate Braintree merchant credentials and environment (sandbox vs production) at deploy time","Log result.getErrors() deep validation errors, not just getMessage()","Generate unique customer ids to avoid duplicate-id errors","Retry with backoff on transient Braintree gateway errors"],"tags":["braintree","payment-provider","customer-creation","gateway-error"],"backgroundTag":"api-error-response","analyzedSha":"100ab61c82627582c867d19e1c0561ba2781e927","analyzedAt":"2026-09-09T13:29:47.883Z","contentChangedAt":"2026-09-09T13:29:47.883Z","schemaVersion":2},"datasetVersion":"2026-09-16T09:17:16.951Z"}