JavaScript >> Javascript 文檔 >  >> Node.js

如何在 Node.js 中使用 Stripe 向信用卡收費

如何使用 Stripe NPM 包與 Stripe API 通信並在 Node.js 中為信用卡充值。

開始使用

對於本教程,我們將使用 CheatCode Node.js Boilerplate 作為我們工作的起點。首先,讓我們從 Github 克隆一個副本:

終端

git clone https://github.com/cheatcode/nodejs-server-boilerplate

接下來,cd 進入項目並安裝其依賴項:

終端

cd nodejs-server-boilerplate && npm install

接下來,我們需要安裝一個額外的依賴,stripe

終端

npm i stripe

最後,繼續啟動開發服務器:

終端

npm run dev

有了這個,我們就可以開始了。

獲取卡片令牌

為了通過 Stripe API 處理費用,我們需要訪問 Stripe 令牌。對於本教程,我們將只關注後端,但建議您查看我們的教程如何使用 Stripe.js 構建信用卡表單,以了解如何構建用戶界面來檢索 Stripe 卡令牌。

一旦你有辦法獲得卡片令牌,我們就可以開始處理收費了。

訪問我們的 Stripe API 密鑰

在我們深入研究代碼之前,對於本教程,我們需要訪問一個 Stripe 帳戶。如果您還沒有,請前往他們網站上的註冊頁面並創建一個帳戶。

擁有帳戶後,登錄儀表板。它應該看起來像這樣:

我們要導航到的頁面是上圖所示的頁面。到達那裡:

  1. 確保您已在右上角切換了“測試模式”開關,使其亮起(在撰寫本文時,它會在激活時變為橙色)。
  2. 在該切換按鈕的左側,點擊“開發者”按鈕。
  3. 在下一頁的左側導航菜單中,選擇“API 密鑰”標籤。
  4. 在此頁面的“標準密鑰”塊下,找到您的“密鑰”並點擊“顯示測試密鑰”按鈕。
  5. 複製此密鑰(妥善保管,因為它用於與您的 Stripe 帳戶執行交易)。

接下來,一旦我們有了我們的密鑰,我們需要打開我們剛剛克隆的項目並導航到 /settings-development.json 文件:

/settings-development.json

const settings = {
  "authentication": { ... },
  "databases": { ... },
  "smtp": { ... },
  "stripe": {
    "secretKey": "<Paste your secret key here>"
  },
  "support": { ... },
  "urls": { ... }
};

export default settings;

在此文件中,按字母順序排列在導出的 settings 底部附近 對象,我們要添加一個新屬性 stripe 並將其設置為具有單個屬性的對象:secretKey .對於此屬性的值,我們要粘貼您從上面的 Stripe 儀表板複製的密鑰。粘貼進去,然後保存這個文件。

接下來,為了訪問 Stripe API,我們需要通過 stripe 設置一個 Stripe 實例 NPM 包。

連接對 Stripe 的訪問

設置好密鑰後,現在我們需要訪問 Stripe API。幸運的是,Stripe 的人為他們的 API 提供了一個 Node.js 包(我們之前安裝了這個),所以我們需要做的就是建立一個與它的連接。

/lib/stripe.js

import Stripe from 'stripe';
import settings from "./settings";

const stripe = Stripe(settings.stripe.secretKey);

export default stripe;

我們的 /lib 內部 文件夾,我們要創建一個文件 stripe.js 我們將在 stripe 中加載 從 NPM 打包並使用我們的 secretKey 對其進行初始化 來自我們剛剛添加到設置文件中的 Stripe。

在這裡,我們根據我們的環境導入適當的設置。我們假設當前環境是 development ,所以 settings 這裡將包含我們的 settings-development.json 的內容 文件。

在那個對像上,我們期望一個屬性 stripe 被定義為具有自己屬性 secretKey 的對象 .上面,我們先導入Stripe 來自 stripe 我們之前安裝的 NPM 包,然後將導入的值作為函數調用,傳入我們的 secretKey 來自我們的設置文件。

