Q71 / A / 返信

「決済」及び「開発」関連用語集

カテゴリー: QA  閲覧数:315 配信日:2019-08-28 11:51


Q71


CheckoutSessionで、success_urlに指定したURLでzipダウンロードすると、success_urlへ遷移しない
2019/8/28
Q1.CheckoutSessionで、success_urlに指定したURLでzipダウンロードすると、success_urlへ遷移しないのですが、
success_urlへ遷移しない要件としてはどんなことが挙げられますか?

※success_urlに指定したURLでzipダウンロードしなければ、success_urlへ無事遷移します

Q2.CheckoutSessionで、success_urlへ遷移しなかった場合、success_urlへ(ボタンクリックなどの)手動で遷移させることは出来ますか?

----------------------------------------------------------------
< 試した内容 >
親アカウント
acct_xxxx

子アカウント
acct_xxxx

子アカウントでログを見ると、処理自体は成功しているように見えます。エラー表示されていません
https://dashboard.stripe.com/test/events/evt_1FCGraLlsmkNgPt85x7K1Byv

親アカウントでWebhookを確認すると、処理自体は成功しているように見えます。エラー表示されていません
https://dashboard.stripe.com/test/webhooks/we_1FApFFEfFqi3KPm39pJRvTEu

チェックアウト画面のまま遷移しないURL
https://checkout.stripe.com/pay/cs_test_FKL5xm2RgctI99mMVwCH4J9VlFE0m1uQ8YvGkWJwPjEtoqpzKCPFmHLN#fidkdWxOYHwnPyd1blpxYHZxWlFmQlRBU0NkXDBPc2RdVkxARE9yMEBGfDU1UFJuPXJxV0MnKSd2cXdsdWBEZmZqcGtxJz8nZGZmcVo0QzV%2Fck9JaXZobktiVXE9Jyknd2BjYHd3YHdKd2xibGsnPydtcXF1dj8qKnFsdWgrZHVoK3FqbnxqJyknaGxhdic%2FfidicGxhJz8nZGM8ZDc9MDMoYDJhNigxM2AzKD03ZD0oZ2EwYTxkMDI9ZDU8JyknaHBsYSc%2FJ2cwPWNmM2BgKDYzY2EoMTY2NShkPWZhKGc8MjIyNDVnPT1jNycpJ3ZsYSc%2FJzNgPTA8ZmQ8KDA0NzwoMTc9PShnMTc0KGBkZjM0PGExNDczZCd4KSdnYHFkdic%2FXlh4JSUl


PHPコード抜粋
\Stripe\Checkout\Session::create([
 'payment_method_types' => ['card'],
 'line_items' => [[
   'name' => "デモ",
   'amount' => 200,
 ]],
 'payment_intent_data' => [
   'application_fee_amount' => 200,
 ],
 'success_url' => 'http://'.SERVER_URL.'/stripe/charge-success?session_id={CHECKOUT_SESSION_ID}',
 'cancel_url' => 'http://'.SERVER_URL.'/stripe/charge-cancel',  
], [
 'stripe_account' => 'acct_xxxx', //販売者である子アカウントの「Accountオブジェクトのidプロパティ値」を入力
]);


添付ファイルは、success_urlに記述しているPHPコード抜粋です
▼success_urlに記述しているPHPコード抜粋
<?php
function zipDownload($pPath, $pMimeType = null)
{
   //-- ファイルが読めない時はエラー(もっときちんと書いた方が良いが今回は割愛)
   if (!is_readable($pPath)) { die($pPath); }

   //-- Content-Typeとして送信するMIMEタイプ(第2引数を渡さない場合は自動判定) ※詳細は後述
   $mimeType = (isset($pMimeType)) ? $pMimeType
                                   : (new finfo(FILEINFO_MIME_TYPE))->file($pPath);

   //-- 適切なMIMEタイプが得られない時は、未知のファイルを示すapplication/octet-streamとする
   if (!preg_match('/\A\S+?\/\S+/', $mimeType)) {
       $mimeType = 'application/octet-stream';
   }

   //-- Content-Type
   header('Content-Type: ' . $mimeType);

   //-- ウェブブラウザが独自にMIMEタイプを判断する処理を抑止する
   header('X-Content-Type-Options: nosniff');

   //-- ダウンロードファイルのサイズ
   header('Content-Length: ' . filesize($pPath));

   //-- ダウンロード時のファイル名
   header('Content-Disposition: attachment; filename="' . basename($pPath) . '"');

   //-- keep-aliveを無効にする
   header('Connection: close');

   //-- readfile()の前に出力バッファリングを無効化する ※詳細は後述
   while (ob_get_level()) { ob_end_clean(); }

   //-- 出力
   readfile($pPath);

   //一時ファイル(zipファイル)の削除
   unlink($pPath);

   //-- 最後に終了させるのを忘れない
   exit;
}

$zipName = 'archive.zip';

$zipPath = '/var/www/htmlxxxx/tmp';

$command =  'cd ' . $zipPath . ';' . // exampleディレクトリへ移動
       'zip -rjo '. $zipName . ' /var/www/html/xxxx/file/'; // targetディレクトリを圧縮しmyfile.zipを作成

exec($command);  // コマンド実行
// zipファイルパス
$zipFilePath = $zipPath.'/'.$zipName;

// echo $zipPath;
// exit;
// zip出力
//-- Content-Typeを自動判定せずに指定する時
zipDownload($zipFilePath, 'application/zip');

