💸PayPalのAPI認証キーの妥当性検証

mzpです。

最近、実装した機能についての話を書きます。最初は会社のLADRに書いて設計意図を残すつもりだったんですが、別に秘密にする内容でもないなと思いなおしたので、ここに書きます。

📝 要約

PayPalAPI認証キーが正しいかどうかの確認にはGetPalDetailsが便利。

💸 Misocaペイメント

Misocaでは、発行した請求書への支払いをPayPal経由で行なうMisocaペイメントという機能を提供しています。 かなり前からある機能で、私の入社よりも前に開発されました。

f:id:mzp:20170804173529p:plain

この機能を利用する際には、PaypalビジネスアカウントのAPI認証キーである「APIユーザー名」「APIパスワード」「署名」の3点を入力してもらっています。

f:id:mzp:20170804174107p:plain

ただ、この入力内容は保存ボタンを押したタイミングでAPI認証キーの妥当性を確認していないため、正しく支払いができる状態でないのに請求書を発行してしまう、などの問題が生じていました。

🔎妥当性検証に使えるAPI

NVP and SOAP API Referenceを確認したところ、PayPal IDを取得するGetPalDetailsが、余分な影響を与えることなく、API認証キーの正しさを確認できてよさそうでした。

他にもOAuthのAccessTokenを発行することで確認する方法(Is there a way to verify API credentials via test API call? · Issue #158 · paypal/PayPal-Ruby-SDK )がありましたが、API認証キーのほかにOAuth ClientIDが必要なようだったので断念しました。

🛠妥当性検証の実装

PayPalAPI呼出しにはpaypal-sdk-merchant gemを利用して、以下のように実装しました。

# frozen_string_literal: true

module Misoca
  module PaymentSetting
    class VerifyPaypal
      def initialize(credential)
        @api = ::PayPal::SDK::Merchant.new
        @api.set_config(
          username: credential.login,
          password: credential.password,
          signature: credential.signature
        )
      end

      def call
        # 検証するだけのAPIは存在しないため、GetPalDetailsで代用している
        # https://developer.paypal.com/docs/classic/api/merchant/GetPalDetails_API_Operation_NVP/
        response = api.get_pal_details
        response.success?
      end

      private

      attr_reader :api
    end
  end
end

以下のように利用できます。

# 正しいAPI認証キーの場合
credential =  OpenStruct.new(login: '...', password: '...', signature: '...') }
Misoca::PaymentSetting::VerifyPaypal.new(credential).call # => true

credential.login= 'xxx'
Misoca::PaymentSetting::VerifyPaypal.new(credential).call # => false

🔊採用

Misocaでは設計意図を記録できるソフトウェアエンジニアを募集しています。