作為回報,我們希望得到一個 Stripe API 的實例,我們將它存儲在一個變量 stripe 中 然後從這個文件中導出為默認值。

有了這個,現在,每當我們想與 Stripe 通信時,我們只需要導入這個文件,而不是在我們想要調用 Stripe 的所有文件中編寫所有這些代碼。

為收費連接端點

接下來,我們將使用 Express.js 連接一個 HTTP POST 端點(在我們使用的樣板中內置和預配置)。我們將使用這個端點來演示如何通過 Stripe 創建費用。請務必注意:您可以從 Node.js 中的任何位置調用我們將在下面看到的 Stripe 代碼 .我們只是以 Express 路由為例。

/api/index.js

import graphql from "./graphql/server";
import stripe from "../lib/stripe";

export default (app) => {
  graphql(app);
  app.post("/checkout", (req, res) => {
    // We'll wire up the charge here...
  });
};

/api/index.js 內部 文件已經包含在我們的樣板文件中,我們添加一個新的路由 /checkout 通過調用 .post() app 上的方法 參數傳遞到從此文件導出的函數中。這裡,app 表示 Express.js app 我們在調用 express() 時得到的回報 (您可以在 /index.js 中查看此設置 樣板根目錄下的文件——api() 我們調用的函數就是我們在上面看到的被導出的那個)。

在這裡,我們使用 .post() 方法來創建只接受 HTTP POST 請求的 Express 路由。正如我們將看到的,稍後我們將發送一個 HTTP POST 請求來測試這一點。

/api/index.js

import graphql from "./graphql/server";
import stripe from "../lib/stripe";

export default (app) => {
  graphql(app);
  app.post("/checkout", (req, res) => {
    const items = [
      { _id: "water-jug", amount: 9999, name: "Water Jug" },
      { _id: "coffee-cup", amount: 2999, name: "Coffee Cup" },
      { _id: "ham-sandwich", amount: 2999, name: "Ham Sandwich" },
    ];

    const item = items.find(({ _id }) => _id === req?.body?.itemId);
    const source = req?.body?.source;

    if (item && source) {
      // We'll process the charge here...
    }

    res
      .status(400)
      .send(
        "Must pass an itemId and source in the request body in order to process a charge."
      );
  });
};

在我們處理 req 之前,在我們的路由的回調內部 uest,我們設置了一個商品數組來充當客戶可能從我們這裡購買的真實商品的模擬數據庫。

這個很重要。我們在這裡展示這個而不是從客戶那里傳遞金額的原因是我們不應該永遠不要相信客戶 .例如,如果用戶發現我們只是將金額從客戶端傳遞到服務器,他們可以將 1,000 美元的訂單更改為 0.01 美元,然後收費就會處理。

為了緩解這種情況,我們會跟踪我們將在 服務器 上收取的價格 並使用唯一 ID 告訴我們在收到收費請求時獲取哪個商品的價格。

在這裡,我們通過說“這個 items 的數組 以這些價格出售。”我們希望 req.body 我們收到的對象將有兩個屬性:一個 itemId 和一個 source .這裡,itemId 應該 匹配 _id 之一 如果購買有效,商品上的字段(實際上,我們會將相同的商品列表從數據庫加載到我們的 UI 中,以便 ID 保持一致)。

為了檢查,我們使用 items.find() ,查找具有 _id 的項目 屬性——在我們的 .find() 內 回調我們使用 JavaScript 對象解構從我們循環的每個項目中“提取”這個屬性——這等於 req.body.itemId 我們從客戶那裡收到了。

如果我們 找到一個匹配的項目,我們知道購買是有效的。接下來,我們還得到 source ——這是 Stripe 用來指代支付的術語 來源——來自 req.body .

假設 itemsource 已定義,我們要嘗試充電。如果他們不是 定義後,我們希望使用代表“錯誤請求”的 HTTP 400 狀態代碼進行響應,並發送回一條消息,其中包含有關如何解決問題的說明。

/api/index.js

import graphql from "./graphql/server";
import stripe from "../lib/stripe";

