payjp-goを使ってテスト用APIにリクエストを行うまでを試してみる

この記事は「[オンライン決済サービスPAY.JPを使ってみた情報をシェアしよう！ by PAY Advent Calendar 2024](https://qiita.com/advent-calendar/2024/payjp-01)」の7日目の記事です!

投稿日付が12/14という事で1週間遅れての記事になります!すみません!

今回はタイトルにあるようにPAY.JPが提供しているSDKで「payjp-go」を使ってみてリクエストを行う所までをやってみます。普段業務で使っている言語はPHPなのですが、普段慣れてないGo言語を使う事でGoの勉強にもなって、PAY.JPの記事も書ける、一石二鳥スタイルで書いていきます。

https://github.com/payjp/payjp-go

:::note warn
※注意としてpayjp-goは今betaブランチに移行中なので、masterではなく**beta**ブランチに切り替えて試してください。
:::

___



## Step1. 環境構築
まずはGoの開発環境を用意しましょう。
Goがまだインストールされていない場合は、公式サイトからインストールするか以下のコマンドを実行してください。

公式サイト: https://go.dev/doc/install

```sh
$brew install go
$go version #go version go1.21.0 darwin/arm64
```

モジュール管理をするために、`go mod init`を設定します。

```sh
mkdir my-project
cd payjp-go-tutorial
go mod init my-project
````

次にpayjp-goライブラリをインストールしてください。

```sh
go get github.com/payjp/payjp-go@beta
```

## Step.2 PAY.JPにリクエストを行うためにテスト用の秘密鍵を確認する

PAY.JPのAPIを利用するにはユーザー登録を行い、APIページからAPIキーを取得します。

参考: [PAY.JP の本番利用申請なしでどこまで試せるかやってみた。 - zan memo](https://zan-gi.hatenablog.com/entry/2024/12/02/233203)

テスト用のキーでは、本番の支払い処理を行うサーバーへは接続されず、実際の支払い情報として計上されることもありません。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64829/533a2b44-2c2d-62a2-707f-99b025d1b6e4.png)


APIキーをgoから読み取るために`goenv`をインストールして、`.env`ファイルから読み取るようにします。

```sh
go get github.com/joho/godotenv
```

:::note warn
`.env`ファイルに秘匿情報を載せるため、`.gitignore`に追記してコミットには含めないようお願いします。
:::

テスト秘密鍵の値を.envに追加します。

```env
PAYJP_SECRET_TEST_KEY=sk_test_XXXXXXXXXXXXXXXXXXXXXXXX
```

## Step.3 payjp-goを使って顧客情報をAPIから取得する。

PAY.JPのAPIにリクエストを送信するコードを書いてみます。ここでは、顧客リストを取得するサンプルを作成します。

事前に顧客を取得するためにPAY.JPの画面からテスト用の顧客作成を行います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64829/dad92d10-d95c-d4b9-39bd-394c175341cd.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64829/2fb2a8d5-bd91-5f44-187b-d9d0aac5199e.png)

この時の顧客IDはこの後のリクエストで使うので`.env`に追加しておきます。

```
PAYJP_CUSTOMER_ID=***
```


次に実際に以下に顧客情報を取得してくる簡単なサンプルコードを書いてみました。


```go
package main

import (
	"fmt"
	"log"
	"os"

	"github.com/joho/godotenv"
	"github.com/payjp/payjp-go/v1"
)


func main() {
	// .envファイルの読み込み
	err := godotenv.Load()
	if err != nil {
		log.Fatalf("Error loading .env file: %v", err)
	}
	secretKey := os.Getenv("PAYJP_SECRET_TEST_KEY")
	customerId := os.Getenv("PAYJP_CUSTOMER_ID")
	
	if secretKey == "" {
		log.Fatal("PAYJP_SECRET_KEY is not set in .env file")
	}
	
	// PAY.JPクライアントの初期化
	pay := payjp.New(secretKey, nil)
	fmt.Println("PAY.JP client initialized successfully")
	// 顧客情報の取得
	customer, err := pay.Customer.Retrieve(customerId)
	if err != nil {
		log.Fatalf("Error retrieving customer: %v", err)
	}
	fmt.Printf("Customer: %+v\n", customer)
}
```

このコードを実行してみます。

```
go run main.go
```

出力結果はこちらです!
```sh
PAY.JP client initialized successfully
Customer: &{RawCards:{Count:0 Data:[] HasMore:false Object:list URL:/v1/customers/cus_****/cards} Cards:[] DefaultCard: Description:こんにちは! Email:hogefuga@mail.com ID:cus_**** LiveMode:false Object:customer RawSubscriptions:{Count:0 Data:[] HasMore:false Object:list URL:/v1/customers/cus_***/subscriptions} Subscriptions:[] Metadata:map[] Created:0x140000a1c68 CreatedAt:2024-12-14 12:18:58 +0900 JST service:0x14000120370}
```
先ほど作成した顧客情報がAPIから取得できている事を確認できました!:tada: 

## まとめ

`payjp-go`ライブラリを使ってPAY.JP APIにリクエストを送信する手順を解説しました。
記事を書くために`payjp-go`を始めて使ってみたのですが、ドキュメントがわかりやすく調べてからリクエストする所まで1時間もかからなかったです!

PAY.JPはGo以外にも他の言語でも機能を提供しているので、公式ドキュメントを参照して試してみてください！

おわり!

## 参考資料

- https://github.com/payjp/payjp-go
- https://github.com/Fendo181/payjp-go-practice