購入時にオリジナルのメールを送信したい
Stripe Payment Links で購入されたとき、本番だと領収書メールが Stripe から送信されますが、テストモードでは送信されません。
本番でも便利、テストで助かる Stripeからのメールとは別にオリジナルメールを送る方法です。
Webhook で通知されるようにする!
購入されたときに Stripe にある、「Webhook」を使って通知されるようにしてみます。
Webhook?ウェブフック? それなに?
安心してください。私も知ったかぶりしていましたが、今回初めて使いました(笑)
今回は Webhook を使ってメール送信が出来るまでを書いてみたいと思います。
とりあえず、アイテムを作る
まあ、いきなり Webhook 使う!イエイ!イエイ! って言っても、使うには購入できるアイテムが必要なのでそこから作ります。
「支払いのリンク」を作ります。「支払いのリンク」って日本語訳よね?
Payment Links カッコイイ!
支払いのリンク むむっ!どうだろ。まあいいか。
支払いのリンク画面に入ったら「+新規」ボタンを押します!
すると「支払いのリンクを作成する」という画面が表示されます。
うーん。困ったホントに扱ってるわけじゃないから架空の商品作るのよね。
で、怪しいの作りたくなっちゃう。
今回はアイテムと同時に支払いのリンクも作ります
今回はこれを作りました。
「商品を追加」ボタンまで押したら完成します。商品は「請求期間」なども細かく調整可能なので大変便利です!
次の画面では支払い画面で収集したい情報などの設定を行います。
このカスタマイズしている画面右側ではプレビューが見られますのですごくわかりやすいです。
スマートフォンとPCの見た目を切り替えることもできるので便利です。
リンク作成
いろいろ調整したら右上にある
「リンクを作成」ボタンを押します。
ここまでで、このようにアイテムとリンクが出来上がります。
実際の商品リンクはこちら https://buy.stripe.com/test_7sIaFtbmg530gE0fYZ
実際に買ってみる!
実際に購入してみます。
「申し込む」を押すと…ほどなくして完了します。
Stripe Payment Links で商品の販売ページを作ってみました Youtube
Stripe でここまでの操作をYoutubeで動画配信しています。(実際には定期課金ではなく単品の販売ページを作成しています)
https://buy.stripe.com/test_9AQeVJ2PKfHEafCeUW
定期課金版はこちら
https://buy.stripe.com/test_7sIbJxcqkgLI73qeUX
テストモードでは、このままだと通知が来ません。
…とここから Webhook を使って通知を作ってみます。
作りましょう!
今回、ご用意いただきたいのは下記のものです。
- PHPが動作するウェブサーバー(レンタルサーバーで構いません。)
- もちろん Stripe アカウント(テストデータモードで作ります)
サンプル的には以上でOKです。
Stripeアカウントは当たり前ですね。
今回このブログではこのブログのサーバーに設置しちゃってます。
blog.gti.jp/api というディレクトリを作りました。
Webhookの登録
まず、Webhook の登録を行います。いや、PHPファイルが先か… まだ商品を公開していなければどっちでもいいです。
Stripe管理メニューの 開発者 の 「Webhook」を開きます。
エンドポイント追加
「エンドポイントを追加」を押します。
エンドポイントとはイベントが起こった際に通知されるURLです。(通知っていうか送信?っていうか)
エンドポイント URL は 〜〜〜/stripe_webhook.php としてください。
今回このブログでは api ディレクトリを作ったのでその下に入れました。(入れます。)
バージョンは最新にしましょう!
送信イベント これは「支払いが完了したとき」というイベントにしたいです。
payment_intent.succeeded
というのを探してください。
そこまで選んだら「エンドポイントを追加」ボタンを押してください
エンドポイントが完成しました!!
…と言ってもまだ PHPファイルを作っていないので動きません。
指定したURLに実在するPHPファイルを作ります。
エンドポイントとなるPHPファイル作成
今回作るファイルは stripe_webhook.php です。
作るファイルが動作するために Stripe のPHPライブラリが必要ですのでそれも用意します。
ファイル名は任意でつけてもらってよいです。任意でつけた場合は以下読み替えてください。
Stripe PHPライブラリ
https://github.com/stripe/stripe-php
こちらから Code → Download ZIP でダウンロードしても良いですが
こちらの記事で紹介されているようにローカルPC上 Composer を使ってライブラリを取得し vendor ディレクトリごとサーバーにアップロードしても良いと思います。
オンライン決済サービスをWeb上に簡単に導入できるStripe(ストライプ)を使うには、まず自サイトにStripe公式のAPIライブラリをインストールする必要がある。APIライブラ...
今回、この記事では Composer を使ってライブラリを取得していますので呼び出しが
require '/パス/vendor/autoload.php';
となっていますが、上の方法でZIPでダウンロードした場合はその部分を
require_once '/パス/stripe-php/init.php';
とするようにしてください。
stripe_webhook.php 作成
APIキーとエンドポイント署名シークレットは Stripe 管理画面から取得してきます。
APIキー(シークレットキー)
Stripe管理画面 の「開発者」のすぐ下「APIキー」にアクセスしてここのシークレットキーの「テストキーを表示」(テストモードの場合)を押して表示されたものをコピーして コード内の $api_key = ‘xxxxxx’; のところに埋め込みます。
エンドポイント署名シークレット
エンドポイント署名シークレットはやたらに送りつけられた場合に処理しないようにするためのものです。
Stripe管理画面の「開発者」の下にある「Webhook」の画面内にある「署名シークレット」の「クリックして表示」を押して表示されたものをコピーして コード内の $endpoint_secret = ‘xxxxx’; のところに埋め込みます。
あとはアイテムの作り方によってデータの構造が違うので一度購入したあと、メールで受け取ってから
// DATA
の下にずらずらデータが出てくるようにしているのでそこを参考にメールを組み立ててください。
組み立てたら {$var} を削除すればメールにバラバラデータが表示されなくなります。
そのままにしているといろいろやばいので公開するときは必ず消しましょう。
サンプルの都合上取りやすいデータだけでメール作ってますが、もっといろいろ出来るのでこねくり回してください。
stripe_webhook.php の内容です。
<?php
require '/パス/vendor/autoload.php';
// または
// require '/パス/stripe-php/init.php';
$api_key = 'xxxxxxxxxxxxxxxxxxxxxxxxxxx'; //
$endpoint_secret = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';
$sig_header = $_SERVER['HTTP_STRIPE_SIGNATURE'];
$event = null;
$headers = getallheaders();
$payload = file_get_contents('php://input');
$obj = json_decode($payload);
\Stripe\Stripe::setApiKey( $api_key );
try {
$event = \Stripe\Webhook::constructEvent(
$payload, $sig_header, $endpoint_secret
);
if ( $obj->type === 'payment_intent.succeeded' ) {
$data = $event->data->object;
file_put_contents( "order.cgi", $event->id . "," . $data->amount . "," . $data->customer . "," . $data->name. ",". $data->receipt_email ."," . $data->status . ",".$data->address->postal_code.$data->address->state.$data->address->city.$data->address->line1.$data->address->line2 . PHP_EOL, FILE_APPEND );
test_sendmail( $data );
}
exit();
} catch(\UnexpectedValueException $e) {
// Invalid payload
http_response_code(400);
exit();
} catch(\Stripe\Exception\SignatureVerificationException $e) {
// Invalid signature
http_response_code(400);
exit();
}
/**
* メール送信
*/
function test_sendmail( $data = null ) {
if ( empty( $data ) ) return null;
// リンクの作り方でデータ格納位置が違いますので注意してください。
$amount = $data->amount;
$charge_id = $data->charges->data[0]->id;
$name = $data->charges->data[0]->billing_details->name;
$address_obj = $data->charges->data[0]->billing_details->address;
$address = $address_obj->postal_code.$address_obj->state.$address_obj->city.$address_obj->line1.$address_obj->line2;
$receipt_url = $data->charges->data[0]->receipt_url;
$email = $data->receipt_email;
ob_start();
var_dump( $data );
$var = ob_get_contents();
ob_end_clean();
$subject = "ご注文ありがとうございました!";
$message = <<< EOF
{$name} 様
ご注文ありがとうございました!
価格: {$amount}
取引ID: {$charge_id}
発送先: {$address}
領収書: {$receipt_url}
// DATA
{$var}
EOF;
mb_language("Japanese");
mb_internal_encoding("UTF-8");
$from_name = mb_encode_mimeheader( "送信テストメール", 'UTF-8' ); // 送信者名
$from_email = "info@example.com"; // 送信者メールアドレス
$replyto_email = $from_email; // メールの返信先(このままだと送信者と同じ)
$headers = [
'MIME-Version' => '1.0',
'Content-Transfer-Encoding' => '7bit',
'Content-Type' => 'text/plain; charset=UTF-8',
'Return-Path' => $from_email,
'From' => $from_name.' <'.$from_email.'>',
'Sender' => $from_name.' <'.$from_email.'>',
'Reply-To' => $replyto_email,
'Organization' => 'TEST.',
'X-Sender' => 'from@example.com', // 送信者
'X-Mailer' => 'TESTMAIL',
'X-Priority' => '3',
];
array_walk( $headers, function( $_val, $_key ) use ( &$header_str ) {
$header_str .= sprintf( "%s: %s \r\n", trim( $_key ), trim( $_val ) );
} );
mb_send_mail( $email, $subject, $message, $header_str );
}
サンプルでは購入者にだけメールが送信されますが、同じタイミングで管理者にも送信するべきですよね。
メールのヘッダあたりも必ず修正するようにしてください。
そのあたりは改造して作ってみてください。
実際に購入されると order.cgi に購入データが記録されるようになっています。
サーバーによってはこの order.cgi ファイルが自動で作られないことがありますので パーミッション 666 で order.cgi という名前のファイルを同じ場所に置いておいてください。
今回作った弊社のテストアイテムをテスト購入するとカスタマーポータルへのリンクがついてます。
サンプルではここまで紹介していますが、実際に今回作ったリンクからアイテムをテスト購入されるとカスタマーポータルが使用できるリンクが付いてます。
サンプルで見るだけ見られるコードつけときます。
ご注文ありがとうございました!
価格: 500000
※購入時メールより クレジットカード下4桁は 4242
取引ID: ch_1J4xGvDoK5D4pRvXserd8aPs
ご注文の内容変更は下記URLにアクセスしてください。
その際、 取引ID と ご利用クレジットカード番号 が必要になります。
今回、「プランのキャンセル」が出来てしまうと多くの人に見ていただけないので出来ないように設定しています。
※たまに設定変更してあそぶのでキャンセルできる!!!と思ってもしないように(笑)
こちらについてはまた今度…
おかげさまで、links+webhookが実装できました!!!
なかなか、stripe関連でいい記事がなかった中・・・とてもわかりやすくて助かりました。
コメントありがとうございました!
お役に立てて嬉しいです。