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

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

ただいまの
回答率

90.35%

  • PHP

    25485questions

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

  • WordPress

    9583questions

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

  • API

    1919questions

    APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

  • Stripe

    34questions

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

STRIPEのAPIをWPに組込みたい(めない)

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,406

scrollman

score 55

Stripeの定期購読機能をwordpressに組み込みたいのですが、中々上手く行きません。

まず、定期購読ではなく単発支払を試したのですが、これは上手くいきました。
その際に参考としたのが
https://crosspiece.jp/how-to-use-stripe/
↑こちらの記事です。

次に同じ要領で定期購読に挑みました。

↓こちらのリファレンスを7%ほど理解し、サブスクリプション(定期購読)の
https://stripe.com/docs/subscriptions/quickstart
の部分のphpの例を単発で試した時の「checkout.php」のようなものを別に用意してそこにコピペしましたが、御察しのとおり上手くいかず。

HTMLフォームのほうはfunction.phpに追加

<?php /*

  This file is part of a child theme called ALC.
  Functions in this file will be loaded before the parent theme's functions.
  For more information, please read https://codex.wordpress.org/Child_Themes.

*/

// this code loads the parent's stylesheet (leave it in place unless you know what you're doing)

function theme_enqueue_styles() {
    wp_enqueue_style('parent-style', get_template_directory_uri() . '/style.css');
    wp_enqueue_style('child-style', get_stylesheet_directory_uri() . '/style.css', array($parent_style));
}
add_action('wp_enqueue_scripts', 'theme_enqueue_styles');

/*  Add your own functions below this line.
    ======================================== */ 

function facktest() {
    echo '
        <form action="https://hogehoge.com/wp-content/themes/ALC/checkout.php" method="POST">
            <script src="https://checkout.stripe.com/checkout.js" 
            class="stripe-button" 
            data-key="pk_test_4yIXhjDfhtNf2LHWnMIcVIYH" 
            data-amount="903" 
            data-name="烏丸歌麿" 
            data-description="烏丸少将歌麿" 
            data-image="https://stripe.com/img/documentation/checkout/marketplace.png" 
            data-locale="auto" 
            data-currency="jpy" 
            data-zip-code="false" 
            data-allow-remember-me="false" 
            data-label="購入する"></script>
        </form>';
    }
add_shortcode('testfack', 'facktest');

function sittest() {
    echo '
    <form action="https://hogehoge.com/wp-content/themes/ALC/subscriptions.php" method="POST">
      <script src="https://checkout.stripe.com/checkout.js" class="stripe-button"
        data-key="pk_test_4yIXhjDfhtNf2LHWnMIcVIYH"
        data-amount="999"
        data-name="hogehoge"
        data-description="Widget"
        data-image="https://stripe.com/img/documentation/checkout/marketplace.png"
        data-locale="auto"
        data-currency="jpy">
        data-label="お申し込み">
      </script>
    </form>';
    }
add_shortcode('sitfack', 'sittest');

function register_my_menus() {
  register_nav_menus(
    array(
      'user-menu' => __( 'ユーザーメニュー' ),
      'userpage' => __( 'ユーザーページメニュー' )
    )
  );
}
add_action( 'init', 'register_my_menus' );


※functionに定義したものが下品なのはご容赦ください。

また、こちらが定期購読用のcheckout.php、subscription.phpです。

<?php
require_once( dirname(__FILE__).'/lib/stripe-php-6.4.1/init.php');
global $display_name , $user_email;
      get_currentuserinfo();


// Set your secret key: remember to change this to your live secret key in production
// See your keys here: https://dashboard.stripe.com/account/apikeys
\Stripe\Stripe::setApiKey("sk_test_0tEi9Ndqyb8LPs0MLOygC5aA");

// Token is created using Stripe.js or Checkout!
// Get the payment token submitted by the form:
$token = $_POST['stripeToken'];
$email = $_POST['stripeEmail'];

// フォームから情報を取得:
try {

$plan = \Stripe\Plan::create([
  'product' => {'prod_CUwtDefuf3fCgP' => 'Basic Product'},
  'nickname' => '$display_name',
  'interval' => 'month',
  'currency' => 'jpy',
  'amount' => 2800,
]);

$customer = \Stripe\Customer::create([
    'email' => $user_email,
]);

$subscription = \Stripe\Subscription::create([
    'customer' => 'cus_4fdAW5ftNQow1a',
    'items' => [['plan' => 'plan_CUwvgNxfF8JnCp']],
]);

}catch (\Stripe\Error\Card $e) {
  // 決済できなかったときの処理
  die('決済が完了しませんでした');
}



// 自動返信メール
mb_language("Japanese");
mb_internal_encoding("UTF-8");
$title = "自動返信メールタイトル";
$content = "ここに自動返信メールの本文を記載。改行したいときは \n でできます。";

