Node.js
Express
stripe
Express.js

決済API StripeをNode.jsとExpressで動かしてみた。

概要

決済APIであるStripeを用いて、カスタマーの登録、カスタマーのカード登録、都度決済の実行を行います。
この際、Expressを用いたNode.jsサーバにより、それぞれの処理を実行します。
システムとしては、サーバでプログラムを回し続けて、そこにAPIを投げる形で各処理を実行します。

このページを読んでできること

・Expressを用いた簡単なNode.jsサーバの立ち上げ
・Stripeによるカスタマーの登録、カスタマーのカードの登録、都度決済

参考にしたページ

node.js + expressでPOSTを受け取る & POSTパラメータをJSONで取得する
https://qiita.com/ktanaka117/items/596febd96a63ae1431f8
[nodejs][stripe] stripe を node で使う(customer 情報の登録)
https://qiita.com/wokamoto/items/0be8471d38044ada9209
[nodejs][stripe] stripe を node で使う(単発の支払い)
https://qiita.com/wokamoto/items/74bf257473e98f623025

Node.jsとは

Node.js
https://nodejs.org/ja/
Node.js® は、Chrome の V8 JavaScript エンジン で動作する JavaScript 環境です。 Node.js は、軽量で効率的に動作する非同期型のイベント駆動モデルを採用しています。 Node.js のパッケージ管理マネージャである npm は、世界で最も大きなオープンソースのライブラリエコシステムです。

Expressとは

Express.js
http://expressjs.com/ja/
Express は、Web アプリケーションとモバイル・アプリケーション向けの一連の堅固な機能を提供する最小限で柔軟な Node.js Web アプリケーション・フレームワークです。

Stripeとは

Stripe API Reference
https://stripe.com/docs/api
ウェブアプリなどでの決済に用いることができるAPIです。

手順

任意のディレクトリを作りましょう。
ここではstripe-node-expressとします。
$ mkdir stripe-node-express
ディレクトリへ移動しましょう。
$ cd stripe-node-express
node.jsを用いるためにnpmをinitします。
$ npm init
Expressをインストールします。
$ npm install express --save
Stripeをインストールします。
$ npm install stripe --save
環境変数を格納するためにdotenvをインストールします。
$ npm install dotenv --save

プログラムを記述

stripe-express.js
//config express
const express = require('express');
const bodyParser = require('body-parser');
const app = express();

var export_func = require("./stripe-exports");

// urlencodedとjsonは別々に初期化する
app.use(bodyParser.urlencoded({
  extended: true
}));
app.use(bodyParser.json());

app.listen(3000);
console.log('Server is online.');

app.post('/stripe-create-customer', function(req, res) {
  export_func.stripe_create_customer(req.body.email);
  res.send('Created a customer.\n');
  console.log('Created a customer.');
})
app.post('/stripe-create-card', function(req, res) {
  export_func.stripe_create_card(req.body.customer_id, req.body.card_num, req.body.card_month, req.body.card_year, req.body.card_cvc);
  res.send('Created a card.\n');
  console.log('Created a card.');
})
app.post('/stripe-charge', function(req, res) {
  export_func.stripe_charge(req.body.price, req.body.description, req.body.customer_id);
  res.send('Created a charge.\n');
  console.log('Created a charge.');
})

stripe-exports.js
//config environment
require("dotenv").config();
//config stripe
var stripe = require('stripe')(process.env.token)
//console.log(process.env.token);

//customer_email:顧客のメールアドレス
exports.stripe_create_customer = function(customer_email) {
  stripe.customers.create({
    email: customer_email
  }, function(err, customer) {
    // asynchronously called
    console.log(customer);
  });

}

//id:顧客のID
//num:カード番号, month:カードの有効期限, year:カードの有効期限, cvc:カードのセキュリティ番号
exports.stripe_create_card = function (id,num,month,year,cvc){
  console.log(id,num,month,year,cvc);
  stripe.tokens.create({
    card: {
      "number": num,
      "exp_month": month,
      "exp_year": year,
      "cvc": cvc
    }
  }, function(err, token) {
    // asynchronously called
    var params = {
      source: token.id
    };
    stripe.customers.createSource(id, params, function(err, card) {
      console.log(card);
    });
  });
}

//price:請求価格, description:説明, customer_id:顧客のID
exports.stripe_charge = function(price, description, customer_id) {
  var charge = stripe.charges.create({
    amount: price,
    currency: "jpy",
    description: description,
    customer: customer_id
  })
}

プログラムを実行

$ node stripe-express.js
でnode.jsサーバを立ち上げます。
別のコンソールにおいて下記のコマンドを実行します。

カスタマー作成

$ curl -X POST http://localhost:3000/stripe-create-customer -H "Accept: application/json" -H "Content-type: application/json" -d '{ "email" : "CUSTOMER_EMAIL" }'

カスタマーのカード登録

$ curl -X POST http://localhost:3000/stripe-create-card -H "Accept: application/json" -H "Content-type: application/json" -d '{ "customer_id" : "CUSTOMER_ID", "card_month":"12", "card_year":"2019" ,"card_num":"4242424242424242", "card_cvc":"123" }'

都度決済

$ curl -X POST http://localhost:3000/stripe-charge -H "Accept: application/json" -H "Content-type: application/json" -d '{ "price" : 3000, "description":"DESCRIPTION", "customer_id":"CUSTOMER_ID" }'