Stripe Payment Links で購入されたらサンクスメールを出したい

購入時にオリジナルのメールを送信したい

Stripe Payment Links で購入されたとき、本番だと領収書メールが Stripe から送信されますが、テストモードでは送信されません。

本番でも便利、テストで助かる Stripeからのメールとは別にオリジナルメールを送る方法です。

Webhook で通知されるようにする!

購入されたときに Stripe にある、「Webhook」を使って通知されるようにしてみます。

Webhook?ウェブフック? それなに?

Webhook …前から知ってたよ。ここにあるのだけは。

安心してください。私も知ったかぶりしていましたが、今回初めて使いました(笑)

今回は Webhook を使ってメール送信が出来るまでを書いてみたいと思います。

とりあえず、アイテムを作る

まあ、いきなり Webhook 使う!イエイ!イエイ! って言っても、使うには購入できるアイテムが必要なのでそこから作ります。

Stripe 管理画面→商品の下の「支払いのリンク」

「支払いのリンク」を作ります。「支払いのリンク」って日本語訳よね?

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です。(通知っていうか送信?っていうか)

Webhook エンドポイントの追加

エンドポイント URL は 〜〜〜/stripe_webhook.php としてください。

今回このブログでは api ディレクトリを作ったのでその下に入れました。(入れます。)

バージョンは最新にしましょう!

バージョン

送信イベント これは「支払いが完了したとき」というイベントにしたいです。

送信イベントを選択

payment_intent.succeeded

というのを探してください。

payment_intent.su くらいで出てきました。

そこまで選んだら「エンドポイントを追加」ボタンを押してください

エンドポイントを追加!

エンドポイントが完成しました!!

エンドポイント完成!

…と言ってもまだ PHPファイルを作っていないので動きません。

指定したURLに実在するPHPファイルを作ります。

エンドポイントとなるPHPファイル作成

今回作るファイルは stripe_webhook.php です。

作るファイルが動作するために Stripe のPHPライブラリが必要ですのでそれも用意します。

ファイル名は任意でつけてもらってよいです。任意でつけた場合は以下読み替えてください。

Stripe PHPライブラリ

https://github.com/stripe/stripe-php

こちらから Code → Download ZIP でダウンロードしても良いですが

こちらの記事で紹介されているようにローカルPC上 Composer を使ってライブラリを取得し vendor ディレクトリごとサーバーにアップロードしても良いと思います。

今回、この記事では 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
取引ID: ch_1J4xGvDoK5D4pRvXserd8aPs
ご注文の内容変更は下記URLにアクセスしてください。
その際、 取引ID と ご利用クレジットカード番号 が必要になります。

https://blog.gti.jp/api/cp.php

※購入時メールより クレジットカード下4桁は 4242
この画面が出てきたら 取引ID に上記の取引ID と 登録したクレジットカードの下4桁に 4242 を入力して「カスタマーポータルへ」をクリック
こんな画面が出てきます。「プランを一時停止」は出来ます。

今回、「プランのキャンセル」が出来てしまうと多くの人に見ていただけないので出来ないように設定しています。

カスタマーポータルの設定「定期支払いをキャンセル」→ OFF

※たまに設定変更してあそぶのでキャンセルできる!!!と思ってもしないように(笑)

こちらについてはまた今度…

この記事が気に入ったら
いいね ! しよう

Twitter で