📱

PayPay の SDK を Go で書いた

2021/06/09に公開

まえがき

みなさん、PayPay は使っていますか?便利ですよね。リリースから紆余曲折ありましたが、だいぶ浸透したような気がします。僕は一歩遅れて PayPay を使い始めたんですが、はじめは QR コードを読み取って決済するかバーコードを読んでもらって決済するだけだった印象でした。それから個人間送金も便利でした。それが今は普通に Web 上で完結する決済に使用できるまでになっていて、幅が広がったなぁと思っているところです。某ハンバーガーショップのモバイルオーダーでよく使っていたりします。

そんな PayPay からは SDK がリリースされています。2020年7月頃から。気づいたのが2021年4月頃だったので遅すぎですね...。で、よく見ると Go 向けの SDK は残念ながら提供がありませんでした。そこで、無いなら作ろうということでry

できたもの

https://github.com/mythrnr/paypayopa-sdk-go

Go 1.13 以降で確認しています。詳しい利用方法は README を見てみてください。後ほど使い方も簡単に紹介します。

コンセプト

インテグレーションごとに集中できるようにする

PayPay からは現時点で7つの インテグレーション が提供されています。ただ、実際は公開されている API の中から各インテグレーション向けに API をピックアップして紹介しているという形です。

インテグレーション ドキュメント
Web Payment https://developer.paypay.ne.jp/products/docs/webpayment https://www.paypay.ne.jp/opa/doc/jp/v1.0/webcashier
Native Payment https://developer.paypay.ne.jp/products/docs/nativepayment https://www.paypay.ne.jp/opa/doc/jp/v1.0/direct_debit
Dynamic QR https://developer.paypay.ne.jp/products/docs/qrcode https://www.paypay.ne.jp/opa/doc/jp/v1.0/dynamicqrcode
App Invoke https://developer.paypay.ne.jp/products/docs/appinvoke https://www.paypay.ne.jp/opa/doc/jp/v1.0/appinvoke
Continuous Payment https://developer.paypay.ne.jp/products/docs/continuouspayment https://www.paypay.ne.jp/opa/doc/jp/v1.0/continuous_payments
PreAuth & Capture https://developer.paypay.ne.jp/products/docs/preauthcapture https://www.paypay.ne.jp/opa/doc/jp/v1.0/preauth_capture
Request Money https://developer.paypay.ne.jp/products/docs/pendingpayment https://www.paypay.ne.jp/opa/doc/jp/v1.0/pending_payments

PayPay から公式に提供されている SDK を見てみると、全 API を使えるクライアントが生成されるので、各インテグレーションに適した API の呼び出しを SDK 利用者がピックアップして利用する必要があります。それでも全く問題ありませんが、せっかくなので mythrnr/paypayopa-sdk-go ではインテグレーションごとにクライアントを生成するアプローチを採り、使える API を絞りました。

絞ることで API ドキュメントと同じ補完だけが効くようになるので、SDK 利用者のアプリケーションの各機能の実装の集中にわずかでも寄与できるのではと考えています。PayPay に仕様をガッツリ変えられると破綻しますが、決済サービスなのでアナウンスと十分な期間が与えられるはず...

使い方

READMEGoDoc を見てもらうのが一番ですが、簡単に使用方法をご紹介します。

https://pkg.go.dev/github.com/mythrnr/paypayopa-sdk-go

何はともあれ、取得しましょう

go get github.com/mythrnr/paypayopa-sdk-go

1. 認証情報を設定する

paypayopa.Env* で接続先を指定し、PayPay for Developers で発行された API Key , API Key Secret , Merchant ID を指定します。

creds := paypayopa.NewCredentials(
    paypayopa.EnvSandbox,
    "API_KEY",
    "API_KEY_SECRET",
    "MERCHANT_ID",
)

2. 必要なインテグレーション向けのクライアントを生成する

ここでは Web Payment を例にします。

client := paypayopa.NewWebPayment(creds)

自前の HTTP クライアントを指定することもできます。

// 例: 10s でタイムアウトする設定, プロキシなど
hc := &http.Client{Timeout: 10*time.Second}
client := paypayopa.NewWebPaymentWithHTTPClient(creds, hc)

3. 使う

例: QR コードを生成する

data, info, err := client.CreateCode(
    context.Background(),
    &paypayopa.CreateQrCodePayload{
        MerchantPaymentID: uuid,
        Amount: &paypayopa.MoneyAmount{
            Amount:   1000,
            Currency: paypayopa.CurrencyJPY,
        },
        CodeType:     paypayopa.CodeTypeOrderQR,
        RedirectURL:  "https://localhost",
        RedirectType: paypayopa.RedirectTypeWebLink,
    },
)

if err != nil {
    log.Fatal(err)
}

if !info.Success() {
    log.Fatal(info)
}

log.Print(data)
  • data はレスポンスの本体です。API が成功のレスポンスを返した場合のみ返されます。
  • info は API の処理結果が返ります。HTTP ステータスが 200 でも 500 でも、API が読み取り可能なレスポンスを返してきたのであれば返ります。
  • err はリクエストとレスポンスのハンドリング時にエラーがあった場合に返ります。err が返ると data , infonil が返ります。

上記は他の API でも同様です。削除系の API は戻り値が無いので、 infoerr のみ返されます。表にするとこんな感じになります。

HTTP 2xx HTTP 4xx, 5xx Error
data not nil nil nil
info not nil, info.Success() == true not nil, info.Success() == false nil
err nil nil not nil

フロントエンドとの連携のサンプル

PayPay の SDK には一部の機能について 導入サンプル が用意されています。この例に倣い、 mythrnr/paypayopa-sdk-go のサンプルとして mythrnr/paypay-sample-ecommerce-backend-go を用意してあります。フロントエンドは paypay/paypay-sample-ecommerce-frontend を拝借し、そのまま利用することが可能です。

https://github.com/mythrnr/paypay-sample-ecommerce-backend-go

おわりに

(暇だし)無いなら作っちゃうか〜〜で作りはじめてしまった SDK ですが、作成の過程で色々悩んだなりに学びがありました。それにしても、PayPay のドキュメントは見た目とかじゃなく見やすいですね。ズラッと API が並んでいるのが一般的だと思いますが、開発者が導入したいであろう機能をインテグレーションとして分けることで、導入に集中することができますし、ハードルも下がります。一方で SDK を作っていると一覧で見たいとも思ってしまい...w

また、日本のサービスなので当然なのかもしれませんが、日本語があるのも嬉しいです。ただ、API ドキュメントは一部情報が欠落していたので英語版を読んだほうが良さそうです。

以上、 mythrnr/paypayopa-sdk-go のご紹介でした。
ここまでご覧いただきありがとうございました。

Discussion