# プロジェクト概要
口座振替の集金業務を改善するSassの新規開発になります。
以下、「口座振替サービス」と呼びます。
従来の口座引き落としでは、以下の問題がありました。
- 引き落とされる側
- 口座振替を開始するまでに、紙・ハンコを使った手続きが必要で煩雑
- 引き落とし結果の確認は通帳記入のみ、かつ明細は確認できない
- 集金する側
- 残高不足等で口座振替が未収となった際に回収できない
- 金融機関には特定のファイルで連携する必要があり、このファイルの作成に時間がかかる
「口座振替サービス」では以下の方法で口座振替業務、引き落とし業務を改善します。
- 引き落とされる側
- スマートフォンから引き落としの申し込みができる
- LINE経由で引き落とし結果が通知され、明細単位で金額を確認できる
- 集金する側
- 未収時はコンビニ支払いに切り替え
- 「口座振替サービス」から全ての請求を管理できるため、連携用のファイルが不要になる
# チーム情報
- 事業責任者1名
- PM 1名
- バックエンドエンジニア 3名
- フロントエンドエンジニア 1名
# 担当業務
開発期間がタイトだったため、エンジニア1人づつに実装する機能を割り振り、並行して進める開発スタイルでした。
自分は引き落としされる側のユーザー登録の機能(バックエンド)を実装しました。
# 使用技術
- Golang関連
- [Golang v.1.18](https://go.dev/doc/go1.8)
- [GORM(ORマッパー)](https://github.com/go-gorm/gorm)
- [Wire(DIツール)](https://github.com/google/wire)
- [echo(Webフレームワーク)](https://github.com/labstack/echo)
- 外部サービス
- [LINE Messaging API](https://developers.line.biz/ja/services/messaging-api/)
- [LINE Front-end Framework](https://developers.line.biz/ja/docs/liff/overview/)
- [Media SMS認証オールインワンサービス](https://media-sms.net/services-db/)
Goを使った開発を経験したことはなかったため、Golang, 周辺技術のキャッチアップをしながら機能を実装しました。Goの経験が豊富なチームメンバーがいたので、PRのレビューを受けつつコードを改善していきました。
# 課題
- エンドユーザーが手軽にサービス登録できる必要があった
- お金を扱うサービスであるため、エンドユーザーの個人情報を自社で持つ必要があった
# 取り組み
## LINE Bot, LIFFブラウザを使用したエンドユーザーの登録処理を実装
当初、LINEのチャットベースでのエンドユーザーの登録を検討していました。
大まかには以下のような実装です。
1. ユーザーLINEの友達登録
2. メッセージが届く
3. LINEのトーク画面から登録に必要な情報を入力
4. 登録完了
※必要な情報が集まるまで2~3繰り返す
一連の機能を実装し、事業責任者の方にデモをしたところ、「チャットベースだと登録フローが煩雑になり、ユーザーが離脱しかねない」とのFBを受けました。
これを受けLINEのチャットベースから、LINE内ブラウザを用いた登録に作り直すことになりました。
変更後は以下のようなフローになります。
1. ユーザーLINEの友達登録
2. メッセージが届く
3. LIFFブラウザから登録に必要な情報を入力する
4. 登録完了
仕様変更の悲劇が繰り返されないように、自分から仕様の詳細・フローを事業責任者とPMの方に提案し、2週間で修正を完了させました。
エンジニアとしてただコードを書くだけではなく、関係者が本当に望んでいる機能を自ら提案し、コードに落とし込むことが重要だと実感しました。
## エンドユーザーの携帯電話番号を使った認証処理を実装
エンドユーザーの個人情報を自社で持つために、SMSを使用した携帯電話番号の認証処理を実装しました。
### APIの選定
SMSのAPIの選定を事業責任者の方と一緒に進めました。
各社のAPIドキュメントを比較し、APIを提供する会社とのミーティングを行い、仕様、料金形態について調査を実施しました。
候補の1つであった[Twillio](https://www.twilio.com/ja/)はエンジニアの観点からするとドキュメント、サンプルコードが充実していることから、選択肢として非常に魅力的でした。しかし、他社のサービスの方が料金が安く、サービスの初期段階のコストは抑えた方が良いという結論になり、他社のサービスを使用することになりました。
技術的に扱い易いかだけでなく、ビジネス的な視点も技術選定において重要な基準になることがわかりました。
### SMS認証処理の実装
- 他社のSMSの認証の実装を参考に、入力回数, 有効期限の制限を設けることで堅牢な実装を行いました。
- PINの制限の処理は上限を越えたかどうかで処理を切り替えるロジックになっていました。プロジェクト全体で自動テストのコードは追加していましたが、この処理はより厚めにテストコードを書きました。正常系だけでなく、境界値テストを記載することで不具合を未然に防ぐことができました。
- 特定のSIMカードを使用している場合、SMSを受け取れない可能性がありました。口座振替サービスはSIMカードの種類によらず、広く多くの人に使ってもらうサービスのため、SMS以外でもPINを受けれるようにしました。具体的にはIVR(電話自動応答)によるPINの発信を実装することで対応しました。