?>


A


社内にて確認させていただきましたが、zipファイルのダウンロードは、Stripeシステム上ではなく御社のウェブサイト上で発生するものかと存じます。

そのため、リダイレクトがうまくいかない際の対策としては、Webhookを活用してcheckout.session.completed イベントの通知を受け取った後に、別途顧客へメールでファイルやダウンロードリンクを送信できるかと存じます:https://stripe.com/docs/payments/checkout/fulfillment#webhooks

リダイレクトされる場合、もしくはされなかった場合でも、Success_url 内ではなくリダイレクトページ内にZipファイルがダウンロードできるよう開発されることをお薦めいたします。

なお、Stripe Checkout フォームのリダイレクトは、顧客が御社ウェブサイトへ遷移しZipファイルをダウンロードやする前に行われます。そのため、リダイレクトされた後のアクションは、Checkout手順とは別対応となることご留意ください。ダウンロードのページやリンクが表示される前に発生しますが、その後の設定については Checkoutの手順に該当しなくなります。

返信


Stripeシステムの問題ではなく、実装記述場所の問題ですね。

Success_url 内ではなく、その先のページにて処理するよう変更しました。


週間人気ページランキング / 9-1 → 9-7
順位 ページタイトル抜粋 アクセス数
1 Stripe Q74.「お客様のビジネスの詳細」とは何ですか? | Stripe 8
2 Stripe プレフィックスがある「オブジェクトの値」など | その他エントリー(Stripe) 4
2 EMVレベル1 / EMVレベル2 / EMVCo とは? 4
2 EMVCo | クレジットカード仕様(仕様) 4
3 「払い戻し」と「チャージバック」の違い | 違い 3
3 Twitch | ゲーム実況配信サービス(課金販売できるプラットフォーム) 3
3 Stripe Q1。Stripeにおける個人事業主の定義 | QA(Stripe) 3
4 決済用語 2
4 Stripe webhook 配信の問題 | その他エントリー(Stripe) 2
4 Stripe Q49。 Connect 「Standardアカウント」で、自身の子アカウントでも商品販売する場合、被る不利益はありますか? | QA(Stripe) 2
4 Stripe Payments > PREPARING FOR SCA > Payment Intents | documentation(Stripe) 2
4 振込 | 送金 2
4 Stripe Q30。Checkout (new) の「Checkout Server Quickstart」の「Step 2: Add Checkout to your website」について | QA(Stripe) 2
4 Stripe Q13。決済成功時に、「請求に紐づけられたメールアドレス」に対して、メール送信したいのですが、 | QA(Stripe) 2
4 Stripe Connect Customアカウント の検討 | Stripe 2
4 Q31-2 / Q31-2A抜粋 / Q31-2A-2抜粋 2
5 Stripe Q56. 作成したCheckout\Sessionオブジェクトが破棄されるタイミングは? | QA(Stripe) 1
5 Stripe Q11。テストAPIで、実際のカード番号を入力したらどうなりますか? | QA(Stripe) 1
5 Stripe Q16。PaymentIntentの支払いで郵便番号入力を求められる。Radar rules の ZIP code を無効にしているのに | QA(Stripe) 1
5 Stripe Q35。「Payment Intents API」で、3Dセキュアなどの認証手順を(顧客が)使用しないことは出来ますか? | QA(Stripe) 1
2024/9/8 1:01 更新
指定期間人気ページランキング / 2020-5-28 → 2024-9-7
順位 ページタイトル抜粋 アクセス数
1 Stripeアカウントへログインする際、モバイル端末で受信したコード入力を求められる理由は? | その他エントリー(Stripe) 2016
2 EMVCo | クレジットカード仕様(仕様) 1312
3 Stripe Q13。決済成功時に、「請求に紐づけられたメールアドレス」に対して、メール送信したいのですが、 | QA(Stripe) 963
4 Stripe Q16。PaymentIntentの支払いで郵便番号入力を求められる。Radar rules の ZIP code を無効にしているのに | QA(Stripe) 917
5 Twitch | ゲーム実況配信サービス(課金販売できるプラットフォーム) 912
6 クレジットカード決済 | 課金 908
7 決済用語 870
8 Stripe Q50。 Connect 「Standardアカウント」で、自身に連結された子アカウントを、ダッシュボードから削除するには? | QA(Stripe) 842
9 Stripe Q1。Stripeにおける個人事業主の定義 | QA(Stripe) 790
10 Omise | 「支払」機能を有する決済系サービス(決済サービス) 784
11 pixivFANBOX | クリエイター支援プラットフォーム(課金販売できるプラットフォーム) 779
12 EMVレベル1 / EMVレベル2 / EMVCo とは? 777
13 Stripe Q31。ダッシュボードでの「支払い作成」の見方について | QA(Stripe) 745
14 YouTube | 動画サービス(課金販売できるプラットフォーム) 716
15 プリペイドカード | カード 648
16 EPUB | ファイルフォーマット(電子書籍) 613
17 Stripe Q74.「お客様のビジネスの詳細」とは何ですか? | Stripe 569
18 サブスクリプション | 課金 565
19 Stripeで"No such token: src"と表示されたら、最初にAPIキーを確認する | Stripe エラー(Stripe) 564
20 ファンティア | クリエイター支援プラットフォーム(課金販売できるプラットフォーム) 484
2024/9/8 1:01 更新