Discount code validation
A merchant uses a third-party extension to create and manage discount codes. When a shopper applies a coupon code to their cart, the coupon code must be validated. The Commerce checkout process can continue if the code is valid. Otherwise, the following error message displays on the Payment Method checkout page:
The discount code "<code-value>" is not valid
Webhook name
PaaS only plugin.magento.quote.api.guest_coupon_management.set
SaaS only plugin.quote.api.guest_coupon_management.set
Payloads
Default payload
Configured payload
Copied to your clipboard{"cartId": "string","couponCode": "string"}
Copied to your clipboard{"discountCode": {"cartId": "string","couponCode": "string"}}
Configuration
webhook.xml (PaaS)
Copied to your clipboard<method name="plugin.magento.quote.api.guest_coupon_management.set" type="before"><hooks><batch name="add_coupon"><hook name="validate_discount_code" url="{env:APP_BUILDER_URL}/validate-discount-code" method="POST" timeout="5000" softTimeout="1000" priority="300" required="true" fallbackErrorMessage="The discount code cannot be validated"><headers><header name="x-gw-ims-org-id">{env:APP_BUILDER_IMS_ORG_ID}</header><header name="Authorization">Bearer {env:APP_BUILDER_AUTH_TOKEN}</header></headers><fields><field name="discountCode.cartId" source="cartId" /><field name="discountCode.couponCode" source="couponCode" /></fields></hook></batch></hooks></method>
Admin (SaaS)
Copied to your clipboardHook SettingsWebhook method: plugin.quote.api.guest_coupon_management.setWebhook type: beforeBatch name: add_couponHook name: validate_discount_codeHook priority: 300URL: {env:APP_BUILDER_URL}/validate-discount-codeTimeout: 5000Soft timeout: 1000Fallback Error Message: The discount code cannot be validatedRequired: RequiredActive: YesMethod: POSTDeveloper Console OAuthClient ID: The client ID for the OAuth credential.Client Secret: The client secret for the OAuth credential.Organization ID: The organization ID for the OAuth credential.Hook FieldsName: discountCode.cartIdSource: cartIdActive: YesName: discountCode.couponCodeSource: couponCodeActive: Yesexport const _frontmatter = {}
Copied to your clipboard<method name="plugin.magento.quote.api.guest_coupon_management.set" type="before"><hooks><batch name="add_coupon"><hook name="validate_discount_code" url="{env:APP_BUILDER_URL}/validate-discount-code" method="POST" timeout="5000" softTimeout="1000" priority="300" required="true" fallbackErrorMessage="The discount code cannot be validated"><headers><header name="x-gw-ims-org-id">{env:APP_BUILDER_IMS_ORG_ID}</header><header name="Authorization">Bearer {env:APP_BUILDER_AUTH_TOKEN}</header></headers><fields><field name="discountCode.cartId" source="cartId" /><field name="discountCode.couponCode" source="couponCode" /></fields></hook></batch></hooks></method>
Copied to your clipboardHook SettingsWebhook method: plugin.quote.api.guest_coupon_management.setWebhook type: beforeBatch name: add_couponHook name: validate_discount_codeHook priority: 300URL: {env:APP_BUILDER_URL}/validate-discount-codeTimeout: 5000Soft timeout: 1000Fallback Error Message: The discount code cannot be validatedRequired: RequiredActive: YesMethod: POSTDeveloper Console OAuthClient ID: The client ID for the OAuth credential.Client Secret: The client secret for the OAuth credential.Organization ID: The organization ID for the OAuth credential.Hook FieldsName: discountCode.cartIdSource: cartIdActive: YesName: discountCode.couponCodeSource: couponCodeActive: Yesexport const _frontmatter = {}
Endpoint code example
The following code example shows how to implement the webhook on your custom endpoint.
Copied to your clipboardconst fetch = require('node-fetch')const { Core } = require('@adobe/aio-sdk')const { errorResponse, stringParameters, checkMissingRequestInputs } = require('../utils')// main function that will be executed by Adobe I/O Runtimeasync function main (params) {// create a Loggerconst logger = Core.Logger('main', { level: params.LOG_LEVEL || 'info' })try {// 'info' is the default level if not setlogger.info('Calling the main action')// log parameters, only if params.LOG_LEVEL === 'debug'logger.debug(stringParameters(params))//check for missing request input parameters and headersconst requiredParams = [/* add required params */]const requiredHeaders = ['Authorization']const errorMessage = checkMissingRequestInputs(params, requiredParams, requiredHeaders)if (errorMessage) {// return and log client errorsreturn errorResponse(400, errorMessage, logger)}const discountCode = params.discountCode// Place the real validation (calling 3rd party endpoints) here.// In this example, we check if the coupon code contains the string `test`.// If it does, the request is considered invalid.const response = {statusCode: 200}if (discountCode && discountCode.couponCode.toLowerCase().includes('test')) {response.body = JSON.stringify({op: "exception",message: `App Builder Webhook Response: The discount code "${discountCode.couponCode}" is not valid`})} else {response.body = JSON.stringify({op: "success"})}// log the response status codelogger.info(`${response.statusCode}: successful request`)return response} catch (error) {// log any server errorslogger.error(error)// return with 500return errorResponse(500, 'server error', logger)}}exports.main = main
If validation fails, the runtime AppBuilder action returns an exception message.
Copied to your clipboardresponse.body = JSON.stringify({op: "exception",message: `App Builder Webhook Response: The discount code "${discountCode.couponCode}" is not valid`})