# Step 3: Register external services

Register external services for Tax Calculation and Payment Services.

### Tax integration service

If you **have** **not** registered the external service for tax integration:

1. The script below can be used to insert the Tax Calculation Apex class that comes with the package into `RegisteredExternalService`.  To use the script, simply modify the <\<storeName>> variable before running.

   ```
   // WebStore query values
   String webstoreName = <<storeName>>; // Enter your webstore name
    
   // ApexClass query values
   String apexClassname = 'DRB2B_CartTaxCalculations';
   String status = 'Active';
   Double ApiVersion = 51.0;
    
   // RegisteredExternalService insert values
   String registeredProviderType = 'Tax';
   String registeredDevName = 'COMPUTE_TAXES';
   String registeredLabel = registeredDevName;
    
   // StoreIntegratedService insert values
   String devname = registeredDevName;
   String prefix = registeredProviderType;
   String prefixedName = prefix + '__' + devname;
    
   // locate webstore
   WebStore webStore = Database.query('SELECT Id FROM WebStore 
   WHERE Name = :webstoreName LIMIT 1');
   String webStoreId = webStore.Id;
   System.debug('webStoreId:' + webStoreId);
    
   // locate apex class Id
   ApexClass apexClass = Database.query('SELECT Id FROM ApexClass 
   WHERE Status=:status AND ApiVersion=:apiVersion AND 
   Name=:apexClassname LIMIT 1');
   String apexClassId = apexClass.Id;
   System.debug('apexClassId:' + apexClassId);
    
    
   // locate apex in RegisteredExternalService
   String registeredIntegrationId = null;
   try {
       RegisteredExternalService registeredExternalService = 
       Database.query('SELECT Id FROM RegisteredExternalService 
       WHERE ExternalServiceProviderId=:apexClassId AND 
       DeveloperName=:registeredDevName AND 
       ExternalServiceProviderType=:registeredProviderType LIMIT 1');
       registeredIntegrationId = registeredExternalService.Id;
       System.debug('apex class registration: FOUND ' 
       + registeredIntegrationId);
       //delete registeredExternalService; // optionally remove 
       if needed
       
   } 
   catch (QueryException q) {
       System.debug('apex class registration: MISSING ' + apexClassId);
       insert new RegisteredExternalService(DeveloperName = 
       registeredDevName, MasterLabel = registeredLabel, 
       ExternalServiceProviderId = apexClassId, 
       ExternalServiceProviderType = registeredProviderType);
       RegisteredExternalService registeredExternalService = 
       Database.query('SELECT Id FROM RegisteredExternalService WHERE 
       ExternalServiceProviderId = :apexClassId  LIMIT 1');
       registeredIntegrationId = registeredExternalService.Id;
       System.debug('apex class registration: INSERTED ' + 
       registeredIntegrationId);
   }
   ```
2. Verify that the `Tax Calculation Apex class ID` is registered with the`soql`query below. The `ExternalServiceProviderId` should match the Tax Calculation Apex Class `DRB2B_CartTaxCalculations` ID in the org.&#x20;

```
Select Id, ExternalServiceProviderId, ExternalServiceProviderType, 
DeveloperName From RegisteredExternalService Where 
ExternalServiceProviderType = 'Tax'
```

If you **have** already registered the external service for tax integration:

1. Execute the below script to update the Tax Integration service to point to the Tax Calculation integration class from the Salesforce Lightning app.&#x20;

   ```
   // Configure Tax Calculation Service
   RegisteredExternalService taxServiceRegistration = [
           SELECT Id
           FROM RegisteredExternalService
           WHERE ExternalServiceProviderType = 'Tax'
           LIMIT 1
   ];

   ApexClass taxCalculationService = [
           SELECT Id
           FROM ApexClass
           WHERE Name = 'DRB2B_CartTaxCalculations'
           LIMIT 1
   ];


   taxServiceRegistration.ExternalServiceProviderId = 
   taxCalculationService.Id;update taxServiceRegistration;

   ```
