エンジニアじゃないけどCursorとChatGPTの助けを借りてPAY.JP触ってみた！


AIの進化がすさまじいですよね。ChatGPT、GitHub Copilot、Cursor、V0、Artifacts...

私はそんな最新技術の恩恵をフルに受けているデザイナーの１人です。
生成AIのおかげでコーディングしたり、SQLを書いたり、メールの返信したり、落ち込んだ時に永遠と励ましてもらったりに頼りまくる日々を送っています。

新しい世界を覗くためAIの助けを借りて、非エンジニアの私がPAY.JPのテスト実装をどこまでやれるか挑戦してみました！

### スペック
🧑‍🎨 マーケ兼デザイナー
HTMLやCSSを触れる程度。
環境設定や初期構築にはいつも怯えてしまいエンジニアさんに頼りっぱなし

# 準備編
## アカウント登録
メールアドレスとパスワードでアカウント登録します。
https://pay.jp/d/signup

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3939203/1b07dc38-6025-03f3-e8c0-f64746a7f9c4.png)

ログインできたらPAY.JPのアカウントを登録してテスト環境のAPIキーを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3939203/54fdd0bc-9e0c-6c72-d793-7ce42f275866.png)
これでPAY.JP側の下準備はおわりです✌️


## ChatGPTで全体を聞く
必要なコードと流れを知りたかったのでChatGPTで「PAY.JPをつかったシンプルなコードとファイル構成とローカル環境の立ち上げ方法も教えて」と伝えて全体の流れを把握します。

CursorもChatGPTなのでまるっとCursorでやっても大丈夫ですが、個人的にはCursorの方で質問するとシンプルで端的回答で、ChatGPTの方はガッツリ説明してくれる印象なので全体感を聞く時はChatGPTなど回答してほしい内容に応じてなんとなく使い分けてます。

```
project/
├── index.php       # フロントエンド（決済ページ）
├── charge.php      # 支払い処理
├── .env            # 環境変数（APIキーなど）
├── vendor/         # Composerのライブラリ
└── composer.json   # Composer設定ファイル

```

![Frame 1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3939203/98aa48ae-0ba3-ff05-fa7e-fda43830ea83.png)



必要なファイル構成と必要なライブラリのインストールと各ページで何をするのかをざっくりイメージできたので、ChatGPTが生成してくれたコードをローカルで作成していきます🙆



# 実践編
## Cursorで実装してみる
https://www.cursor.com/

Cursorは、Visual Studio Code（VSCode）をベースにChatGPTが搭載されたAI搭載のコードエディタです。
VSCodeユーザーなので、学習コストが低くて、プライベートで使ってます。


ChatGPTから生成してもらったコードをCursorに取り込み、実装を進めていきます。
### APIキーのセットアップ

まずはPAY.JPの管理画面から取得したテスト用APIキーをコードに埋め込みます。この時、セキュリティ意識高めのChatGPTが「環境変数を使うといいですよ」とさりげなく教えてくれました。

.env  ファイル
```
PAYJP_SECRET_KEY=sk_test_*****************
```


:::note info
環境変数を使う利点
セキュリティ向上 - コード内にハードコーディングしないため、誤ってコードを公開した場合でもシークレットキーが漏洩しません。
環境ごとの設定切り替えが簡単 - 開発環境、ステージング、本番環境で異なるシークレットキーを使用できます。
管理しやすい - .envファイルやシステムの環境変数で一元管理することで、キーの変更が容易になります。
:::

### インストール
では、localhostにつながるかためしてみます。

```
php -S localhost:8000
```

はい、ダメです。

:::note alert
zsh: command not found: composer 
:::

そうでした。ChatGPTにもcomposerをインストールしてねって言われてました。

今までなら、エラーをググってターミナルで震えながらインストールしていましたが、 ここがAIのありがたいところです。
右側のチャットでなぜエラーになったのか、次に何をすればいいのかおしえてくれます。

![Frame 2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3939203/a4c6a15c-2ddf-6b01-d31e-390a8a0732c6.png)


（最初Pythonチャレンジしたときのスクショでわかりずらかったらすみません。）
右側のチャットを拡大したものが下の画像です。
![Frame 3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3939203/f6e07db2-81b5-fe45-7e53-50d40d3b5d92.png)
CursorはChat機能があり、そこで何のエラーなのか、解消するためにどんなステップが必要なのか教えてくれます。

順番に沿ってrunしてインストールしていきます。
日本語対応とてもありがたいですよね。恐怖心が軽減されます。



モデルも選べます。
プランによってモデルの制限がありますので、いっぱい使いたい方は計画的に。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3939203/7ccfba62-c405-785f-0558-00c85c56db30.png)


無事、composerをインストールできたので、payjp-phpもイントールします。

```
composer require payjp/payjp-php
```


### ローカル立ち上げ

今度は、無事立ち上がりました。
カード情報のUIも参照してくれています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3939203/feb31026-47f6-9430-0cf0-89d11b2fa288.png)


エラーがでたり、追加したいものをチャットで会話すると、ログを追加したりしながら、改善を進めてくれます。
![Frame 4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3939203/6cf868b2-52fd-59fc-c696-c40e2af721ef.png)


