Task: - PRD-618Getting issue details... STATUS
Outline:
We need to make a new shopify plugin for Netcomm. This plugin will be copy of their old plugin. Here are the feature list of old plugins:
eKomi Official Shopify Plugin for NetComm
This plugin will be made with new Shopify Designs (please check eKomi Plugins for reference ) .
Overview:
The plugin will run from the Plugin Dashboard system and serve Shopify as an API.
Research is required to implement the new generation of Shopify plugin which is an Embedded App.
The embedded app is served within the Shopify Admin Dashboard.
The app will provide installation and uninstallation functionality.
The main requirement within the app is to capture Netcomm and or eKomi configuration settings and persist that to a DB.
Affected Resources:
Netcomm and eKomi plugins. Shopify is changing and it will affect our future plugins.
Plugin Dashboard DB schema will be changed and a new table introduced for the plugin config settings.
Plugin Dashboard environment variables will have new variables added to their respective config files: list file changes outside of Plugin. System files.
Timeline:
Order | Title | Link | Start | Finish |
1 | New Shopify Plugin for Widget Installation. | 18/06/2024 | 18/072024 | |
1.1 | Local Dev Setup & Plugin Dashboard Onboarding. | 18/06/2024 | Ongoing | |
1.2 | Shopify Onboarding. | 18/06/2024 | 28/072024 | |
1.3 | Plugin - Coding - Planning & Unassigned time tracking. | 28/06/2024 | 04/072024 | |
1.4 | Plugin - Coding - Installation | 04/072024 | 14/07/2024 | |
1.5 | Plugin - Coding - Uninstallation | 04/072024 | 14/07/2024 | |
1.6 | Plugin - Coding - Configuration - CRUD | 06/07/2024 | 14/07/2024 | |
1.7 | Plugin - Coding - Refactor & Comment & Document | 14/07/2024 | 18/072024 | |
1.8 | Plugin - Coding - FrontEnd design to Polaris | 16/07/2024 | 20/072024 | |
1.9 | Plugin - Coding - Add form to capture widget code to display on their site. | 16/07/2024 | 20/072024 | |
1.10 | Widget Store Front Display Requirements. | 29/07/2024 | 31/07/2024 | |
1.11 | Widget Store Front Display Functionality. | 29/07/2024 | 31/07/2024 |
Process:
Requirement Gathering.
Planning & Design.
Plugin - Coding - Planning & Unassigned time tracking. PRD-644
Implementation.
Dev setup
Local Dev Setup & Plugin Dashboard Onboarding. PRD-642
Shopify setup
Shopify Onboarding. PRD-643
Plugin development
Plugin - Coding - Planning & Unassigned time tracking. PRD-644
Plugin - Coding - Installation. PRD-773
Plugin - Coding - Uninstallation. PRD-774
Plugin - Coding - Configuration - CRUD. PRD-763
Plugin - Coding - Refactor & Comment & Document. PRD-764
Widget Store Front Display Functionality - Identify functionality requirements for displaying Netcomm widget in store front. PRD-855
Widget Store Front Display Functionality - Build functionality in code. PRD-856
Process Breakdown:
Requirement Gathering:
Plugin Dashboard Repo - Local Dev Setup & Research.
Develop overview of system.
Define system purpose.
Shopify Dashboard & Research.
Develop overview of Shopify system.
Define Shopify requirements.
Planning & Design:
The plugin is broken down into components, namely:Plugin Dashboard Repo - Local Dev Setup & Research.
Shopify Dashboard & Research.
DB Schema
Plugin Install - Process:
Plugin Uninstall Process:
Plugin Configuration - eKomi & Netcomm
Widget Token Configuration
Widget Store Front Display Requirements
Widget Store Front Display Functionality
Implementation:
Plugin Dashboard Repo - Local Dev Setup & Research:
Setup environment to develop - environment specifics needed for the repo to work.
RabbitMQ : Add settings.
Docker-Compose file:
rabbitmq: image: rabbitmq:3.8 container_name: plugindashboard_rabbitmq ports: - "5672:5672" - "15672:15672" healthcheck: test: ["CMD", "rabbitmqctl", "status"] interval: 30s restart: unless-stopped volumes: - ../shared-data/rabbitmq:/var/lib/rabbitmq
Docker-Compose and Parameters file need to have the App’s Client Id & Client Secret added.
Both are Hex value strings.Docker-Compose file:
NETCOMM_API_KEY: 2de2b028c0c30db8de8e44c5bacfd5ed NETCOMM_API_SECRET: c3c5932fa8aeb97b80eddf132bc11abf
Parameters file:
netcomm_api_key: '%env(NETCOMM_API_KEY)%' netcomm_api_secret: '%env(NETCOMM_API_SECRET)%'
So based upon our tech stack it seems like we actually just use the PHP library / dependancy to intergrate the app with Shopify.
Composerr.json →
"phpclassic/php-shopify": "~1.0",
https://github.com/phpclassic/php-shopify.git
Shopify Dashboard & Research:
Learn what Shopify requires and how to do development with them.
Shopify PHP - https://github.com/Shopify/shopify-api-php
https://shopify.dev/docs/apps/launch/app-requirements-checklist
https://shopify.dev/docs/api/app-bridgeShopify app authentication and authorization.
https://shopify.dev/docs/apps/build/authentication-authorization
https://shopify.dev/docs/apps/build/authentication-authorization/set-embedded-app-authorization?extension=javascriptAuthentication is the process of verifying the identity of the user or the app. To keep transactions on Shopify’s platform safe and secure, all apps connecting with Shopify APIs must authenticate when making API requests.
Authorization is the process of giving permissions to apps. When an app user installs a Shopify app they authorize the app, enabling the app to acquire an access token. For example, an app might be authorized to access orders and product data in a store.
Outline of the Shopify Auth process:Create a route for starting the OAuth method such as
/installAction
.In this route, the
Shopify\Auth\OAuth::begin
method will be used.The
begin
method returns a URL that will be used for redirecting the user to the Shopify Authentication screen to complete the OAuth process, your app needs to validate the callback request made by Shopify after the merchant authorizes your app to access their store data.To do that, you can call the
Shopify\Auth\OAuth::callbackAction
method in the endpoint defined in theredirectPath
argument of the begin method.
App minimal required permissions:
View personal data:
Store Owner → Name, email address, phone number, physical address.
Minimal use of information from shopify which means we pass certain compliance expectations.{ "storeId": 66872279297, "storeName": "ek-dev-plugins", "storeEmail": "productmanagement@ekomi-group.com", "storeDomain": "ek-dev-plugins.myshopify.com", "storeOwnerName": "eKomi Product", "accountCreated": 0 }
In the Shopify App Dashboard Configuration Settings these must be added for installation and authentication (The callback verification):
App URL
Preferences URL (optional)
Allowed redirection URL(s)
Compliance Webhooks that Shopify requires to be registered.
Every app that's distributed through the Shopify App Store must subscribe to the following compliance webhook topics in the Partner Dashboard:Customer data request endpoint - customers/data_request - Requests to view stored customer data.
Customer data erasure endpoint - customers/redact - Requests to delete customer data.
Shop data erasure endpoint - shop/redact - Requests to delete shop data.
When you receive one of the compliance webhooks, you need to take the following actions:Confirm that you've received the request by responding with a
200
series status code.Complete the action within 30 days of receiving the request. However, if you're unable to comply with a redaction request because you're legally required to retain data, then you shouldn't complete the action.
Security requirements:
Security header to only allow iframes to work in the provided domains.// Setting this directive guarantees that your app can be framed only within the shop admin. header("Content-Security-Policy: frame-ancestors " . $secureShopUrl . " https://admin.shopify.com;");
Shopify - Ngrok.
In the Shopify ecosystem, embedded apps run in an iframe in a production environment. In order to test the functionality of your app within that context in development, you’re going to want to tunnel what you have running locally to an accessible URL.Setup Ngrok for local development with Shopify platform.
Set the Ngrok URL as the URL for your webhook call backs in Shopify Admin.
Customer data request endpoint → https://a80d-41-193-138-209.ngrok-free.app/netcomm/customers/data_request
DB Schema:
Create Table: netcomm_configuration
Advised to have the user_id and other fields as they will probably part of a plan or future relationship.Plugin Install - Process:
Link to Installation Process flow:Install requires registration as an app provider.
Checks by the Shopify shop URL if it exists, if not then proceeds with installation.
"shopUrl": "uextension.myshopify.com",
"secureShopUrl": "https:\\/\\/uextension.myshopify.com",
Authentication process and Token exchange.
Retrieves the hmac & host & timestamp GET variable fields to prepare for authentication.
"hmac": "67265c0683abeab279465c633ccb98ed86bebe456cf396189e6283c61665b78d",
"host": "YWRtaW4uc2hvcGlmeS5jb20vc3RvcmUvdWV4dGVuc2lvbg",
"timestamp": "1720782483"
The app registers within Shopify and Customer’s shop.
Creates the App’s auth package with the new shop URL and a new Auth request.// Shopify Netcomm App ID & Key & URL $appConfig = $this->getNetcommAppConfig($secureShopUrl); // Creates static configuration for Shopify $shopifySdk = ShopifySDK::config($appConfig); // Auth calls static ShopifySDK config set earlier. This should redirect after the auth request is approved. AuthHelper::createAuthRequest(self::APP_SCOPES, $redirectUrl);
The auth request goes to Shopify which verifies and redirects the user to login and then passes the request to the call back callback method which will receive the Access Token and register the necessary webhooks with shopify retrieving a ID for each.
Privilege establishment.
Privileges are requested during authentication the result is a a install modal from Shopify asking user to approve the App’s privilege request.Persists to DB.
Once Install is clicked then the Shopify shop details will be stored in the DB, and the user redirected to the Netcomm & eKomi Configuration Page to complete installation.
After the user has clicked the install button then Shopify sends a request to our callbackAction to register all the webhooks through a Curl request.
Important header information:curl_setopt($ch, CURLOPT_HTTPHEADER, [ 'X-Shopify-Access-Token: ' . $accessToken, 'Accept: application/json', 'Content-Type: application/json' ]);
Plugin Uninstall Process:
Authentication process and Token exchange.
The app un-registers within Shopify and Customer shop.
Deletes from DB.
The same process as the install but in reverse order.
Plugin Configuration - eKomi & Netcomm
Plugin Configuration settings.
Options are provided to be either an eKomi client or Netcomm or both.
eKomi Client settings:
ShopId
Shop Interface Password
Netcomm Client settings:
NetcommId
Configuration outcomes:
Case#1:
Is Netcomm member: Yes
Is eKomi member : No
In that case we show a dedicated widget to client in front-end store, which shows the simple seal.Case#2:
Is Netcomm member: Yes
Is eKomi member : Yes
In that case we just authenticate the credentials and create the widget seal runtime and show the widget to client store successfully.Case#3:
Is Netcomm member: No
Is eKomi member : Yes
In that case we just authenticate the credentials and create the widget seal runtime and show the widget to client store successfully.
Widget Token Configuration:
Only one setting is made available:Widget Token
Widget Store Front Display Requirements:
Widget Store Front Display Functionality:
0 Comments