カテゴリー:
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コード抜粋
添付ファイルは、success_urlに記述しているPHPコード抜粋です
▼success_urlに記述しているPHPコード抜粋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コード抜粋です
<?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の手順に該当しなくなります。
そのため、リダイレクトがうまくいかない際の対策としては、Webhookを活用してcheckout.session.completed イベントの通知を受け取った後に、別途顧客へメールでファイルやダウンロードリンクを送信できるかと存じます:https://stripe.com/docs/payments/checkout/fulfillment#webhooks
リダイレクトされる場合、もしくはされなかった場合でも、Success_url 内ではなくリダイレクトページ内にZipファイルがダウンロードできるよう開発されることをお薦めいたします。
なお、Stripe Checkout フォームのリダイレクトは、顧客が御社ウェブサイトへ遷移しZipファイルをダウンロードやする前に行われます。そのため、リダイレクトされた後のアクションは、Checkout手順とは別対応となることご留意ください。ダウンロードのページやリンクが表示される前に発生しますが、その後の設定については Checkoutの手順に該当しなくなります。
返信
Stripeシステムの問題ではなく、実装記述場所の問題ですね。
Success_url 内ではなく、その先のページにて処理するよう変更しました。
Success_url 内ではなく、その先のページにて処理するよう変更しました。