$from_name = "送信者名";
$from_addr = "no-reply@hogehoge.com";
$from_name_enc = mb_encode_mimeheader($from_name, "ISO-2022-JP");
$from = $from_name_enc . "<" . $from_addr . ">";
$header  = "From: " . $from . "\n";
$header = $header . "Reply-To: " . $from;

//to user send mail

if(mb_send_mail($email,$title, $content, $header, "-f" .$from_addr)){
  echo "メールを送信しました";
} else {
  echo "メールの送信に失敗しました";
};



// 管理者宛メール
$title_me = "管理者宛メールタイトル";
$from_me = "info@hogehoge.com";
$content_me = "ここに管理者宛メールの本文を記載。改行したいときは \n でできます。";
if(mb_send_mail($from_me,$title_me, $content_me, $header, "-f" .$from_addr)){
  echo "メールを送信しました";
} else {
  echo "メールの送信に失敗しました";
};

// サンキューページへリダイレクト
header('Location: https://hogehoge.com/thanks/');
exit;

?>


始めの単発の時はStripeのダッシュボードのテスト画面に売上が計上されたのですが、
この定期購読の場合は売上が計上されません。また、定期購読の場合は顧客が一覧に載るはずなのですがそれがされません。


環境
ロリポップ スタンダード
wordpress


始めに参考にした記事にサブスクリプションAPIをぶち込んだ雑なものです。
おかしいところだらけだと思うのでそういった点があれば教えてください。
できれば導入完了まで導いて欲しいです。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • scrollman

    2018/03/30 17:18

    コードのどこで失敗になっているのかはわかりません。ブラウザには真っ白な画面しか表示されませんし、Apache(ロリポップ)のエラーログは提供されていないということなので、原因を特定するのは難しいです。

    キャンセル

  • nedisoh

    2018/03/30 17:27

    customerやplanなどのIDがリテラルですが、これはcreateの後に $customer->id のようにすべきではないでしょうか。

    キャンセル

  • scrollman

    2018/03/30 21:04

    https://stripe.com/docs/subscriptions/quickstart ←をグーグル翻訳で理解とは程遠いレベルで読んでいるのですが、 customerやplan等を別で定義し、代入するということですか?

    キャンセル

回答 1

check解決した方法

+1

いやはや、リファレンスが親切で有名なStripeのコードをコピペしても使いこなせないとはお恥ずかしい限りでした。

質問の時とだいぶ違いますが、最終的に以下の方法でStripeの定期購読(サブスクリプション)(SubScription)を実装いたしました。

Wordpress、テーマ直下のfunction.phpにて
function subpay() {
    echo '
        <form action="https://hogehoge.com/wp-content/themes/ALC/paysystem/subscriptions.php" method="POST">
          <script src="https://checkout.stripe.com/checkout.js" class="stripe-button"
            data-key="pk_test_*********************"
            data-name="スタンダートプラン""
            data-description="◯◯◯◯◯◯◯"
            data-locale="auto" 
            data-amount="2800"
            data-currency="jpy" 
            data-label="お申し込みする">
          </script>
    </form>
    ';
    }
add_shortcode('subpay', 'subpay');


↑がクライアント側のスクリプトです。Wordpressなのでショートコードにしてページに貼り付けています。
ページで「お申し込みする」をクリックするとサーバー側スクリプトがある以下のページに転送され処理します。

<?php


header('Location: https://hogehoge.com/pay-page/');

require_once('<ライブラリまでのパス>/wp-content/themes/ALC/lib/stripe-php-6.4.1/init.php'); 

// Be sure to replace this with your actual test API key
// (switch to the live key later)
\Stripe\Stripe::setApiKey("sk_test_*********************");

try
{
  $customer = \Stripe\Customer::create(array(
    'email' => $_POST['stripeEmail'],
    'source'  => $_POST['stripeToken'],
  ));

  $subscription = \Stripe\Subscription::create(array(
    'customer' => $customer->id,
    'items' => array(array('plan' => 'default-plan')),
  ));
//リファレンスのSubscriptionをコピペ、作成した購読プランのIDを記入→default-plan
  header('Location: thankyou.html');
  exit;
}
catch(Exception $e)
{
  header('Location:oops.html');
  error_log("unable to sign up customer:" . $_POST['stripeEmail'].
    ", error:" . $e->getMessage());
}


// サンキューページへリダイレクト
exit;

?>


このように記述すれば万事解決します。回答者さまには御迷惑をおかけしました。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 90.35%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • PHP

    25485questions

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

  • WordPress

    9583questions

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

  • API

    1919questions

    APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

  • Stripe

    34questions

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