決済ゲートウェイガイド
旅行予約サイトのためのRazorpay API連携
Razorpayはインド向けの決済ゲートウェイで、カード、UPI、ネットバンキング、ウォレットをルピーで受け付けます。このガイドでは、フライト・ホテル・ツアー予約でRazorpay決済がどう流れるかと、PHPTRAVELSでの正確な対応状況を説明します。Razorpayは現時点で標準コネクタではありませんが、お客様が所有するソースコード上でカスタム連携として追加できます。
- カード、UPI、ネットバンキング、ウォレット
- 注文、Checkout、売上確定
- 署名とWebhookの検証
- 全額・一部返金
Razorpay概要
Razorpayとは何か、PHPTRAVELSでの位置づけ
Razorpayはインドの決済ゲートウェイです。インドの顧客に販売する旅行会社は、デビットカード・クレジットカード、UPI、ネットバンキング、主要ウォレットといった顧客が期待する決済手段を、チェックアウトで受け付けるために利用します。決済と入金はすべてインドルピーで、加盟店ご自身のRazorpayアカウントに行われます。
PHPTRAVELSは、完全なソースコードが付属するセルフホスト型の旅行予約プラットフォームです。標準の決済ゲートウェイは、ご自身の加盟店認証情報で有効化できるライブ一覧から提供されます。Razorpayは現時点でその一覧になく、管理画面にもまだ有効化スイッチはありません。
だからといって使えないわけではありません。コードをお持ちなので、RazorpayはカスタムAPI連携として追加できます。また、インドでは標準で利用できるゲートウェイとしてCashfreeがあります。今すぐ有効化できるゲートウェイは決済ゲートウェイ連携ページにまとめています。

