質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Stripe

Stripeとは、米国のオンライン決済システム提供企業、及び同社が提供する決裁システムを指します。Webサイトやモバイルアプリにコードを組み込むことでクレジットカードなどの決済サービスが簡潔に追加できます。

WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

1回答

893閲覧

Stripeでdata-amountパラメータを受け取れない

scrollman

総合スコア83

Stripe

Stripeとは、米国のオンライン決済システム提供企業、及び同社が提供する決裁システムを指します。Webサイトやモバイルアプリにコードを組み込むことでクレジットカードなどの決済サービスが簡潔に追加できます。

WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

1クリップ

投稿2018/09/03 00:59

編集2018/09/03 05:52

やりたい事

Stripeのcheckout.phpでdata-amountパラメータを受け取り、それを反映したい。

トラブル・問題

何故かStripeのdata-amountパラメータを受け取れません。

こちらがWordpressのショートコード追加関数で作った申込みフォームです。data-amountは5300としています。

php

1function pay_test() { 2 require_once ('/home/users/1/hoeghogehoge/web/hogehoge/wp-load.php'); 3 global $current_user; 4 get_currentuserinfo(); 5 $email = $current_user->user_email; 6 $label = '申し込む'; 7 echo ' 8 <form action="https://hogehogehoge.com/wp-content/themes/ALC/paysystem/checkout.php" method="POST"> 9 <script src="https://checkout.stripe.com/checkout.js" 10 class="stripe-button" 11 data-key="pk_test_hogehogehogehogehoge" 12 data-amount="5300" 13 data-name="hogehogeプラン" 14 data-description="hogehogeサポート・hogehoge代行" 15 data-image="https://stripe.com/img/documentation/checkout/marketplace.png" 16 data-locale="auto" 17 data-currency="jpy" 18 data-zip-code="false" 19 data-allow-remember-me="true" 20 data-email="' . $email . '" 21 data-label="' . $label . '"> 22 </script> 23 </form> 24 '; 25 } 26add_shortcode('pay_test', 'pay_test');

そしてこちらがcheckout.phpです。
https://stripe.com/docs/checkout
↑を参考にし、
$amount = $_POST['data-amount'];
でdata-amountを受け取ろうとしましたが、
var_dumpによるとNULL でした。
なぜでしょうか…?

php

1 2// Set your secret key: remember to change this to your live secret key in production 3// See your keys here: https://dashboard.stripe.com/account/apikeys 4\Stripe\Stripe::setApiKey("sk_test_hogehogehogehogehoge"); 5 6// Token is created using Stripe.js or Checkout! 7// Get the payment token submitted by the form: 8$token = $_POST['stripeToken']; 9$email = $_POST['stripeEmail']; 10$amount = $_POST['data-amount']; 11var_dump($amount); 12// フォームから情報を取得: 13try { 14 $charge = \Stripe\Charge::create(array( 15 "amount" => $amount, 16 "currency" => "jpy", 17 "source" => $token, 18 "description" => "alpha", 19 )); 20}catch (\Stripe\Error\Card $e) { 21 // 決済できなかったときの処理 22 die('決済が完了しませんでした'); 23}

この状態でテストモードによる支払いをしてみると、
売上は計上されず、ログのほうには

JSON

1{ 2 "error": { 3 "code": "parameter_missing", 4 "doc_url": "https://stripe.com/docs/error-codes/parameter-missing", 5 "message": "Missing required param: amount.", 6 "param": "amount", 7 "type": "invalid_request_error" 8 } 9}

このように出ます。やはりamountがなくなっているようです。

実験

PHP

1// Set your secret key: remember to change this to your live secret key in production 2// See your keys here: https://dashboard.stripe.com/account/apikeys 3\Stripe\Stripe::setApiKey("sk_test_hogehogehogehoge"); 4 5// Token is created using Stripe.js or Checkout! 6// Get the payment token submitted by the form: 7$token = $_POST['stripeToken']; 8$email = $_POST['stripeEmail']; 9$amount = $_POST['data-amount']; 10var_dump($amount); 11$amount = '500000'; 12// フォームから情報を取得: 13try { 14 $charge = \Stripe\Charge::create(array( 15 "amount" => $amount, 16 "currency" => "jpy", 17 "source" => $token, 18 "description" => "alpha", 19 )); 20}catch (\Stripe\Error\Card $e) { 21 // 決済できなかったときの処理 22 die('決済が完了しませんでした'); 23} 24

このように500000をあえて代入すると支払いは成功します。


http://d.hatena.ne.jp/kitokitoki/20080819/1219074548
こちらのサイトの入れ知恵で、

