薬剤師のプログラミング学習

プログラミングで学んだことを綴るブログ

クレジットカード決済導入 2

序論

みなさんお疲れ様です。


プログラミングスクールの最終課題で
フリーマケットアプリを作成しています。


そして、クレジットカード支払い機能の導入を今回任され
実装が完了したので、復習と備忘録をかねてここに残そうと思います。


前回(クレジットカード決済導入 - 薬剤師のプログラミング学習)
の続きを書いていきますので、
見てない方はそちらをまずご覧ください。


今回は


クレジットカードテーブルの作成を行おうと思います。


クレジットカードテーブルの作成

クレジットカードモデルを作っていきます。

1. ターミナルで以下を入力。

$ rails g model credit_card

カラムや型などのは以下になっております。

DB設計

column type options
user_id references null: false, foreign_key: true
customer_id string null: false
card_id string null: false


モデルを作成したら DB 設計に合わせてマイグレーションファイルに記述していきましょう。

class CreateCreditCards < ActiveRecord::Migration[5.2]
  def change
    create_table :credit_cards do |t|
      t.references    :user,        null: false, foreign_key: true
      t.string       :customer_id,  null: false
      t.string       :card_id,      null: false
      t.timestamps
    end
  end
end

その後はターミナルで

$ rails db:migrate

を入力してください。



躓いた点

ここでまず躓きました。
なぜかと言うと、クレジットカードテーブルのカラムを改めなければいけなくなったからです。


最初のカラムは、 DB に直接クレジットカードの番号だったり期限だったりを登録するものにしていました。




ですがそれは絶対にやってはいけません。


なぜならば法律に違反してしまう可能性があるからです



その詳しい内容が PAY.JP Announcement
カード情報非通過化対応のお願い - PAY.JP Announcement
というところに書かれています。
下に一部抜粋したものを載せておきます。




2018年6月頃に施行予定の改正割賦販売法 によりクレジットカード番号の適切な管理と不正利用の防止が加盟店さまに義務付けられます。

これに伴い、一般社団法人日本クレジット協会および経済産業省により「クレジットカード取引におけるセキュリティ対策の強化に向けた実行計画」*2 (以下「実行計画」)が策定され、 改正割賦販売法の施行時期 2018年6月頃 を目安に、後述するクレジットカード番号の非通過対応が加盟店さま側で求められております。 非通過対応がされていない場合、加盟店さま側で別途「PCI DSS」*3 の準拠が必要となります。





上をすっっっごく雑に解説するなら、



安全にクレジットカードを使うため法律を改訂しました。
(PAY.JP が提供しているような)非通過対応の方法か、
非通過対応をしないんだったらセキュリティをものすごく高めた PCI DSS と言う基準をクリアしてね。



と言うことになります(主観と偏見大いにあり)。


非通過対応と言うのは、加盟店(この場合アプリ開発してる我々)の DB を通過(登録)せず、
直接 PAY.JP の DB にクレジットカードの情報を送信することです。

上の PAY.JP Announcement にわかりやすい図があったので、それを観るとよりわかりやすいと思います。



つまり、
DB に直接クレジットカードの情報を入れようとすると、

"PDI DSS" といういかにも面倒臭そうな基準をクリアしなければいけません。


さすがにそれは大変なので、メンバーと相談をして
クレジットカードテーブルのカラムを変更しました。


ちなみに customer_id, card_id は PAY.JP 側のクレジットカード情報と結びつけるためにあります。




これにてクレジットカードテーブルの作成が終わりました。

ここまで読んでいただきありがとうございました。

次回はいよいよクレジットカードの登録を行いたいと思います。