Razorpayファクトシート
- 概要
- インドの事業者向け決済ゲートウェイ
- 決済手段
- カード、UPI、ネットバンキング、ウォレット
- 通貨
- INRで決済・入金。金額はpaise単位で送信
- APIキー
- Key IDとKey Secret。テストモードと本番モードで別々
- PHPTRAVELSでの状況
- 標準コネクタではありません。付属のソースコード上でカスタム連携として追加可能
- インドで今すぐ使えるもの
- Cashfree。ご自身のCashfreeアカウントで管理画面から有効化
決済の流れ
旅行予約におけるRazorpay決済1件をステップごとに
Razorpay連携は、旅行者のブラウザとお客様のサーバーで役割を分担します。ブラウザはCheckoutを表示し、サーバーは注文を作成し、結果を確認し、予約を確定するタイミングを判断します。
- 01
お客様のサーバー
注文を作成
旅行者が支払いボタンを押すと、サーバーがOrders APIを呼び出し、paise単位の金額、通貨、予約番号を設定したreceiptを送ります。Razorpayはorder_idを返します。
- 02
ブラウザ
Razorpay Checkoutを開く
予約ページがKey IDとそのorder_idでCheckoutを開くため、旅行者はサーバーが確定した金額どおりに支払います。
- 03
ブラウザ
旅行者が支払う
旅行者はカード、UPI、ネットバンキング、ウォレットのいずれかを選び、銀行が求める手続きを完了します。これで決済はオーソリ済みになります。
- 04
ブラウザ
Checkoutが3つの値を返す
成功すると、Checkoutはrazorpay_payment_id、razorpay_order_id、razorpay_signatureを返し、ページがそれらをサーバーに送信します。
- 05
お客様のサーバー
署名を検証
サーバーはKey Secretを使い、order_idとpayment_idから署名を再計算します。一致した署名だけを本物の決済として扱います。
- 06
お客様のサーバー
決済を売上確定
自動売上確定ならRazorpayが確定します。手動売上確定なら、航空会社・ホテル・ツアーのサプライヤーが確認してからサーバーが確定するため、失敗した予約に課金されることはありません。
- 07
お客様のサーバー
予約を確定
予約が支払い済みに変わり、チケットまたはバウチャーが発行され、Razorpayのpayment_idが予約番号に紐づいて保存されます。
- 08
お客様のサーバーサーバー間通信
Webhookを受信
Razorpayはpayment.capturedなどのイベントもWebhook URLに送信します。ページが結果を報告する前に旅行者がタブを閉じた場合にも対応できます。
署名とWebhook
Razorpay連携の信頼性を守る2つの検証
ブラウザやインターネット経由で届くものは、すべて偽装され得ます。Razorpay連携は、サーバーの外に出ない秘密鍵で作った署名を確認してはじめて、決済を信頼します。
1// 1. After Checkout: verify the payment signature 2$orderId = $booking["razorpay_order_id"]; // from your own record 3$paymentId = $_POST["razorpay_payment_id"]; 4$signature = $_POST["razorpay_signature"]; 5$expected = hash_hmac("sha256", $orderId . "|" . $paymentId, $keySecret); 6if (!hash_equals($expected, $signature)) { rejectPayment(); } 7markPaid($booking["ref"], $paymentId); 8 9// 2. Webhook: verify X-Razorpay-Signature over the raw body10$body = file_get_contents("php://input");11$header = $_SERVER["HTTP_X_RAZORPAY_SIGNATURE"] ?? "";12$expect = hash_hmac("sha256", $body, $webhookSecret);13if (!hash_equals($expect, $header)) { http_response_code(400); exit; }14$event = json_decode($body, true);15if (alreadyHandled($event)) exit; // repeat delivery16switch ($event["event"]) {17 case "payment.captured": confirmBooking($event); break;18 case "refund.processed": markRefunded($event); break;19}
ロジックを示すための説明用の擬似コードで、そのまま使えるファイルではありません。正確な呼び出しはRazorpayの公式ドキュメントとSDKに従ってください。
決済の署名
order_id、パイプ、payment_idをKey SecretでHMAC SHA256にかけた値が、razorpay_signatureと一致する必要があります。比較には定数時間の関数を使います。
Webhookの署名
各WebhookにはX-Razorpay-Signatureヘッダーが付きます。これは、Razorpayダッシュボードで設定したWebhookシークレットを鍵とした、生のリクエストボディのHMAC SHA256です。
重複配信
Webhookは複数回、あるいは順不同で届くことがあります。イベントIDと決済IDを記録し、予約にすでに反映したイベントは無視してください。
秘密情報はサーバー側に
ブラウザに渡すのはKey IDだけです。Key SecretとWebhookシークレットはサーバー設定に置き、ページのソースやモバイルアプリには決して含めません。
返金とキャンセル
旅行の返金は全額とは限りません
キャンセル料、ノーショーのルール、一部キャンセルされた旅程などにより、旅行の返金は一部返金になることが多くあります。RazorpayのRefunds APIは両方に対応し、返金額は予約ルールに基づいて連携側で決めます。
全額返金
無料キャンセルでは、売上確定した全額が旅行者が支払いに使った手段へ戻ります。
一部返金
キャンセル料を差し引いた後、サーバーは残額だけを返金します。金額は元の注文と同じくpaise単位で送ります。
旅程の一部
ホテル1泊分や1名分だけをキャンセルしてその分を返金できます。確定総額に達するまで、追加の一部返金も可能です。
refund.processed
返金Webhookにより、返金の完了がサーバーに通知され、予約と旅行者に正しいステータスが表示されます。
予約に紐づけて保存
返金IDは、予約番号と元のpayment_idとともに保存され、経理チームが参照できます。
例:キャンセル料がかかる場合
- 売上確定額
- ₹12,500.00 amount: 1250000
- キャンセル料
- ₹1,500.00 amount: 150000
- 返金額
- ₹11,000.00 amount: 1100000
数値は例です。Razorpayは最小通貨単位で金額を受け取るため、100 paiseが1ルピーです。
Razorpayの接続方法
Razorpayを使う、使わないを含む3つの決済受付方法
チームと公開時期に合う方法を選んでください。いずれも資金はお客様自身の加盟店アカウントに入り、PHPTRAVELSが精算に介在することはありません。
オプション1
自社の開発者が追加
PHPTRAVELSには完全なソースコードが付属するため、自社の開発者が既存のゲートウェイと並べてRazorpayを新しいゲートウェイとして追加できます。注文作成、決済ステップでのCheckout、署名検証、売上確定、Webhook、返金までを実装します。
- Razorpayのテストモードキーで構築・検証
- 予約番号を注文のreceiptとして再利用
- テスト予約が通ったら本番キーに切り替え
オプション2
PHPTRAVELSが構築
当社の開発者がカスタムAPI連携として、Razorpayコネクタを代行構築します。要件をお送りいただければ、着手前に費用と納期をご提示し、完了時にテスト済みのソースコードをお渡しします。
- 着手前にお見積り
- Razorpayのテストモードで構築
- お客様が所有するソースコードとして納品
オプション3
標準ゲートウェイを今すぐ使う
まず公開したい場合は、プラットフォームに用意済みのゲートウェイを有効にします。インドならCashfreeです。現在利用できる標準ゲートウェイは次のとおりです。
- CashfreeCashfreeのセットアップガイド
- Stripe
- PayPal
- xMoney
- Fawaterk
- Paystack
標準ゲートウェイ
今すぐ有効にできる決済ゲートウェイ
この一覧はPHPTRAVELSのゲートウェイディレクトリからライブで取得しています。いずれも、ご自身のアカウントとキーで管理画面から有効にします。
Cashfree
Stripe連携ガイドPayPal連携ガイド
xMoney
Fawaterk
Paystack
Flutterwave
Adyen
MyFatoorah
SSLcommerz
Razorpay- すべての連携
各ゲートウェイの裏で動く呼び出しを知りたい方は、決済ゲートウェイAPIのガイドをお読みください。Stripe決済とPayPal 決済のガイドの比較や、B2Bポータルで代理店がB2B エージェントウォレットから支払う仕組みもご覧いただけます。
標準コネクタとしては対応していません。Razorpayは現在PHPTRAVELSのゲートウェイ一覧になく、管理画面で有効化することはできません。完全なソースコードが付属するため、自社または当社の開発者がカスタム決済ゲートウェイ連携として追加できます。
CashfreeはPHPTRAVELSの標準ゲートウェイで、docs.phptravels.com/payments/cashfreeにセットアップガイドがあります。ご自身のCashfreeアカウントで管理画面から有効にします。StripeやPayPalなど他の標準ゲートウェイは、決済ゲートウェイのページに掲載しています。
Razorpayはインドルピー建てで、カード、UPI、ネットバンキング、ウォレットに対応します。チェックアウトに表示される手段は、ご自身のRazorpayアカウントで有効にしている内容によって決まります。
Razorpayは最小通貨単位で金額を受け取るため、ルピー建ての予約合計に100を掛けてから注文を作成します。返金額も同じ方法で送ります。
Checkoutは決済ID、注文ID、署名を返します。サーバーはKey Secretを使って注文IDと決済IDのHMAC SHA256を計算し、結果が署名と一致した場合のみ決済を受け入れます。
自動売上確定のほうがシンプルです。手動売上確定なら、航空会社・ホテル・ツアーのサプライヤーが予約を確認してから確定できるため、失敗した予約は返金ではなく解放で済みます。商品とサプライヤーによって選びます。
はい。RazorpayのRefunds APIは全額返金と一部返金に対応しているため、キャンセル料を差し引いて残額を返せます。refund.processedのWebhookで、返金の完了がサーバーに通知されます。
はい。加盟店アカウント、Key IDとKey Secret、入金はお客様のものです。PHPTRAVELSがゲートウェイの認証情報を提供することも、資金を扱うこともありません。テストモードのキーで構築し、公開時に本番キーへ切り替えてください。
チェックアウト、手動売上確定、返金、代理店決済など、必要な範囲によって異なります。PHPTRAVELSのカスタム開発は着手前にお見積りします。プラットフォーム本体はから買い切りライセンスです。
