目次
データサイエンティスト。PythonとRでデータ解析を行っています。
インターネット上に自分の商品の販売ページを生成する方法は Amazon に出店、BASE、STORES.jp、SPIKE など様々です。そうではなく、ここでは商品ページは自サイトにあり、決済手段だけを導入したい場合を考えます。具体的には、審査が通った一部の法人向けに昨年から日本でも利用できるようになった Amazon ログイン&ペイメントや、開発者向けドキュメントが充実している日本発の WebPay の類の決済手段です。ここでは特に eBay などを含み世界的にも標準の決済手段である PayPal を対象とします。最新のドキュメントが日本語化されておらず、開発時の情報が不足している状況が少しでも改善されればと思い、その使い方をまとめます。ここでは法人または個人事業主としてのビジネスアカウントの開設および本人確認手続きは完了しているものとします。プレミアアカウントでも問題ありません。Business と Premier の他には Personal, Student があります。
エクスプレスチェックアウト (API 決済) について
PayPal が提供する決済手段には、請求用のリンクが記載されたメールの送付、静的な HTML の埋め込み、OAuth を利用した動的な API 決済などがあります。本ページでは、エクスプレスチェックアウトとよばれる API 決済を対象とします。
公式ドキュメント
英語ドキュメント
本ページの内容を越えるものは、以下の公式ドキュメントを参照してください。
- Express Checkout (API 決済)
- REST API を利用します (NVP/SOAP は Classic 扱いです)
- Express Checkout with In-Context integration guide
- Express Checkout (API 決済) へのフロントエンドに関する機能追加です
- In-Context にモーダルのような画面を表示することで PayPal 専用ページへの遷移をなくします
- 日本と日本円がサポートされていることの確認
- その他、必要になりそうなページ
- OAuth 2.0 関連
- HATEOAS links
- API リクエストのレスポンスには HATEOAS links とよばれる、更なる問い合わせを行うためのエンドポイントが含まれています
日本語ドキュメント (2016/08/14 現在、情報が古いため参考情報扱い)
日本語ドキュメントでは NVP/SOAP の記載なされていますが、英語ドキュメントでは Classic 扱いです。REST API を利用しましょう。
認証情報やテストアカウントを事前に準備
- merchant ID
- PayPal アカウントでログイン
- 右上の「アカウント設定」→「プロフィール設定」
- マーチャントアカウントID
XXXXXXXXXXXXX
を確認
- client_id and secret
- PayPal アカウントでログイン (ドキュメント内ですが、右上の LogIn ボタンからログインできます)
- "My Apps & Credentials" → "REST API apps" → "Create App"
Client ID
とSecret
を Sandbox (テスト環境) と Live に関して確認
- Sandbox Test Accounts
- テスト環境で使用するためのダミーアカウントを二つ用意します (facilitator 売り手と buyer 買い手)
PayPal 支払いボタンの設置
公式ドキュメントでサンプルコードとして示されている以下の HTML を自分のサイトに組込みます。
<form id="myContainer" method="post" action="/checkout"></form>
<script>
window.paypalCheckoutReady = function() {
paypal.checkout.setup('Merchant-ID', {
environment: 'sandbox',
container: 'myContainer'
});
};
</script>
<script src="//www.paypalobjects.com/api/checkout.js" async></script>
checkout.js
は最新のものを外部から都度読み込んで使用します。id が myContainer
の form タグを container
に指定することで、支払いボタン用の CSS が form タグに適用されます。Merchant-ID
は事前に取得した XXXXXXXXXXXXX
に書き換えてください。/checkout
は PayPal に対して REST で API 実行するためのエンドポイントです。次のステップで実装します。
Rails を用いたサンプルコード
買い手が何らかの商品を指定した状態で先程設置した支払いボタンをクリックすると /checkout
向けに HTTP POST リクエストが発生します。/checkout
はこれに対し、今から買い手に請求する予定の内容を HTTP POST で PayPal REST API に送信します。PayPal API が正しいサイトからのリクエストであると判断すると、買い手が PayPal ログインするために必要な情報が含まれたレスポンスが返されます。/checkout
はこれらの情報をもとに買い手を PayPal のページにリダイレクトします。/checkout
を実装するためには、こちらのチュートリアルにしたがって REST API に対して HTTP POST すればよいのですが、各プログラミング言語用の SDK を利用すると比較的簡単に実装できます。ここでは特にbundler が導入済みの Rails で ruby SDK を利用する場合を考えます。
Gemfile
gem 'paypal-sdk-rest'
設定ファイルの生成
bundle exec rails g paypal:sdk:install
app/views/main/index.html.erb (Rails の場合は CSRF の機能があるため POST に form_authenticity_token
を含めます)
<form id="myContainer" method="post" action="/checkout">
<input type="hidden" value="<%= form_authenticity_token %>" name="authenticity_token">
</form>
<script>
window.paypalCheckoutReady = function() {
paypal.checkout.setup('Merchant-ID', {
environment: 'sandbox',
container: 'myContainer'
});
};
</script>
<script src="//www.paypalobjects.com/api/checkout.js" async></script>
config/routes.rb
post '/checkout' => 'paypal#checkout'
get '/execute' => 'paypal#execute'
app/controllers/paypal_controller.rb
class PaypalController < ApplicationController
def checkout
# 仮に、計 200 円の商品が買い物かごの中に入っていたとします。
payment = PayPal::SDK::REST::Payment.new({
intent: 'sale',
payer: {
payment_method: 'paypal',
},
redirect_urls: {
return_url: 'http://localhost:3000/execute', # 買い手の承認が得られた場合の遷移先
cancel_url: 'http://localhost:3000/', # 買い手がキャンセルしたときの遷移先
},
transactions: [
{
amount: {
total: 200,
currency: 'JPY',
},
item_list: {
items: [
{
price: 100,
currency: 'JPY',
quantity: 1,
name: 'サンプルアイテム A', # 日本語を使用する場合、本ファイルは UTF-8 で保存しましょう。
},
{
price: 50,
currency: 'JPY',
quantity: 2,
name: 'サンプルアイテム B', # 日本語を使用する場合、本ファイルは UTF-8 で保存しましょう。
},
],
},
},
]})
# PayPal API に HTTP POST リクエストを行い、その結果で処理を分岐します。
if payment.create
redirect_to payment.links.find{|v| v.rel == 'approval_url'}.href
else
render text: payment.error # 何らかのエラー処理を行います。
end
end
def execute
# 買い手の PayPal アカウントから売り手の PayPal アカウントへの支払いを実行します。
payment = PayPal::SDK::REST::Payment.find(params[:paymentId])
# 配送先の住所が必要な場合は以下のように格納されています。
# 最終確認をしたい場合は execute の前に 1 ページ画面をはさみましょう。
#payment.transactions.first.item_list.shipping_address
if payment.execute(payer_id: params[:PayerID]) # 本サンプルではそのまま決済を確定させます。
render text: '決済が完了しました。'
else
render text: payment.error # 何らかのエラー処理を行います。
end
end
end
決済ボタンのデザインを変更する
checkout.js
のソースコードを確認すると、container
ではなく button
を指定すれば任意のデザインのボタンを決済ボタンに指定できることが分かります。
<form method="post" action="/checkout">
<input type="hidden" value="<%= form_authenticity_token %>" name="authenticity_token">
<button id="myButton" class="btn btn-default">PayPal でお支払い</button>
</form>
<script>
window.paypalCheckoutReady = function() {
paypal.checkout.setup('Merchant-ID', {
environment: 'sandbox',
button: 'myButton'
});
};
</script>
<script src="//www.paypalobjects.com/api/checkout.js" async></script>
記事の執筆者にステッカーを贈る
有益な情報に対するお礼として、またはコメント欄における質問への返答に対するお礼として、 記事の読者は、執筆者に有料のステッカーを贈ることができます。
さらに詳しく →Feedbacks
ログインするとコメントを投稿できます。
関連記事
- レイアウトおよび部分テンプレートに関するまとめ (Rails4)レイアウトおよび部分テンプレートはどちらもテンプレート (*.html.erb) に共通の要素をまとめておき、任意のテンプレートから利用できるようにしておくための仕組みです。フッターやヘッダーといった大枠はレイアウト、小さなパーツは部分テンプレートというイメージで使い分けましょう。 レイアウトの使用方法 クラス毎に指定する方法と、アクション毎に指定する方法があります。 app/views/layo...
- Ruby コードスニペット (正規表現)sample.rb str = "001: This is a string." var1,var2 = 2,3 # 'EOS'とすると#{}による変数展開がなされない (%03dは展開される) doc = (<<"EOS" % var1) # 括弧は省略可。要は<<"EOS"の次の行からEOSまで。(参: <<-"EOS"とすると前に空白...
- OAuthを用いずにTwitterに自動投稿する (回数制限あり, Selenium with Ruby)Seleniumを用いて、OAuthを用いずにTwitterに自動投稿するRubyスクリプトを記述してみます。連続で複数回実行すると、ボット判定としてキャプチャ認証が発生します。その認証までは通過できませんので悪しからず。また、Twitterの仕様変更次第ではDOMの構造が変化するため、下記サンプルは機能しなくなる恐れが有ります。 twitter_post.rb #!/usr/bin/ruby r...
- Ruby における日本語のエンコーディング日本語を含めて多言語対応する際には、Asciiコード以外の文字コードセットが必要になります。日本語が主となる場合、よく使われる文字セットにはUnicode, Shift_JIS, EUC-JPがあります。このうち Unicode だけは特殊であり、世界中のあらゆる文字を収録しようとしていることから 1 文字を表現するために必要なバイト数が大きくなってしまっています。そのため Unicode のうち...
- Rails3ビューテンプレートの基本的な使用方法 (Ruby)Railsでは、ERB (eRuby (テキストファイルにRubyスクリプトを埋込む書式の仕様) をRubyで実装したもの) を用いてHTML内にRubyスクリプトを埋込むことができます。 <% %> で囲むと出力されません (if-elseなど制御構文を記述します) <%= %> で囲むとエスケープ出力されます <%== %> で囲むとエスケープされずに...