こんにちは、プログラマーの山本です。
今回は企業様からの依頼で、
Stripe決済を用いて購入からパスワード付与までの流れを自動化する。
・パスワード認証は最初の1回のみ(同じIPからのアクセスなら2回目以降は認証不要)
・別IPからアクセスがあった場合はパスワードを再発行して再認証を行う。
というシステムを実装しました。
商品購入周りのフローを自動化させたい方は参考になるかと思います。
目次
wordpressとstripeの連携
今回は制作コストを抑えたいというご希望から、
stripeとの連携は「Stripe Payments」というプラグインを使用しました。
このプラグインを使えば、
・stripe決済時のAPIとの連携
・stripeを使った商品購入ボタンの作成
などの手間を削減することが出来ます。
stripeからAPIキーを取ってきてコピペすればすぐに使えます。
商品閲覧ページ(パスワード付き)の編集
WordPressの投稿から、商品ごとにパスワード付きの閲覧ページを作成します。
今回は購入者に個別のパスワードを動的に発行するので、
ここでは適当なパスワードを設定しておきます。
(このパスワードでは認証できないようにするので。)
function.phpに以下のコードを書きます。
//パスワード認証画面
function my_password_form() {
$message = '';
if( $_GET["re"] ){
$message = '<p><br>通常と異なるアクセスを検知したためパスワードを再発行します。<br>ご登録のメールアドレスへメールを送信致しましたので、確認の上再度ログインしてください。</p>';
}
else if( $_GET["false"] ){
$message = '<p><br>メールアドレス、またはパスワードに誤りがあります</p>';
}
else{
$message = '<p><br>このコンテンツは保護されています。<br>閲覧するには以下にメールアドレスとパスワードを入力してください。</p>';
}
return $message.
'<form class="post_password" action="' . home_url() . '/wp-login.php?action=postpass" method="post">
メールアドレス:<input name="post_email" type="text" />
パスワード:<input name="post_password" type="password" />
<br>
<input type="submit" name="Submit" value="' . esc_attr__("パスワード送信") . '" />
</form>';
}
add_filter('the_password_form', 'my_password_form');
これで商品閲覧ページ(パスワード付き)に、
オリジナルのパスワード送信フォームを設置することができます。
また、後ほど作成するパスワード認証の結果に応じて、
表示するメッセージを変更しています。
サンキューページの編集とパスワード付与機能の実装
商品を購入してもらったときに表示するページの文面と、
その内部で行うパスワード生成とメール生成を実装します。
//ランダムなパスワード生成
function random($length = 8){
return substr(str_shuffle(str_repeat('023456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNOPQRSTUVWXYZ', $length)), 0, $length);
}
//サンキューページ
function asp_custom_thank_you_msg ($output, $txn_data){
$pwd = random();
require_once( "wp-load.php" );
global $wpdb;
//URL→ID取得
$url = $txn_data["item_url"];
$pid = url_to_postid( $url );
//テーブル作成
require_once( ABSPATH . 'wp-admin/includes/upgrade.php' );
$table_name = $wpdb->prefix . "email_passwords";
$charset_collate = $wpdb->get_charset_collate();
$sql = "CREATE TABLE IF NOT EXISTS $table_name (
seq mediumint(9) NOT NULL AUTO_INCREMENT,
pid text NOT NULL,
email text NOT NULL,
pwd text NOT NULL,
ip text NOT NULL,
UNIQUE KEY seq (seq)
) $charset_collate;";
dbDelta( $sql );
$datas = $wpdb->get_results("SELECT * FROM $table_name WHERE pid = '{$pid}' AND email = '{$txn_data["stripeEmail"]}'");
if( count($datas) == 0 ){
//保存
$wpdb->insert(
$table_name,
array(
'pid' => $pid,
'email' => $txn_data["stripeEmail"],
'pwd' => $pwd,
'ip' => ""
)
);
}
//メール送信
mb_language("Japanese");
mb_internal_encoding("UTF-8");
//送信元メールアドレス
$fromemail = "◯◯◯";
$header = "From: {$fromemail}n";
$to = $txn_data["stripeEmail"];
$title = "ご購入が完了しました";
//自動返信メール内容
$content = "◯◯◯";
mb_send_mail($to, $title, $content, $header);
//サンキューページのメッセージ
$output = "ご購入ありがとうございます。<br>
<br>
商品名:{item_name}<br>
価格:{item_price_curr}<br>
<br>
商品URL・ID・パスワードを、<br>
{$txn_data["stripeEmail"]} にお送り致しましたのでご確認ください。<br><br>メールが見当たらない場合、迷惑メールフォルダやゴミ箱に振り分けされている可能性がありますのでご確認ください。";
return $output;
}
add_filter('asp_stripe_payments_checkout_page_result', 'asp_custom_thank_you_msg', 10, 2);
ちなみに「Stripe Payments」で商品購入ページを作成すると
商品ごとに商品閲覧ページのURLを指定できるので、
そのURLから商品ページのIDを取得してパスワードの管理に使用しています。
パスワード認証まわりのシステムを実装
お客さんがパスワード認証を行ったときの処理を書いていきます。
//パスワード認証
function custom_auth_save() {
include 'wp-load.php';
global $wpdb;
$refurl = wp_get_referer();
if( strpos($refurl , "?")>0 ){
$refurl = explode( "?" , $refurl )[0];
}
//パスワードの一致確認
$postid = url_to_postid( $refurl );
$table_name = $wpdb->prefix . "email_passwords";
$pwds = $wpdb->get_results("SELECT * FROM {$table_name} WHERE pid = '{$postid}' AND email = '{$_POST['post_email']}' AND pwd = '{$_POST['post_password']}'");
//一致
if( count($pwds) > 0 ){
$pwds = $pwds[0];
//認証
if( $pwds->ip == "" ){
//保存
$value = array( "ip" => $_SERVER["REMOTE_ADDR"] );
$where = array( "seq" => $pwds->seq );
$wpdb->update($table_name, $value, $where);
wp_safe_redirect( $refurl );
exit();
}
//パスワード変更+メール送信
else{
$pwd = random();
mb_language("Japanese");
mb_internal_encoding("UTF-8");
//送信元メールアドレス
$fromemail = "◯◯◯";
$header = "From: {$fromemail}n";
$to = $pwds->email;
//パスワード再発行メールタイトル
$title = "パスワードを再発行しました。";
$producturl = get_permalink( $pwds->pid );
//パスワード再発行メール内容
$content = "◯◯◯";
mb_send_mail($to, $title, $content, $header);
//認証保存
$value = array( "ip" => "" , "pwd" => $pwd );
$where = array( "seq" => $pwds->seq );
$wpdb->update($table_name, $value, $where);
wp_safe_redirect( $refurl."?re=1" );
exit();
}
}
else{
wp_safe_redirect( $refurl."?false=1" );
exit();
}
}
add_action( 'login_form_postpass', 'custom_auth_save' );
ユーザーが送信したメールアドレス・パスワードで、
データベースを検索して一致すれば認証を通します。
このとき、IPの紐付けが行われていなければ初回認証と見なし、
IPをデータベースに保存しておきます。
もしすでにIPが紐付け(データベースに保存)されていれば、
漏洩 or 別環境からの認証と見なし、パスワードの再発行を行っています。
※ このあたりは、クライアント希望の仕様を満たすために実装しました。
パスワード認証状態のチェック
一度パスワード認証を行ったら、同じIPからのアクセスでは再認証を必要としないようにします。
そのための認証状態チェックを行うコードを書きます。
//パスワード認証状態のチェック
function nendebcom_post_password_required( $required, $post ) {
if ( !$required ) {
return $required;
}
if( strpos( $_SERVER['REQUEST_URI'] , "action=edit" ) === false ){
include 'wp-load.php';
global $wpdb;
$ip = $_SERVER["REMOTE_ADDR"];
$table_name = $wpdb->prefix . "email_passwords";
$pwds = $wpdb->get_results("SELECT * FROM {$table_name} WHERE pid = '".$post->ID."' AND ip = '{$ip}'");
if( count($pwds) > 0 ){
return false;
}
}
return true;
}
add_filter( 'post_password_required', 'nendebcom_post_password_required', 10, 2 );
データベース(email_passwords)から、投稿IDとユーザーのIPをセットして
取り出すことが出来たら、認証済みと見なしています。
まとめ
stripe決済との連携は、
「Stripe Payments」というプラグインを用いるとほぼ完了します。
今回はそこからパスワードを自動発行してメール送信したり、
IPによる認証状況の確認、およびパスワードの再発行などを行うシステムに注力しました。
無事クライアントのご希望に沿ったシステムを構築でき、
非常に満足いただけたので嬉しく思います。
wordpressでstripe決済を導入したり、
パスワードの自動付与やIPチェックなどのシステムを導入したい方は、
是非参考にしてみてください。
この記事を見ても自分で実装するのは難しそうだという方や、
もう少し違ったシステムを実装したいといったご要望の方は、
ご相談いただければと思います。
制作の依頼はこちら
今回ご紹介したシステムなど、
WEB上にシステムを実装したい場合は弊社におまかせください。
簡単なシステムなら1件¥3,000(税別)から承ります。
相場よりも費用を抑えて対応させていただくことが可能ですので、
以下のフォームから相談内容を記入して気軽にご連絡ください。