mzpです。
最近、実装した機能についての話を書きます。最初は会社のLADRに書いて設計意図を残すつもりだったんですが、別に秘密にする内容でもないなと思いなおしたので、ここに書きます。
📝 要約
PayPalのAPI認証キーが正しいかどうかの確認にはGetPalDetailsが便利。
💸 Misocaペイメント
Misocaでは、発行した請求書への支払いをPayPal経由で行なうMisocaペイメントという機能を提供しています。 かなり前からある機能で、私の入社よりも前に開発されました。
この機能を利用する際には、PaypalビジネスアカウントのAPI認証キーである「APIユーザー名」「APIパスワード」「署名」の3点を入力してもらっています。
ただ、この入力内容は保存ボタンを押したタイミングで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が必要なようだったので断念しました。
🛠妥当性検証の実装
PayPalのAPI呼出しには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では設計意図を記録できるソフトウェアエンジニアを募集しています。