2. Verify that the `Tax Calculation Apex class ID` is registered by making the below `soql` query. The `ExternalServiceProviderId` should match the Tax Calculation Apex Class `DRB2B_CartTaxCalculations` ID in the org.

```
Select Id, ExternalServiceProviderId, ExternalServiceProviderType, 
DeveloperName  From RegisteredExternalService Where 
ExternalServiceProviderType = 'Tax'
```

### Payment Service

Register Payment Service by the following steps:

1. Capture the `WebStore Id`. This will be used in the script in step 4.
2. Create a Named Credential for Digital River with the following details:
   * **Label**: Digital River API
   * **Name**: Digital\_River\_API
   * **URL**: <https://api.digitalriver.com>
   * **Identity Type**: Named Principal
   * **Authentication Protocol**: No Authentication
   * **Generate Authorization Header**: false \ <img src="https://4095141294-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MS-2crEBZIcuq_A3pl1%2F-Mf-8QN_QSI2dyzeSDW6%2F-Mf-9RGU7he62Qlglodk%2FNamed%20Credential.jpg?alt=media&#x26;token=2e016496-dc1c-4ec2-9e83-cc8e581a2cd1" alt="" data-size="original">&#x20;
3. Create a **Payment Gateway Provider**:
   * Log in to Workbench from your commerce org.
   * Go to the **Data** tab and select **Insert**.
   * Go to the **Object Type** and select **PaymentGatewayProvider**.
   * Select **Single Record** and click **Next**.
   * Fill in the fields using your Payment Gateway Adapter information.

     | Field name           | Example                                                                 |
     | -------------------- | ----------------------------------------------------------------------- |
     | ApexAdapterId        | ID of Payment Gateway Adapter Apex class  `DRB2B_PaymentGatewayAdapter` |
     | DeveloperName        | DR\_PaymentGateway                                                      |
     | IdempotencySupported | Yes                                                                     |
     | MasterLabel          | DR Payment Gateway                                                      |
     | Comments             | Digital River Payment Gateway Provider                                  |
   * Click **Confirm Insert**. \ <img src="https://4095141294-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MS-2crEBZIcuq_A3pl1%2F-Mf-By2qndhi7KC04pZe%2F-Mf-CQfFK43a-H3NdIrY%2FPayment%20gateway%20provider.png?alt=media&#x26;token=fec3dc29-4755-40b4-94ca-428f43cc8f54" alt="" data-size="original">&#x20;
4. Set up Payment Gateway and insert a `StoreIntegratedService` record for payment by executing the below script:

```
PaymentGatewayProvider paymentGatewayProvider = 
[SELECT Id FROM PaymentGatewayProvider Where DeveloperName = 
'DR_PaymentGateway' LIMIT 1]; 
NamedCredential namedCredential = [SELECT Id FROM NamedCredential 
WHERE DeveloperName = 'Digital_River_API' LIMIT 1]; 
PaymentGateway paymentGateway = new PaymentGateway( 
        PaymentGatewayName = 'Digital River Payment Gateway', 
        MerchantCredentialId = namedCredential.Id, 
        PaymentGatewayProviderId = paymentGatewayProvider.Id, 
        Status = 'Active' 
); 
insert paymentGateway; 
List<StoreIntegratedService> storeIntegratedServiceList = 
[SELECT Id FROM StoreIntegratedService WHERE ServiceProviderType = 
'Payment' Limit 1]; 
if(null != storeIntegratedServiceList && 
storeIntegratedServiceList.size() > 0) { 
    StoreIntegratedService storeIntegratedService = 
    storeIntegratedServiceList.get(0); 
    storeIntegratedService.Integration = paymentGateway.Id; 
    update storeIntegratedServiceList; 
} 
else { 
    StoreIntegratedService storeIntegratedService = new 
    StoreIntegratedService( 
        StoreId = 'WebStoreId', 
        Integration = paymentGateway.Id, 
        ServiceProviderType = 'Payment' 
    ); 
    insert storeIntegratedService; 
} 
```
