【個人開発】郵便番号APIサービスを作りました。または個人でクレジット決済導入について。

# どんなサービスか？

郵便番号が特定の地域に該当するかを判定するAPIです。
おまけとして、よくある郵便番号から住所を取得する機能も付けました。
ですが、一番の目的は地域の判定です。

【サービスURL】 https://api-zipcode.jp/

例えば、ある郵便番号が新宿区内の郵便番号か？を判定できます。

ここでクイズです。
163-8001 は新宿区内でしょうか？
答えは後ほど。

# なぜ作ったか

私は仕事でECサイトの開発をしてます。
ある日、同僚から相談を受けました。
配送先の郵便番号から、自動的に自社配送かを判定したいとのことでした。
このECサイトでは、都内23区は自社のドライバーが配送し、そのほかの地域は外部の配送業者に託しています。

そのようなサービスがないか探しましたが見つけられなかったので自分で作りました。

# 使用技術

PHP7.4
laravel8.x
AWS EC2,ALB など

# クイズの答え

先程の**163-8001**は**新宿区内**か？ の答えですが、今回作ったサービスで調べてみます。

1 ユーザー登録

条件の作成が必要なので、まずはユーザー登録をお願いします。
登録は無料でお試しポイントが付与されます。

2　 APIトークンの作成

**アカウント>APIトークン**ページで、APIトークンを作成します。
任意のトークン名と使用する機能に応じてアビリティを選択します。
今回は**判定:エリア**にチェックを入れます。
![スクリーンショット 2021-08-03 23.25.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1831406/8bc0d911-dd03-9bbc-9bab-3c2e32af2c0a.png)

トークンが作成されます。
![スクリーンショット 2021-08-03 23.25.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1831406/60aba3cb-6879-4e03-216a-2887fc6aa8aa.png)

3 検索条件を作成

**アカウント>検索条件**ページで、条件を作成します。
新規作成を選択してください。
![スクリーンショット 2021-08-03 23.24.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1831406/06b267a5-4777-499b-2272-3da80da69100.png)

都道府県で**東京都**を選択し、市区町村に**新宿区**と入力、完全一致を選択してください。
そして、**新規作成**で保存してください。
![スクリーンショット 2021-08-03 23.24.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1831406/05e948b3-7892-dd22-b7fc-cfd82ed57856.png)

保存すると、**検索条件キー**が発行されます。
![スクリーンショット 2021-08-03 23.25.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1831406/748d4c8e-7275-3700-ff12-335920b4a633.png)

4 APIを叩く

postmanなどで叩いてもいいですが、APIを試すページを作成しました。
**API仕様>area**ページに移動します。
先程作成したAPIトークンをコピペしてください。
先程の郵便番号を入力し、検索条件１に先程作成した条件を選択してください。
![スクリーンショット 2021-08-03 23.26.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1831406/9e69591e-9895-eab9-8810-a61930175214.png)

実行するとjsonが返ってきます。

```json
{
  "message": "OK",
  "point": 988,
  "is_area": true,
  "zip_code": "1638001",
  "keys": [
    {
      "operator": "add",
      "key": "38iapq4m"
    }
  ]
}
```

is_areaがtrueなので、163-8001は新宿区内ということがわかりました。
ちなみに、都庁の郵便番号です。

# より複雑な判定

次は、新宿区以外の区内かを判定してみます。

検索条件を追加しました。
今回は、都道府県が**東京都**で、市区町村が**区**の**後方一致**です。
![スクリーンショット 2021-08-03 23.58.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1831406/77a6619e-bf77-e5fb-ae30-4cb86d15e667.png)

先程と同じ都庁の郵便番号を指定しました。
条件１には**東京都 区（後方一致）**を選び、演算子にマイナスを選択。
条件２には、最初に作成した新宿区の条件を選びます。
![スクリーンショット 2021-08-04 0.01.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1831406/ab404bf6-a230-c8db-bf9d-72dab8fd9d68.png)

実行するとjsonが返ってきます。

```json
{
  "message": "OK",
  "point": 979,
  "is_area": false,
  "zip_code": "1638001",
  "keys": [
    {
      "operator": "add",
      "key": "23a2c592"
    },
    {
      "operator": "sub",
      "key": "38iapq4m"
    }
  ]
}
```

is_areaがfalseなので、163-8001は新宿区以外の区ではないとわかりました。

# 苦労した点

有名な話ですが、そもそも日本郵便が公開している郵便番号csvのフォーマットがかなりクセがあります。
それを整形してデータベースを作成するのが大変でした。

# 個人でクレジット決済を導入できるか？

awsのお金も毎月かかります。
せっかく作ったので、やはりマネタイズしたいですよね。


今回のサービスでは月額定額ではなく従量課金にしました。
１リクエストが0.01円〜0.03円です。
月額の場合は使ってなくても課金されるため、個人的には使った分だけの支払いの方が親切かと思いました。
新規ユーザー登録で、1,000ポイントお試しで付与されます。

ポイントの追加にはクレジット決済を導入しました。

そもそも、個人でクレジット決済を導入できるか？という問題がありました。
個人事業主ではなく、ただの個人です。
調べたところPAY.JPが個人でも導入できることがわかりました。
もちろん審査はあります。

使ってみた感想では、ドキュメントやAPIの機能がしっかりしてたので、使いやすかったです。
仕事でStripeや国内のいくつかのクレジット決済サービスのAPIを使ったことがありますが、国内の決済サービスでは一番わかりやすいと思います。
PAY.JPはAPI仕様をwebで確認できました。
管理画面もモダンでした。
どことは言えませんが、他の決済サービスの仕様書はpdfやエクセルデータでした。。

# まとめ

個人でもクレジット決済のサービスが作れました。
今回作ったサービスは今のところ赤字ですが、、アイデア次第でマネタイズできるサービスを作れますね。