Skip to content

Latest commit

 

History

History
271 lines (184 loc) · 12.6 KB

File metadata and controls

271 lines (184 loc) · 12.6 KB

Shopify Credit Card Payments App Template - Remix [Javascript]

This is a template for building a Credit Card Payments App using the Remix framework in Javascript. This template includes a rough client for the Payments Apps API, as well as all the necessary routes for a simple Credit Card payments app.

Notes:

  • mTLS configuration is not included in this template. This should be configured in your own infrastructure.
  • Any simulator in this template is not intended for a production payments app. In production, once a payment (or refund, capture, void) session has been started, the provider's processing steps should begin automatically, and should resolve/reject the session when complete.

Quick start

Prerequisites

  1. You must download and install Node.js if you don't already have it.
  2. You must create a Shopify partner account if you don’t have one.
  3. You must create a store for testing if you don't have one, either a development store or a Shopify Plus sandbox store.

App Setup

  1. You must Create an app manually in the Partners Dashboard
  2. Disable embedded in the Partners Dashboard
  3. Create a credit card payments app extension for your app. This doesn't need to be filled in yet.
  4. Replace App Name and API Client ID in the shopify.app.toml
  5. Run yarn shopify app config push to update your config with Shopify.

Setup

If you used the CLI to create the template, you can skip this section.

Using yarn:

yarn install

Using npm:

npm install

Using pnpm:

pnpm install

Local Development

Using yarn:

yarn dev

Using npm:

npm run dev

Using pnpm:

pnpm run dev

Before beginning development, set up your payments app extension. You can define a consitent tunnel for Shopify CLI to use with the --tunnel flag.

Local development is powered by the Shopify CLI. It logs into your partners account, connects to an app, provides environment variables, updates remote config, creates a tunnel and provides commands to generate extensions.

Press P to open a page to install your app.

App Extension

  1. Return to your payments app extension to begin filling it in.
  2. Set the payment and refund session URLs to the url hosted by dev.
  3. Create a version.
  4. Submit your extension for review.
  5. Once approved, release the new version.
  6. Now, you should be able to open the preview and set up your app through the configuration page.

Note: You may have to uninstall and reinstall the app from your store if the configuration page raises an error like "Payments App is not installed on this shop".

Simulating a payment

You can simulate payment success or failure by entering specific values for the first name and last name of the billing address or shipping address during the first steps of the checkout.

first name last name payment result
<any_name> <any_name> ✅ resolved
reject incorrect_number ❌ rejected <reason: INCORRECT_NUMBER>
reject incorrect_cvc ❌ rejected <reason: INCORRECT_CVC>
reject incorrect_zip ❌ rejected <reason: INCORRECT_ZIP>
reject incorrect_address ❌ rejected <reason: INCORRECT_ADDRESS>
reject incorrect_pin ❌ rejected <reason: INCORRECT_PIN>
reject invalid_number ❌ rejected <reason: INVALID_NUMBER>
reject invalid_cvc ❌ rejected <reason: INVALID_CVC>
reject invalid_expiry_date ❌ rejected <reason: INVALID_EXPIRY_DATE>
reject expired_card ❌ rejected <reason: EXPIRED_CARD>
reject card_declined ❌ rejected <reason: CARD_DECLINED>

If you have entered valid credit card information, after clicking Pay now, you should be redirected to the processing page, then your payment should be resolved or rejected depending on the simulation scenario chosen above:

  • Resolved payment should redirect you to the Thank you page.
  • Rejected payment should bring you back to the checkout page with an error message.

Payments processed through this application are visible in the Dashboard (/app/dashboard)

Encryption

Since this is a credit card payments app, it supports encryption. You can uncomment this line, and add your private key to test our included payload decryption.


Authenticating and querying data

To authenticate and query data you can use the shopify const that is exported from /app/shopify.server.js:

export async function loader({ request }) {
  const { admin } = await shopify.authenticate.admin(request);

  const response = await admin.graphql(`
    {
      products(first: 25) {
        nodes {
          title
          description
        }
      }
    }`);

  const {
    data: {
      products: { nodes },
    },
  } = await response.json();

  return json(nodes);
}

This template come preconfigured with examples of:

  1. Setting up your Shopify app in /app/shopify.server.js
  2. Querying data using Graphql. Please see: /app/routes/app._index.jsx.
  3. Responding to mandatory webhooks in /app/routes/webhooks.jsx

Please read the documentation for @shopify/shopify-app-remix to understand what other API's are available.

Deployment

Application Storage

This template uses Prisma to store session data, by default using an SQLite database. The database is defined as a Prisma schema in prisma/schema.prisma.

This use of SQLite works in production if your app runs as a single instance. The database that works best for you depends on the data your app needs and how it is queried. You can run your database of choice on a server yourself or host it with a SaaS company. Here’s a short list of databases providers that provide a free tier to get started:

Database Type Hosters
MySQL SQL Digital Ocean, Planet Scale, Amazon Aurora, Google Cloud SQL
PostgreSQL SQL Digital Ocean, Amazon Aurora, Google Cloud SQL
Redis Key-value Digital Ocean, Amazon MemoryDB
MongoDB NoSQL / Document Digital Ocean, MongoDB Atlas

To use one of these, you can use a different datasource provider in your schema.prisma file, or a different SessionStorage adapter package.

Build

Remix handles building the app for you, by running the command below with the package manager of your choice:

Using yarn:

yarn build

Using npm:

npm run build

Using pnpm:

pnpm run build

Hosting

When you're ready to set up your app in production, you can follow our deployment documentation to host your app on a cloud provider like Heroku or Fly.io.

When you reach the step for setting up environment variables, you also need to set the variable NODE_ENV=production.

Gotchas / Troubleshooting

Database tables don't exist

If you run the app right after creating it, you'll get this error:

The table `main.Session` does not exist in the current database.

This will happen when the Prisma database hasn't been created. You can solve this by running the setup script in your app.

Navigating to other pages breaks

In Remix apps, you can navigate to a different page either by adding an <a> tag, or using the <Link> component from @remix-run/react.

In Shopify Remix apps you should avoid using <a>. Use <Link> from @remix-run/react instead. This ensures that your user remains authenticated.

OAuth goes into a loop when I change my app's scopes

If you change your app's scopes and notice that authentication goes into a loop and fails with a message from Shopify that it tried too many times, you might have forgotten to update your scopes with Shopify. To do that, you can run the config push CLI command.

Using yarn:

yarn shopify app config push

Using npm:

npm run shopify app config push

Using pnpm:

pnpm run shopify app config push

Benefits

Shopify apps are built on a variety of Shopify tools to create a great merchant experience.

The Remix app template comes with the following out-of-the-box functionality:

  • OAuth: Installing the app and granting permissions
  • GraphQL Payments Apps API: The Payments Apps API enables you to programmatically access your payments app's configuration data
  • Polaris: Design system that enables apps to create Shopify-like experiences

Tech Stack

This template uses Remix. The following Shopify tools are also included to ease app development:

  • Shopify App Remix provides authentication and methods for interacting with Shopify APIs.
  • Polaris React is a powerful design system and component library that helps developers build high quality, consistent experiences for Shopify merchants.
  • Polaris: Design system that enables apps to create Shopify-like experiences

Note: This template runs on JavaScript, but it's fully set up for TypeScript. If you want to create your routes using TypeScript, we recommend removing the noImplicitAny config from tsconfig.json

Resources