From 1f397559905d2de1232d5c7aec778140880afcde Mon Sep 17 00:00:00 2001 From: Shreya Thapa Date: Wed, 21 Feb 2024 10:35:29 -0500 Subject: [PATCH 1/2] DEV-1540: Add new retry veriifcation directive + updated browserslist database and lock file --- pages/changelog.mdx | 25 ++- .../handle-verification-statuses.mdx | 202 +++++++++++++++++- pnpm-lock.yaml | 147 ++++++------- 3 files changed, 280 insertions(+), 94 deletions(-) diff --git a/pages/changelog.mdx b/pages/changelog.mdx index 02af348b..086fe940 100644 --- a/pages/changelog.mdx +++ b/pages/changelog.mdx @@ -12,15 +12,22 @@ Keep up to date on new product features and enhancements, API docs, tools change ## Upcoming -### 2023-08-31 +## Completed -**SUNSET** +### 2024-02-20 -- Dwolla will be retiring the `dwolla.js` library, which supports adding an unverified bank funding source. Check out the official [announcement](https://discuss.dwolla.com/t/may-2023-updates-retiring-dwolla-s-client-side-javascript-library-dwolla-js/8969). -- The legacy dwolla.js will be replaced with functionality that has been added to our [Drop-in Components library](/concepts/drop-in-components#latest-v220). This library will serve as our primary web UI components library and offer an enhanced developer experience. Please refer to our [migration guide](https://discuss.dwolla.com/t/migration-guide-dwolla-js-to-dwolla-web-js/8968) for more details, including alternative solutions. -- The following API endpoints will be removed as part of the sunset: `/customers/{id}/iav-token` and `/customers/{id}/funding-sources-token`. +**ADDED** -## Completed +- Added a new `retry-with-full-ssn` link to the Customer resource. This link appears whenever retry information is required for the Controller in order to verify the business verified Customer. +- Check out our [Developer documentation](https://developers.dwolla.com/docs/balance/business-verified-customer/handle-verification-statuses#handling-retry-status) for more information. + +### 2024-01-11 + +**SUNSET** + +- Dwolla has retired the `dwolla.js` library, which supported adding an unverified bank funding source. Check out the official [announcement](https://discuss.dwolla.com/t/may-2023-updates-retiring-dwolla-s-client-side-javascript-library-dwolla-js/8969). +- The legacy dwolla.js has been replaced with functionality that has been added to our [Drop-in Components library](/concepts/drop-in-components#latest-v220). This library will serve as our primary web UI components library and offer an enhanced developer experience. Please refer to our [migration guide](https://discuss.dwolla.com/t/migration-guide-dwolla-js-to-dwolla-web-js/8968) for more details, including alternative solutions. +- The following API endpoints are removed as part of the sunset: `/customers/{id}/iav-token` and `/customers/{id}/funding-sources-token`. ### 2023-05-15 @@ -265,9 +272,9 @@ Keep up to date on new product features and enhancements, API docs, tools change - New version of C# SDK. - Breaking changes: - - DwollaClient no longer throws on API errors, they should be properly deserialized into RestResponse.Error instead. - - DwollaException, RestException, and RestResponse.Exception are removed. - - Use `EmptyResponse` instead of `object` in DwollaClient interface. +- DwollaClient no longer throws on API errors, they should be properly deserialized into RestResponse.Error instead. +- DwollaException, RestException, and RestResponse.Exception are removed. +- Use `EmptyResponse` instead of `object` in DwollaClient interface. - Check it out on our [Github](https://github.com/Dwolla/dwolla-v2-csharp) ### 2018-05-11 diff --git a/pages/docs/balance/business-verified-customer/handle-verification-statuses.mdx b/pages/docs/balance/business-verified-customer/handle-verification-statuses.mdx index ba3d03e5..78663360 100755 --- a/pages/docs/balance/business-verified-customer/handle-verification-statuses.mdx +++ b/pages/docs/balance/business-verified-customer/handle-verification-statuses.mdx @@ -36,7 +36,7 @@ As a developer, you will want to handle the various Customer statuses that can b ## Handling `retry` status -A `retry` status occurs when a Customer’s identity scores are too low during the initial verification attempt. Dwolla will require the **full 9-digits** of the Controller’s SSN on the retry attempt in order to give our identity vendor more information in an attempt to receive a sufficient score to approve the Customer account. The Customer will have one more opportunity to correct any mistakes. +A `retry` status occurs when a Customer’s identity scores are too low during the initial verification attempt. The Customer will have one more opportunity to correct any mistakes. You need to gather new information if the Customer is placed into the{" "} @@ -45,9 +45,89 @@ A `retry` status occurs when a Customer’s identity scores are too low during t scores. -All fields that were required in the initial Customer creation attempt will be required in the retry attempt, along with the full 9-digit SSN. +### Determining retry verification needed -### Sole Proprietorship - Request and response +When a business verified Customer is placed in the `retry` verification status, Dwolla will return a link in the API response after [retrieving a Customer](https://developers.dwolla.com/docs/balance/api-reference/customers/retrieve), which will be used by an application to determine if retry is needed. For business verified Customers with Controllers, different links can be returned depending on whether retry is needed for just the business, or both the Controller and business. If the Controller information needs to be retried, all fields that were required in the initial Customer creation attempt will be required in the retry attempt, along with the full 9-digit SSN of the Controller in order to give our identity vendor more information in an attempt to receive a sufficient score to approve the Customer account ([see example request below](#business-with-controller-retry-with-full-ssn---request-and-response)). Additionally, `_embedded` errors are included in the Customer resource which include information about the next steps required to get the Customer verified (see example response below). Refer to the table below for the list of possible links and their descriptions. + +| Link name | Description | +| ------------------- | ------------------------------------------------------------------------------- | +| retry-verification | Identifies if retry information is needed for the business. | +| retry-with-full-ssn | Identifies if retry information is needed for both the Controller and business. | + +#### Example response + +```json +{ + "_links": { + "self": { + "href": "https://api-sandbox.dwolla.com/customers/20c2d8e2-8ccf-42fd-bd9e-757c396f342d", + "type": "application/vnd.dwolla.v1.hal+json", + "resource-type": "customer" + }, + "retry-verification": { + "href": "https://api-sandbox.dwolla.com/customers/20c2d8e2-8ccf-42fd-bd9e-757c396f342d", + "type": "application/vnd.dwolla.v1.hal+json", + "resource-type": "customer" + }, + "retry-with-full-ssn": { + "href": "https://api-sandbox.dwolla.com/customers/20c2d8e2-8ccf-42fd-bd9e-757c396f342d", + "type": "application/vnd.dwolla.v1.hal+json", + "resource-type": "customer" + } + }, + "_embedded": { + "errors": [ + { + "code": "Required", + "message": "Full SSN required", + "path": "", + "_links": { + "retry-with-full-ssn": { + "href": "https://api-sandbox.dwolla.com/customers/20c2d8e2-8ccf-42fd-bd9e-757c396f342d", + "type": "application/vnd.dwolla.v1.hal+json", + "resource-type": "customer" + } + } + } + ] + }, + "id": "20c2d8e2-8ccf-42fd-bd9e-757c396f342d", + "firstName": "Account", + "lastName": "Admin", + "email": "accountAdmin@email.com", + "type": "business", + "status": "retry", + "created": "2024-02-20T22:53:00.727Z", + "address1": "9876 Million Dollar St", + "address2": "Unit 123", + "city": "Des Moines", + "state": "IA", + "postalCode": "50265", + "phone": "5555555555", + "businessName": "Jane Corp", + "doingBusinessAs": "This is the DBA name", + "website": "https://www.dwolla.com", + "correlationId": "CID-bc3b6cd8-fca0-471d-b6f2-4b10abb20956", + "controller": { + "firstName": "Jane", + "lastName": "Doe", + "title": "CEO", + "address": { + "address1": "1749 18th st", + "address2": "apt 12", + "address3": "Ste 123", + "city": "Des Moines", + "stateProvinceRegion": "IA", + "country": "US", + "postalCode": "50266" + } + }, + "businessType": "llc", + "businessClassification": "9ed38155-7d6f-11e3-83c3-5404a6144203" +} +``` + +### Sole Proprietorship (`retry-verification`) - Request and response ```bash POST https://api-sandbox.dwolla.com/customers/62c3aa1b-3a1b-46d0-ae90-17304d60c3d5 @@ -174,7 +254,121 @@ dwolla.post(customerUrl, requestBody).then(function (res) { }); ``` -### Business with Controller - Request and response +### Business with Controller (`retry-verification`) - Request and response + +```bash +POST https://api-sandbox.dwolla.com/customers/62c3aa1b-3a1b-46d0-ae90-17304d60c3d5 +Content-Type: application/vnd.dwolla.v1.hal+json +Accept: application/vnd.dwolla.v1.hal+json +Authorization: Bearer 0Sn0W6kzNic+oWhDbQcVSKLRUpGjIdl/YyrHqrDDoRnQwE7Q + +{ + "firstName": "Jane", + "lastName": "Merchant", + "email": "accountAdmin@email.com", + "ipAddress": "143.156.7.8", + "type": "business", + "address1": "123 Corrected Address St", + "city": "Some City", + "state": "NY", + "postalCode": "11101", + "businessClassification": "9ed3f670-7d6f-11e3-b1ce-5404a6144203", + "businessType": "llc", + "businessName":"Jane Corp", + "ein":"00-0000000" +} +``` + +```php +updateCustomer([ + 'firstName' => 'Jane', + 'lastName' => 'Merchant', + 'email' => 'accountAdmin@email.com', + 'type' => 'business', + 'address1' => '123 Corrected Address St', + 'city' => 'Some City', + 'state' => 'NY', + 'postalCode' => '11101', + 'phone' => '5554321234', + 'businessClassification' => '9ed3f670-7d6f-11e3-b1ce-5404a6144203', + 'businessType' => 'llc', + 'businessName' => 'Jane Corp', + 'ein' => '00-0000000'], $customerUrl); + +?> +``` + +```ruby +# Using DwollaV2 - https://github.com/Dwolla/dwolla-v2-ruby (Recommended) +customer_url = 'https://api.dwolla.com/customers/62c3aa1b-3a1b-46d0-ae90-17304d60c3d5' +request_body = { + :firstName => 'Jane', + :lastName => 'Merchant', + :email => 'accountAdmin@email.com', + :type => 'business', + :address1 => '123 Corrected Address St', + :city => 'Some City', + :state => 'NY', + :postalCode => '11101', + :businessClassification => '9ed38155-7d6f-11e3-83c3-5404a6144203', + :businessType => 'llc', + :businessName => 'Jane Corp', + :ein => '12-3456789' +} + +customer = app_token.post customer_url, request_body +customer.id # => "62c3aa1b-3a1b-46d0-ae90-17304d60c3d5" +``` + +```python +# Using dwollav2 - https://github.com/Dwolla/dwolla-v2-python (Recommended) +customer_url = 'https://api.dwolla.com/customers/62c3aa1b-3a1b-46d0-ae90-17304d60c3d5' +request_body = { + 'firstName': 'Jane', + 'lastName': 'Merchant', + 'email': 'accountAdmin@email.com', + 'type': 'business', + 'address1': '123 Corrected Address St', + 'city': 'Some City', + 'state': 'NY', + 'postalCode': '11101', + 'businessClassification': '9ed38155-7d6f-11e3-83c3-5404a6144203', + 'businessType': 'llc', + 'businessName': 'Jane Corp', + 'ein': '12-3456789' +} + +customer = app_token.post(customer_url, request_body) +customer.body.id # => '62c3aa1b-3a1b-46d0-ae90-17304d60c3d5' +``` + +```javascript +var customerUrl = + "https://api.dwolla.com/customers/62c3aa1b-3a1b-46d0-ae90-17304d60c3d5"; +var requestBody = { + firstName: "Jane", + lastName: "Merchant", + email: "accountAdmin@email.com", + type: "business", + address1: "123 Corrected Address St", + city: "Some City", + state: "NY", + postalCode: "11101", + businessClassification: "9ed38155-7d6f-11e3-83c3-5404a6144203", + businessType: "llc", + businessName: "Jane Corp", + ein: "12-3456789", +}; + +dwolla.post(customerUrl, requestBody).then(function (res) { + res.body.id; // => '62c3aa1b-3a1b-46d0-ae90-17304d60c3d5' +}); +``` + +### Business with Controller (`retry-with-full-ssn`) - Request and response ```bash POST https://api-sandbox.dwolla.com/customers/62c3aa1b-3a1b-46d0-ae90-17304d60c3d5 diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 29a0051b..4a13c44d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,9 +1,5 @@ lockfileVersion: '6.0' -settings: - autoInstallPeers: true - excludeLinksFromLockfile: false - dependencies: '@babel/core': specifier: ^7.21.8 @@ -70,7 +66,7 @@ dependencies: version: 4.17.0 autoprefixer: specifier: ^10.4.14 - version: 10.4.14(postcss@8.4.23) + version: 10.4.14 babel-loader: specifier: ^9.1.2 version: 9.1.2(@babel/core@7.21.8)(webpack@5.82.1) @@ -100,7 +96,7 @@ dependencies: version: 3.0.0 iframe-resizer-react: specifier: ^1.1.0 - version: 1.1.0(prop-types@15.8.1)(react-dom@18.2.0)(react@18.2.0) + version: 1.1.0(react-dom@18.2.0)(react@18.2.0) lodash.groupby: specifier: ^4.6.0 version: 4.6.0 @@ -130,7 +126,7 @@ dependencies: version: 1.0.3 postcss-flexbugs-fixes: specifier: ^5.0.2 - version: 5.0.2(postcss@8.4.23) + version: 5.0.2 react: specifier: ^18.2.0 version: 18.2.0 @@ -174,10 +170,10 @@ dependencies: devDependencies: '@algolia/autocomplete-js': specifier: ^1.9.2 - version: 1.9.2(@algolia/client-search@4.17.0)(algoliasearch@4.17.0)(search-insights@2.7.0) + version: 1.9.2(algoliasearch@4.17.0) '@storybook/nextjs': specifier: ^7.0.10 - version: 7.0.10(@babel/core@7.21.8)(esbuild@0.17.18)(next@12.3.4)(react-dom@18.2.0)(react@18.2.0)(typescript@5.0.4)(webpack@5.82.1) + version: 7.0.10(@babel/core@7.21.8)(next@12.3.4)(react-dom@18.2.0)(react@18.2.0)(typescript@5.0.4)(webpack@5.82.1) '@svgr/webpack': specifier: ^7.0.0 version: 7.0.0 @@ -282,7 +278,7 @@ devDependencies: version: 4.1.1(webpack@5.82.1) webpack: specifier: ^5.82.1 - version: 5.82.1(esbuild@0.17.18) + version: 5.82.1 packages: @@ -290,27 +286,26 @@ packages: resolution: {integrity: sha512-E09FiIft46CmH5Qnjb0wsW54/YQd69LsxeKUOWawmws1XWvyFGURnAChH0mlr7YPFR1ofwvUQfcL0J3lMxXqPA==} dev: true - /@algolia/autocomplete-core@1.9.2(@algolia/client-search@4.17.0)(algoliasearch@4.17.0)(search-insights@2.7.0): + /@algolia/autocomplete-core@1.9.2(algoliasearch@4.17.0): resolution: {integrity: sha512-hkG80c9kx9ClVAEcUJbTd2ziVC713x9Bji9Ty4XJfKXlxlsx3iXsoNhAwfeR4ulzIUg7OE5gez0UU1zVDdG7kg==} dependencies: - '@algolia/autocomplete-plugin-algolia-insights': 1.9.2(@algolia/client-search@4.17.0)(algoliasearch@4.17.0)(search-insights@2.7.0) - '@algolia/autocomplete-shared': 1.9.2(@algolia/client-search@4.17.0)(algoliasearch@4.17.0) + '@algolia/autocomplete-plugin-algolia-insights': 1.9.2(algoliasearch@4.17.0) + '@algolia/autocomplete-shared': 1.9.2(algoliasearch@4.17.0) transitivePeerDependencies: - '@algolia/client-search' - algoliasearch - search-insights dev: true - /@algolia/autocomplete-js@1.9.2(@algolia/client-search@4.17.0)(algoliasearch@4.17.0)(search-insights@2.7.0): + /@algolia/autocomplete-js@1.9.2(algoliasearch@4.17.0): resolution: {integrity: sha512-qaYzP0DNZsratnu18umlQVW++8uI8irpadk/e2cCOhM5Qvsyw9y338lkTd4AkxOPYf9EhTVgDNq0rQ+dNDtDgQ==} peerDependencies: '@algolia/client-search': '>= 4.5.1 < 6' algoliasearch: '>= 4.9.1 < 6' dependencies: - '@algolia/autocomplete-core': 1.9.2(@algolia/client-search@4.17.0)(algoliasearch@4.17.0)(search-insights@2.7.0) - '@algolia/autocomplete-preset-algolia': 1.9.2(@algolia/client-search@4.17.0)(algoliasearch@4.17.0) - '@algolia/autocomplete-shared': 1.9.2(@algolia/client-search@4.17.0)(algoliasearch@4.17.0) - '@algolia/client-search': 4.17.0 + '@algolia/autocomplete-core': 1.9.2(algoliasearch@4.17.0) + '@algolia/autocomplete-preset-algolia': 1.9.2(algoliasearch@4.17.0) + '@algolia/autocomplete-shared': 1.9.2(algoliasearch@4.17.0) algoliasearch: 4.17.0 htm: 3.1.1 preact: 10.13.2 @@ -318,36 +313,33 @@ packages: - search-insights dev: true - /@algolia/autocomplete-plugin-algolia-insights@1.9.2(@algolia/client-search@4.17.0)(algoliasearch@4.17.0)(search-insights@2.7.0): + /@algolia/autocomplete-plugin-algolia-insights@1.9.2(algoliasearch@4.17.0): resolution: {integrity: sha512-2LVsf4W66hVHQ3Ua/8k15oPlxjELCztbAkQm/hP42Sw+GLkHAdY1vaVRYziaWq64+Oljfg6FKkZHCdgXH+CGIA==} peerDependencies: search-insights: '>= 1 < 3' dependencies: - '@algolia/autocomplete-shared': 1.9.2(@algolia/client-search@4.17.0)(algoliasearch@4.17.0) - search-insights: 2.7.0 + '@algolia/autocomplete-shared': 1.9.2(algoliasearch@4.17.0) transitivePeerDependencies: - '@algolia/client-search' - algoliasearch dev: true - /@algolia/autocomplete-preset-algolia@1.9.2(@algolia/client-search@4.17.0)(algoliasearch@4.17.0): + /@algolia/autocomplete-preset-algolia@1.9.2(algoliasearch@4.17.0): resolution: {integrity: sha512-pqgIm2GNqtCT59Y1ICctIPrYTi34+wNPiNWEclD/yDzp5uDUUsyGe5XrUjCNyQRTKonAlmYxoaEHOn8FWgmBHA==} peerDependencies: '@algolia/client-search': '>= 4.9.1 < 6' algoliasearch: '>= 4.9.1 < 6' dependencies: - '@algolia/autocomplete-shared': 1.9.2(@algolia/client-search@4.17.0)(algoliasearch@4.17.0) - '@algolia/client-search': 4.17.0 + '@algolia/autocomplete-shared': 1.9.2(algoliasearch@4.17.0) algoliasearch: 4.17.0 dev: true - /@algolia/autocomplete-shared@1.9.2(@algolia/client-search@4.17.0)(algoliasearch@4.17.0): + /@algolia/autocomplete-shared@1.9.2(algoliasearch@4.17.0): resolution: {integrity: sha512-XxX6YDn+7LG+SmdpXEOnj7fc3TjiVpQ0CbGhjLwrd2tYr6LVY2D4Iiu/iuYJ4shvVDWWnpwArSk0uIWC/8OPUA==} peerDependencies: '@algolia/client-search': '>= 4.9.1 < 6' algoliasearch: '>= 4.9.1 < 6' dependencies: - '@algolia/client-search': 4.17.0 algoliasearch: 4.17.0 dev: true @@ -2866,7 +2858,7 @@ packages: react-refresh: 0.11.0 schema-utils: 3.1.2 source-map: 0.7.4 - webpack: 5.82.1(esbuild@0.17.18) + webpack: 5.82.1 dev: true /@popperjs/core@2.11.8: @@ -3035,7 +3027,7 @@ packages: - supports-color dev: false - /@storybook/builder-webpack5@7.0.10(esbuild@0.17.18)(react-dom@18.2.0)(react@18.2.0)(typescript@5.0.4): + /@storybook/builder-webpack5@7.0.10(react-dom@18.2.0)(react@18.2.0)(typescript@5.0.4): resolution: {integrity: sha512-uZ1fiBYD7wZEpg4zUYo9Y1fk7eHtuNp2guXCgQIKWE0ZLoSYzNMNhkHTYfmUp7yJEDQJ+McHiGXNTU+Z/cs0XQ==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 @@ -3082,12 +3074,12 @@ packages: react-dom: 18.2.0(react@18.2.0) semver: 7.5.0 style-loader: 3.3.2(webpack@5.82.1) - terser-webpack-plugin: 5.3.8(esbuild@0.17.18)(webpack@5.82.1) + terser-webpack-plugin: 5.3.8(webpack@5.82.1) ts-dedent: 2.2.0 typescript: 5.0.4 util: 0.12.5 util-deprecate: 1.0.2 - webpack: 5.82.1(esbuild@0.17.18) + webpack: 5.82.1 webpack-dev-middleware: 5.3.3(webpack@5.82.1) webpack-hot-middleware: 2.25.3 webpack-virtual-modules: 0.4.6 @@ -3393,7 +3385,7 @@ packages: resolution: {integrity: sha512-cFMOOXmcRx1tN50TqC2huOsF91fAvNM82wTDnAbT2FtA+ZHFHNyE1PgWgiKDDepzOpKaG+FfT4bJcQAaAfYOBg==} dev: false - /@storybook/nextjs@7.0.10(@babel/core@7.21.8)(esbuild@0.17.18)(next@12.3.4)(react-dom@18.2.0)(react@18.2.0)(typescript@5.0.4)(webpack@5.82.1): + /@storybook/nextjs@7.0.10(@babel/core@7.21.8)(next@12.3.4)(react-dom@18.2.0)(react@18.2.0)(typescript@5.0.4)(webpack@5.82.1): resolution: {integrity: sha512-9sajlA95fidPZMy5sYnu4n+/RiZ9+qiV2LJImFqQNKtvq0HL+6EsyNPaPOvaJx5dsa2QzQJo5MiZ8HX825cmAQ==} engines: {node: '>=16.0.0'} peerDependencies: @@ -3430,10 +3422,10 @@ packages: '@babel/preset-typescript': 7.21.5(@babel/core@7.21.8) '@babel/runtime': 7.21.5 '@storybook/addon-actions': 7.0.10(react-dom@18.2.0)(react@18.2.0) - '@storybook/builder-webpack5': 7.0.10(esbuild@0.17.18)(react-dom@18.2.0)(react@18.2.0)(typescript@5.0.4) + '@storybook/builder-webpack5': 7.0.10(react-dom@18.2.0)(react@18.2.0)(typescript@5.0.4) '@storybook/core-common': 7.0.10 '@storybook/node-logger': 7.0.10 - '@storybook/preset-react-webpack': 7.0.10(@babel/core@7.21.8)(esbuild@0.17.18)(react-dom@18.2.0)(react@18.2.0)(typescript@5.0.4) + '@storybook/preset-react-webpack': 7.0.10(@babel/core@7.21.8)(react-dom@18.2.0)(react@18.2.0)(typescript@5.0.4) '@storybook/preview-api': 7.0.10 '@storybook/react': 7.0.10(react-dom@18.2.0)(react@18.2.0)(typescript@5.0.4) '@types/node': 16.18.28 @@ -3457,7 +3449,7 @@ packages: tsconfig-paths: 4.2.0 tsconfig-paths-webpack-plugin: 3.5.2 typescript: 5.0.4 - webpack: 5.82.1(esbuild@0.17.18) + webpack: 5.82.1 transitivePeerDependencies: - '@swc/core' - '@types/webpack' @@ -3496,7 +3488,7 @@ packages: npmlog: 5.0.1 pretty-hrtime: 1.0.3 - /@storybook/preset-react-webpack@7.0.10(@babel/core@7.21.8)(esbuild@0.17.18)(react-dom@18.2.0)(react@18.2.0)(typescript@5.0.4): + /@storybook/preset-react-webpack@7.0.10(@babel/core@7.21.8)(react-dom@18.2.0)(react@18.2.0)(typescript@5.0.4): resolution: {integrity: sha512-IcjnCeZWm0CZ+FXB9RriRmhMU2eMS/9CWF7HzJ5TuM9xXpH7Tz9kf5ANxnGcl7lrfT+PZE+BiD9Kyt7OpfGXUg==} engines: {node: '>=16.0.0'} peerDependencies: @@ -3529,7 +3521,7 @@ packages: react-refresh: 0.11.0 semver: 7.5.0 typescript: 5.0.4 - webpack: 5.82.1(esbuild@0.17.18) + webpack: 5.82.1 transitivePeerDependencies: - '@swc/core' - '@types/webpack' @@ -3581,7 +3573,7 @@ packages: react-docgen-typescript: 2.2.2(typescript@5.0.4) tslib: 2.5.0 typescript: 5.0.4 - webpack: 5.82.1(esbuild@0.17.18) + webpack: 5.82.1 transitivePeerDependencies: - supports-color dev: true @@ -4557,10 +4549,8 @@ packages: clean-stack: 2.2.0 indent-string: 4.0.0 - /ajv-formats@2.1.1(ajv@8.12.0): + /ajv-formats@2.1.1: resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} - peerDependencies: - ajv: ^8.0.0 peerDependenciesMeta: ajv: optional: true @@ -4807,7 +4797,7 @@ packages: /asynckit@0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} - /autoprefixer@10.4.14(postcss@8.4.23): + /autoprefixer@10.4.14: resolution: {integrity: sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ==} engines: {node: ^10 || ^12 || >=14} hasBin: true @@ -4815,11 +4805,10 @@ packages: postcss: ^8.1.0 dependencies: browserslist: 4.21.5 - caniuse-lite: 1.0.30001486 + caniuse-lite: 1.0.30001588 fraction.js: 4.2.0 normalize-range: 0.1.2 picocolors: 1.0.0 - postcss: 8.4.23 postcss-value-parser: 4.2.0 dev: false @@ -4874,7 +4863,7 @@ packages: '@babel/core': 7.21.8 find-cache-dir: 3.3.2 schema-utils: 4.0.1 - webpack: 5.82.1(esbuild@0.17.18) + webpack: 5.82.1 /babel-plugin-add-react-displayname@0.0.5: resolution: {integrity: sha512-LY3+Y0XVDYcShHHorshrDbt4KFWL4bSeniCtl4SYZbask+Syngk1uMPCeN9+nSiZo6zX5s0RTq/J9Pnaaf/KHw==} @@ -5159,7 +5148,7 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true dependencies: - caniuse-lite: 1.0.30001486 + caniuse-lite: 1.0.30001588 electron-to-chromium: 1.4.389 node-releases: 2.0.10 update-browserslist-db: 1.0.11(browserslist@4.21.5) @@ -5246,8 +5235,8 @@ packages: resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} engines: {node: '>=10'} - /caniuse-lite@1.0.30001486: - resolution: {integrity: sha512-uv7/gXuHi10Whlj0pp5q/tsK/32J2QSqVRKQhs2j8VsDCjgyruAh/eEXHF822VqO9yT6iZKw3nRwZRSPBE9OQg==} + /caniuse-lite@1.0.30001588: + resolution: {integrity: sha512-+hVY9jE44uKLkH0SrUTqxjxqNTOWHsbnQDIKjwkZ3lNTzUUVdBLBGXtj/q5Mp5u98r3droaZAewQuEDzjQdZlQ==} /case-sensitive-paths-webpack-plugin@2.4.0: resolution: {integrity: sha512-roIFONhcxog0JSSWbvVAh3OocukmSgpqOH6YpMkCvav/ySIV3JKg4Dc8vYtQjYi/UxpNE36r/9v+VqTQqgkYmw==} @@ -5315,7 +5304,7 @@ packages: normalize-path: 3.0.0 readdirp: 3.6.0 optionalDependencies: - fsevents: 2.3.2 + fsevents: 2.3.3 dev: true /chownr@1.1.4: @@ -5646,7 +5635,7 @@ packages: postcss-value-parser: 4.2.0 schema-utils: 2.7.1 semver: 6.3.0 - webpack: 5.82.1(esbuild@0.17.18) + webpack: 5.82.1 dev: false /css-loader@6.7.3(webpack@5.82.1): @@ -5663,7 +5652,7 @@ packages: postcss-modules-values: 4.0.0(postcss@8.4.23) postcss-value-parser: 4.2.0 semver: 7.5.0 - webpack: 5.82.1(esbuild@0.17.18) + webpack: 5.82.1 dev: true /css-select@4.3.0: @@ -6783,7 +6772,7 @@ packages: dependencies: loader-utils: 1.4.2 schema-utils: 2.7.1 - webpack: 5.82.1(esbuild@0.17.18) + webpack: 5.82.1 dev: false /file-system-cache@2.1.1: @@ -6914,7 +6903,7 @@ packages: semver: 7.5.0 tapable: 2.2.1 typescript: 5.0.4 - webpack: 5.82.1(esbuild@0.17.18) + webpack: 5.82.1 dev: true /form-data@3.0.1: @@ -6982,8 +6971,8 @@ packages: /fs.realpath@1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - /fsevents@2.3.2: - resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} + /fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] requiresBuild: true @@ -7397,7 +7386,7 @@ packages: lodash: 4.17.21 pretty-error: 4.0.0 tapable: 2.2.1 - webpack: 5.82.1(esbuild@0.17.18) + webpack: 5.82.1 dev: true /htmlparser2@6.1.0: @@ -7504,7 +7493,7 @@ packages: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} dev: false - /iframe-resizer-react@1.1.0(prop-types@15.8.1)(react-dom@18.2.0)(react@18.2.0): + /iframe-resizer-react@1.1.0(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-FrytSq91AIJaDgE+6uK/Vdd6IR8CrwLoZ6eGmL2qQMPTzF0xlSV2jaSzRRUh5V2fttD7vzl21jvBl97bV40eBw==} engines: {node: '>=8', npm: '>=5'} peerDependencies: @@ -7513,7 +7502,6 @@ packages: react-dom: '>=16.8.0' dependencies: iframe-resizer: 4.3.6 - prop-types: 15.8.1 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) warning: 4.0.3 @@ -8147,7 +8135,7 @@ packages: micromatch: 4.0.5 walker: 1.0.8 optionalDependencies: - fsevents: 2.3.2 + fsevents: 2.3.3 dev: true /jest-leak-detector@29.5.0: @@ -9064,7 +9052,7 @@ packages: dependencies: '@next/env': 12.3.4 '@swc/helpers': 0.4.11 - caniuse-lite: 1.0.30001486 + caniuse-lite: 1.0.30001588 postcss: 8.4.14 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) @@ -9541,12 +9529,10 @@ packages: deprecated: You can find the new Popper v2 at @popperjs/core, this package is dedicated to the legacy v1 dev: false - /postcss-flexbugs-fixes@5.0.2(postcss@8.4.23): + /postcss-flexbugs-fixes@5.0.2: resolution: {integrity: sha512-18f9voByak7bTktR2QgDveglpn9DTbBWPUzSOe9g0N4WR/2eSt6Vrcbf0hmspvMI6YWGywz6B9f7jzpFNJJgnQ==} peerDependencies: postcss: ^8.1.4 - dependencies: - postcss: 8.4.23 dev: false /postcss-loader@4.3.0(postcss@7.0.39)(webpack@5.82.1): @@ -9562,7 +9548,7 @@ packages: postcss: 7.0.39 schema-utils: 3.1.2 semver: 7.5.0 - webpack: 5.82.1(esbuild@0.17.18) + webpack: 5.82.1 dev: false /postcss-loader@7.3.0(postcss@8.4.23)(webpack@5.82.1): @@ -9577,7 +9563,7 @@ packages: klona: 2.0.6 postcss: 8.4.23 semver: 7.5.0 - webpack: 5.82.1(esbuild@0.17.18) + webpack: 5.82.1 dev: true /postcss-modules-extract-imports@2.0.0: @@ -9686,6 +9672,7 @@ packages: nanoid: 3.3.6 picocolors: 1.0.0 source-map-js: 1.0.2 + dev: true /preact@10.13.2: resolution: {integrity: sha512-q44QFLhOhty2Bd0Y46fnYW0gD/cbVM9dUVtNTDKPcdXSMA7jfY+Jpd6rk3GB0lcQss0z5s/6CmVP0Z/hV+g6pw==} @@ -10426,7 +10413,7 @@ packages: dependencies: klona: 2.0.6 neo-async: 2.6.2 - webpack: 5.82.1(esbuild@0.17.18) + webpack: 5.82.1 dev: true /saxes@6.0.0: @@ -10464,7 +10451,7 @@ packages: dependencies: '@types/json-schema': 7.0.11 ajv: 8.12.0 - ajv-formats: 2.1.1(ajv@8.12.0) + ajv-formats: 2.1.1 ajv-keywords: 5.1.0(ajv@8.12.0) /scroll-to-element@2.0.3: @@ -10473,11 +10460,6 @@ packages: raf: 3.4.1 dev: false - /search-insights@2.7.0: - resolution: {integrity: sha512-GLbVaGgzYEKMvuJbHRhLi1qoBFnjXZGZ6l4LxOYPCp4lI2jDRB3jPU9/XNhMwv6kvnA9slTreq6pvK+b3o3aqg==} - engines: {node: '>=8.16.0'} - dev: true - /section-matter@1.0.0: resolution: {integrity: sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==} engines: {node: '>=4'} @@ -10890,7 +10872,7 @@ packages: dependencies: loader-utils: 2.0.4 schema-utils: 2.7.1 - webpack: 5.82.1(esbuild@0.17.18) + webpack: 5.82.1 dev: false /style-loader@3.3.2(webpack@5.82.1): @@ -10899,7 +10881,7 @@ packages: peerDependencies: webpack: ^5.0.0 dependencies: - webpack: 5.82.1(esbuild@0.17.18) + webpack: 5.82.1 dev: true /style-to-object@0.3.0: @@ -11065,7 +11047,7 @@ packages: unique-string: 2.0.0 dev: false - /terser-webpack-plugin@5.3.8(esbuild@0.17.18)(webpack@5.82.1): + /terser-webpack-plugin@5.3.8(webpack@5.82.1): resolution: {integrity: sha512-WiHL3ElchZMsK27P8uIUh4604IgJyAW47LVXGbEoB21DbQcZ+OuMpGjVYnEUaqcWM6dO8uS2qUbA7LSCWqvsbg==} engines: {node: '>= 10.13.0'} peerDependencies: @@ -11082,12 +11064,11 @@ packages: optional: true dependencies: '@jridgewell/trace-mapping': 0.3.18 - esbuild: 0.17.18 jest-worker: 27.5.1 schema-utils: 3.1.2 serialize-javascript: 6.0.1 terser: 5.17.3 - webpack: 5.82.1(esbuild@0.17.18) + webpack: 5.82.1 /terser@5.17.3: resolution: {integrity: sha512-AudpAZKmZHkG9jueayypz4duuCFJMMNGRMwaPvQKWfxKedh8Z2x3OCoDqIIi1xx5+iwx1u6Au8XQcc9Lke65Yg==} @@ -11474,7 +11455,7 @@ packages: loader-utils: 1.4.2 mime: 2.6.0 schema-utils: 2.7.1 - webpack: 5.82.1(esbuild@0.17.18) + webpack: 5.82.1 dev: false /url-loader@4.1.1(webpack@5.82.1): @@ -11490,7 +11471,7 @@ packages: loader-utils: 2.0.4 mime-types: 2.1.35 schema-utils: 3.1.2 - webpack: 5.82.1(esbuild@0.17.18) + webpack: 5.82.1 dev: true /url-parse@1.5.10: @@ -11644,7 +11625,7 @@ packages: mime-types: 2.1.35 range-parser: 1.2.1 schema-utils: 4.0.1 - webpack: 5.82.1(esbuild@0.17.18) + webpack: 5.82.1 dev: true /webpack-hot-middleware@2.25.3: @@ -11663,7 +11644,7 @@ packages: resolution: {integrity: sha512-5tyDlKLqPfMqjT3Q9TAqf2YqjwmnUleZwzJi1A5qXnlBCdj2AtOJ6wAWdglTIDOPgOiOrXeBeFcsQ8+aGQ6QbA==} dev: true - /webpack@5.82.1(esbuild@0.17.18): + /webpack@5.82.1: resolution: {integrity: sha512-C6uiGQJ+Gt4RyHXXYt+v9f+SN1v83x68URwgxNQ98cvH8kxiuywWGP4XeNZ1paOzZ63aY3cTciCEQJNFUljlLw==} engines: {node: '>=10.13.0'} hasBin: true @@ -11694,7 +11675,7 @@ packages: neo-async: 2.6.2 schema-utils: 3.1.2 tapable: 2.2.1 - terser-webpack-plugin: 5.3.8(esbuild@0.17.18)(webpack@5.82.1) + terser-webpack-plugin: 5.3.8(webpack@5.82.1) watchpack: 2.4.0 webpack-sources: 3.2.3 transitivePeerDependencies: @@ -11974,3 +11955,7 @@ packages: transitivePeerDependencies: - supports-color dev: false + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false From d828b47b23ccbf7ec3c83ff5c7b2e23715fa31ed Mon Sep 17 00:00:00 2001 From: Shreya Thapa Date: Wed, 21 Feb 2024 16:59:51 -0500 Subject: [PATCH 2/2] Applied suggestions after review + update testing documentation --- .../handle-verification-statuses.mdx | 19 +++++++++---- pages/docs/balance/testing/customers.mdx | 28 ++++++++++++++++--- 2 files changed, 37 insertions(+), 10 deletions(-) diff --git a/pages/docs/balance/business-verified-customer/handle-verification-statuses.mdx b/pages/docs/balance/business-verified-customer/handle-verification-statuses.mdx index 78663360..9b488130 100755 --- a/pages/docs/balance/business-verified-customer/handle-verification-statuses.mdx +++ b/pages/docs/balance/business-verified-customer/handle-verification-statuses.mdx @@ -36,18 +36,25 @@ As a developer, you will want to handle the various Customer statuses that can b ## Handling `retry` status -A `retry` status occurs when a Customer’s identity scores are too low during the initial verification attempt. The Customer will have one more opportunity to correct any mistakes. +A `retry` status occurs when a Customer’s identity scores are too low during a verification attempt. Typically, a `retry` status occurs after the initial creation of a business-verified customer, however, a customer can also be placed into a retry status via the Dwolla Dashboard if the customer is in a `document` status. When the customer is in the `retry` status, your application needs to re-initiate the verification process by prompting the user via a form to resubmit their identifying information. You need to gather new information if the Customer is placed into the{" "} - retry - status; simply passing the same information will result in the same insufficient - scores. + retry status; simply passing the same information will result in + the same insufficient scores. -### Determining retry verification needed +### Determining information needed to retry verification -When a business verified Customer is placed in the `retry` verification status, Dwolla will return a link in the API response after [retrieving a Customer](https://developers.dwolla.com/docs/balance/api-reference/customers/retrieve), which will be used by an application to determine if retry is needed. For business verified Customers with Controllers, different links can be returned depending on whether retry is needed for just the business, or both the Controller and business. If the Controller information needs to be retried, all fields that were required in the initial Customer creation attempt will be required in the retry attempt, along with the full 9-digit SSN of the Controller in order to give our identity vendor more information in an attempt to receive a sufficient score to approve the Customer account ([see example request below](#business-with-controller-retry-with-full-ssn---request-and-response)). Additionally, `_embedded` errors are included in the Customer resource which include information about the next steps required to get the Customer verified (see example response below). Refer to the table below for the list of possible links and their descriptions. +When a business verified Customer is placed in the `retry` verification status, Dwolla will return a link in the API response after [retrieving a Customer](https://developers.dwolla.com/docs/balance/api-reference/customers/retrieve). The retry link contained within the `_links` object of the response helps your application determine if a retry is needed and what type of retry is required. What data you need to request from the customer depends on the retry scenario: + +- **Business-only retry**: A `retry-verification` link is returned. Include all fields required during initial customer but **omit** Controller information. For business verified Customers with Controllers, different links can be returned depending on whether retry is needed for just the business, or both the Controller and business. + +- **Controller and business retry**: A `retry-with-full-ssn` link is returned. If the Controller information needs to be retried, all fields that were required in the initial Customer creation attempt will be required in the retry attempt, along with **the full 9-digit SSN** of the Controller in order to give our identity vendor more information in an attempt to receive a sufficient score to approve the Customer account ([see example request below](#business-with-controller-retry-with-full-ssn---request-and-response)). + +#### Understanding \_embedded errors + +Additionally, `_embedded` errors are included in the Customer resource which include information about the next steps required to get the Customer verified (see example response below). Refer to the table below for the list of possible links and their descriptions. | Link name | Description | | ------------------- | ------------------------------------------------------------------------------- | diff --git a/pages/docs/balance/testing/customers.mdx b/pages/docs/balance/testing/customers.mdx index cf982259..3ccf98ff 100644 --- a/pages/docs/balance/testing/customers.mdx +++ b/pages/docs/balance/testing/customers.mdx @@ -31,12 +31,32 @@ There are various reasons a [Verified Customer](/concepts/customer-types#verifie In production, Dwolla will place the Verified Customer in either the `retry`, `kba`, `document`, `verified`, or `suspended` state of verification after an initial identity verification check. -**For personal Verified Customers**, reference the guide on [customer verification](/guides/personal-verified-customer/handle-verification-statuses) for more information on handling identity verification for Verified Customers. To simulate the various statuses in the Sandbox, submit either `verified`, `retry`, `kba`, `document`, or `suspended` in the **firstName** parameter in order to [create a new Verified Customer](https://developers.dwolla.com/api-reference/customers/create#verified-personal-customer---request-parameters) with that status. +**For personal Verified Customers**: Reference the guide on [customer verification](https://developers.dwolla.com/docs/balance/personal-verified-customer) for more information on handling identity verification for Verified Customers. To simulate the various statuses in the Sandbox, supply either `verified`, `retry`, `kba`, `document`, or `suspended` in the **firstName** parameter in order to [create a new Verified Customer](https://developers.dwolla.com/docs/balance/api-reference/customers/create#verified-personal-customer---request-parameters) with that status. -**For business Verified Customers**, reference the guide on [customer verification](/guides/business-verified-customer/create-a-customer) that goes over information on properly verifying a business's Controller, the business and associated Beneficial Owners. To simulate the various statuses in the Sandbox, submit either `verified`, `retry`, or `suspended` in the **controller firstName** parameter in order to [create a new Verified Customer](https://developers.dwolla.com/api-reference/customers/create#verified-business-customer-businesstypellc-corporation-or-partnership---request-parameters) with that status. To simulate different verification status for Beneficial Owners, submit either `incomplete` or `document` in the **beneficial owner firstName** parameter. +**For business Verified Customers**: Reference the guide on [customer verification](https://developers.dwolla.com/docs/balance/business-verified-customer) that goes over information on properly verifying a business's Controller, the business, and associated Beneficial Owners. -With business Verified Customers, documents may be needed for the Controller, the business, or both the Controller and business. To simulate the `document` status for the controller, submit `document` in the **controller firstName** parameter. -Similarly, to simulate the `document` status for the business, submit `document` in the **businessName** parameter. To simulate both the Controller and the business in `document`, submit `document` in both the **controller firstName** and the **businessName** parameters. +Here's how to simulate the different statuses and verification links for business Verified Customers in Sandbox: + +`retry` status: + +- For the business - Supply `retry` in the **businessName** parameter. This action will return a `retry-verification` link in the Customer resource. + +- For both the Controller and business - Supply `retry` in the **controller firstName** parameter. This action will return both a `retry-verification` link and a `retry-with-full-ssn` link in the Customer resource. + +`document` status: + +- For the controller - Supply `document` in the **controller firstName** parameter. This action will return a `verify-with-document` linkin the Customer resource. + +- For the business - Supply `document` in the **businessName** parameter. This action will return a `verify-business-with-document` link in the Customer resource. + +- For both the Controller and the business - Submit `document` in both the **controller firstName** and the **businessName** parameters. This action will return a `verify-controller-and-business-with-document` link in the Customer resource. + +`suspended`: + +- Supply `suspended` in the **controller firstName** parameter to create a new Verified Customer with that status. + +**For beneficial owners**: +To simulate different verification statuses for Beneficial Owners, submit either `incomplete` or `document` in the **beneficial owner firstName** parameter. ### Simulate KBA verified and failed events