PHP

1foreach($_POST as $idx => $val){echo "$idx = $val<br>";}

これを使うとPOSTでとれるデータが全てとれるみたいなんですが、
これを使ってみると
stripeToken
stripeTokenType
stripeEmail
の3つしか受け取っていませんでした。なぜでしょうか…


英語なのでかなり浅い理解なのですが、海外のサイト⇓
https://gist.github.com/siddarth/1379771
https://stackoverflow.com/questions/39487550/stripe-checkout-charge-passing-amount
https://stackoverflow.com/questions/37854933/stripe-dynamically-set-amount-returns-null-when-called-on-charge-php
を見ると、
https://stripe.com/docs/checkout
にある
$amount = $_POST['data-amount'];
ではなく、
$amount = $_POST['amount'];
でしたのでこれでもやってみましたが結果は変わらずNULLでした。

既定の情報

Stripeのライブラリは6.4.1 です。

どなたかこれの原因/対処法を教えてくださいませ。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

CHERRY

2018/09/05 09:31

ショートコードの代わりに ショートコードで作成する HTML を直接記載したら動作するのでしょうか?
scrollman

2018/09/05 14:20 編集

実はstripeのほうに問い合わせをしてまして、本日返ってきたその返信が「出来ない」とのことでした。せっかくご協力頂けたのに申し訳ありません…結果のほうは後ほど自己解決法のほうに…。
guest

回答1

0

自己解決

埒が明かないのでStripeにお問い合わせをしてみました。


Thanks for contacting Stripe!

This is just a quick note to let you know we've received your message, and will
respond as soon as we can.

Yours,

Stripe

テラテイルのほうにも質問を出させていただきましたが、
https://teratail.com/questions/144484

このように、
$amount = $_POST['data-amount'];
をしても、
var_dump はNULLに、
ログを見てもエラーが発生してしまいます。
どうすれば改善されますか?

するとこんな返信が、

ご担当者様

お世話になっております。Stripe の野村と申します。

おっしゃる通り、Checkout から送られるリクエストから抽出できるパラメータは限られております:
https://stripe.com/docs/checkout#integration-simple-parameters

data-amount はリクエストで返ってこないため、サーバー側で設定していただきます。
teratail に書いてあるコード例のようにあえて $amount = '500000'; と設定をしてください。

ご質問などがあれば、いつでもお気軽にご連絡ください!

これからもどうぞよろしくお願いいたします。

ということで、出来ないそうです。

わかったのと同時に一つ閃きまして、

フォームのほうをこのように、

PHP

1function pay_test() { 2 require_once ('/home/users/1/main.jp-hogehogehoge/web/hogehogehoge/wp-load.php'); 3 global $current_user; 4 get_currentuserinfo(); 5 $email = $current_user->user_email; 6 $label = '申し込む'; 7 $amount = '5300'; 8 return ' 9 <form action="https://hogehoge.com/wp-content/themes/ALC/paysystem/checkout.php" method="POST"> 10 <script src="https://checkout.stripe.com/checkout.js" 11 class="stripe-button" 12 data-key="pk_test_4yIXhjDfhtNf2LHWnMIcVIYH" 13 data-amount="' . $amount . '" 14 data-name="エコノミープラン" 15 data-description="hogehogeサポート・hogehoge代行" 16 data-image="https://stripe.com/img/documentation/checkout/marketplace.png" 17 data-locale="auto" 18 data-currency="jpy" 19 data-zip-code="false" 20 data-allow-remember-me="true" 21 data-email="' . $email . '" 22 data-label="' . $label . '"> 23 </script> 24 <input type="hidden" name="amount" value="' . $amount . '"> 25 </form> 26 '; 27 } 28add_shortcode('pay_test', 'pay_test'); 29

$amount = '5300';で代入した変数を、data-amountに使うのと同時に、
<input type="hidden" name="amount" value="' . $amount . '">
にも使ってPOSTで送り、

PHP

1$token = $_POST['stripeToken']; 2$email = $_POST['stripeEmail']; 3$amount = $_POST['amount']; 4 5// フォームから情報を取得: 6try { 7 $charge = \Stripe\Charge::create(array( 8 "amount" => $amount, 9 "currency" => "jpy", 10 "source" => $token, 11 "description" => "alpha", 12 )); 13}catch (\Stripe\Error\Card $e) { 14 // 決済できなかったときの処理 15 die('決済が完了しませんでした'); 16} 17

StripeAPIとは別途でamountを受け取って、反映。

という事で成功いたしました。

投稿2018/09/05 23:42

scrollman

総合スコア83

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問