相談を繰り返して、完了までたどりつきました🎉

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3939203/b0d7b8e0-a020-ab96-6728-fdd09238da41.png)

テストカードで無事完了したので、PAY.JPの管理画面も確認してみると、管理画面にも反映されていました🎉

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3939203/20f430d4-0aee-6af8-2d99-e22d44e767f6.png)


無事ひと段落なので、Cursorを使って引き続き遊んでみようと思います。


## 環境変数にする
上記のテストを繰り返してる中で、エラーが解消できずに環境変数を外して直書きをしてしまいました。
Cursor直してもらおうとおもいます。

ファイルを参照して修正を行うことができるので、APIキーを直書きしてしまったファイルを検索して、対象ファイルを修正してもらう指示をだしました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3939203/5758e17f-759b-d849-2ee0-e5425a54be6a.png)

それぞれのファイルを修正してくれながら、注意点を教えてくれました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3939203/929a448a-65bc-39f6-c85a-ab4fd6ea9b65.png)
~ ~ ~
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3939203/5c4617da-d418-e945-5577-a69e8fc4ea55.png)

 🎉


## PAY.JP docsを読み込ませてみる
つぎは、Docs機能を使ってみます。

CursurのDocs機能とは、サードパーティライブラリのドキュメントをAIに読み込ませる機能です。

https://docs.cursor.com/context/@-symbols/@-docs

これにより、PAY.JP Docsの情報を参照しながらベストプラクティスに沿いながら反映してくれます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3939203/3a3c014c-0449-c3a9-dbea-a191ff9e326c.png)


例えば、以下はPAY.JP v2のドキュメントを参照しながら`result.token.id` から `result.id` に変更してくれてます。
外部ドキュメントを読み込むことで、Cursorがプロジェクト全体の仕様やAPI、設定を理解してくれるので、コンテキストを持ったコード補完がありがたいです。
1人だったらググりループを繰り返して、3時間くらい泣き悩んでしまいそうです。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3939203/89fe4940-6492-27c5-1082-94c516b0b223.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3939203/1768832c-2f42-5fcd-d052-268d3bdab537.png)

🎉


## 3Dセキュアの設定をしてみる

Docsをインポートしたので、3Dセキュアも設定してみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3939203/312d5e63-7c12-3dbb-5ca2-98f5370164e6.png)

3Dセキュアの重要な点と今のコードで反映箇所を指示してくれます。
正確な情報をだしてくれるわけではないので、Cursurが参照した箇所の本家のドキュメントを両方見ながら進めるとかなり理解が深まります🙆

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3939203/45200942-c0f1-7ea1-e826-2a003f7c47b8.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3939203/5958ff95-16ed-777e-8783-e7a9825b2194.png)


対応してくれたのを、反映してローカル環境を確認します。
無事サブウィンドウ型で3Dセキュアのモーダルがでました。

![Frame 5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3939203/0e61fd5b-8455-816d-aae1-a0ac2f9abd38.png)


🎉


## 顧客を追加してみる

3Dセキュアを設定後に、「3Dセキュアするなら顧客情報追加してね」と指摘をもらったので、顧客も追加してみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3939203/19e317d6-31e4-80ed-56c3-4aaea712b964.png)

PAY.JPのDocs参照し「顧客を追加したい」とつたえると公式に合わせて提案してくれます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3939203/99982b45-9c18-ee96-0282-386dd524fb5b.png)


3Dセキュアを有効化しながらCustomerもつくってくれました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3939203/55145eab-cde1-d3fe-8656-d5c63b6b9064.png)


見た目はかわっていませんが、管理画面の方に顧客（Customer）が追加されるようになりました。

![Frame 6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3939203/3a198791-6be9-6181-1024-b1493e353ac7.png)
![Frame 7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3939203/784575f9-133e-bbaa-818b-2a45fe5838e3.png)





🎉



# 気づきと学び

### AIがメンター兼、補助輪の役割をしてくれた


何が原因でエラーが起きてるのか、どのコードをどんな理由で変えるのか説明をもらうので、なるほど〜と思いながらすすめるので、めちゃくちゃ勉強になりながら進めることができました。
全然自分のものにできてるわけじゃないので、補助輪付きで進んでく感覚でした。



### PAY.JPのドキュメントが親切

CursurのDocs機能でPAY.JPのドキュメントインポートしてから、わかりやすさが段違いになりました。
最初からやっておけばよかったです。

Cursurは、もちろんすごいんですがドキュメント側のクオリティも出力に大きく影響します。


PAY.JPの公式ドキュメントは、エンジニアさんからもシンプルでわかりやすいという声をSNSを見ることが多いのですが、シンプルで曖昧な表現を避けて言い切るスタンスのおかげで、AIが生成するコードやアドバイスも的確だったのかもとおもっています。

今後、人間だけでなくAIも「読む」ことを想定したドキュメント設計が求められてくるんだな〜と気付かされました。



# 感想

それにしても、AIやツールの活用の敷居がここまで下がった時代に生きていることに感謝です。
AIがメンターになってくれて一歩踏み出すハードルが低くなっているのは、本当にありがたいことです。

モデルの進化やツールもどんどんアップデートしている今、この流れに乗って、もっといろいろなことを試してみたいです！