export default (app) => {
  graphql(app);
  app.post("/checkout", (req, res) => {
    const items = [
      { _id: "water-jug", amount: 9999, name: "Water Jug" },
      { _id: "coffee-cup", amount: 2999, name: "Coffee Cup" },
      { _id: "ham-sandwich", amount: 2999, name: "Ham Sandwich" },
    ];

    const item = items.find(({ _id }) => _id === req?.body?.itemId);
    const source = req?.body?.source;

    if (item && source) {
      return stripe.charges
        .create({
          amount: item.amount,
          currency: "usd",
          source,
          description: item.name,
          metadata: {
            ...item,
          },
        })
        .then((charge) => {
          res.status(200).send(charge);
        })
        .catch((error) => {
          res.status(402).send(error);
        });
    }

    res
      .status(400)
      .send(
        "Must pass an itemId and source in the request body in order to process a charge."
      );
  });
};

現在我們準備好向 Stripe 發送我們的收費請求了。為此,我們將調用 stripe.charges.create() stripe 中的方法 我們在之前導入的文件中設置的 API 實例。調用該函數,我們傳遞一個帶有適當選項的對像以進行收費(請參閱此處的 Stripe 文檔中可用的內容)。

為了我們的需要,我們想傳遞兩個必填字段amount (以美分錶示費用的整數 - 例如,$5.00 將是 500)和 currency .我們還傳遞了我們的 source (這將是我們在客戶端檢索到的 Stripe 令牌),我們的項目名稱為 description ,並在 metadata 中包含有關我們收費的所有數據 字段作為將雜項數據與我們的費用一起傳遞的示例(對於需要存儲額外的、自定義的、與費用相關的數據(如內部用戶 ID)的開發人員來說,這是一個方便的選項)。

最後,正如我們所期望的 stripe 中的所有方法 API 實例返回一個 JavaScript Promise,我們鏈接在 .then() 回調函數來處理我們的成功狀態和一個 .catch() 處理錯誤狀態的回調函數。

如果充值成功,我們回復原req 狀態碼為 200 (表示請求成功的 HTTP 狀態代碼)並傳遞我們從 Stripe 收到的響應(一個包含已處理費用詳細信息的對象)。

如果收費失敗,我們會發送一個 HTTP 狀態碼 402 (代表“需要付款”)並發送回 error 從 Stripe 接收到的對象。

而已!讓我們啟動客戶端以獲取我們的 Stripe 令牌,然後通過 HTTP 應用程序處理請求(我正在使用 MacOS 應用程序 Paw 來測試我們的端點)。

總結

在本教程中,我們學習瞭如何使用 stripe 向信用卡收費 Node.js 中的 API。我們學習瞭如何通過他們的 stripe 創建 Stripe API 的實例 node 包,創建了一個可重用的模塊來與 stripe 通信,然後我們學習瞭如何通過 Express.js 設置 HTTP POST 路由,我們可以在其中向 Stripe 發送收費請求。


Tutorial JavaScript 教程
  1. 一步一步學習 ReasonReact 部分:1

  2. 學習 React Portal 及其應用程序

  3. 是否可以檢測到 Android 強制門戶瀏覽器?

  4. 在 110 年重建我的生活方式博客 - 第 1 部分

  5. 如何在 HTML 頁面中正確存儲 HTML 模板?

  6. Stencil – 如何從 javascript 獲取 CDN 鏈接

  7. #30DaysOfCJS:使用 Kafka 的可擴展分佈式消息傳遞

  1. 在 Hapi 中定義路線

  2. xLayers:設計和代碼生成

  3. 新技巧:jQuery Mobile(書摘)

  4. JavaScript join, toString 示例將數組轉換為字符串

  5. 在 Angular v11 中設置 Tailwind CSS

  6. 可複用組件——傳播道具的價值

  7. 如何使用 Vue、Phaser、Node、Express 和 Socket.IO 構建多人桌面遊戲模擬器

  1. 在 Vue.js 中使用 Scoped Slot 來抽像功能

  2. 使用 Node.JS 後端的前 5 個管理模板

  3. 將經緯度坐標排序為順時針四邊形

  4. 如何:製作 Chrome 擴展程序