.envから変数を取得するには、phpdotenvが必要である。

 

.envファイルの内容ってgetenv()で取得すると思うんですが、

それって、環境変数を取得するように、

何もライブラリとか入れずに取得できると思ってました。

 

答え

デフォルト状態で、getenv()より取得できる環境変数は

phpinfo()ででる $_ENV['XXX'] だけみたい。

.envファイルで設定した変数を取得するには、

phpdotenvを使う必要がある。

 

 

■デフォルト状態

$ cat .env
TOKEN=token_123
$ vi get_env.php 
<?php

var_dump('PATH: ' . getenv('PATH'));  
//"PATH: /Users/XXXXXX/.pyenv/shims:/usr/local/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin"

var_dump('TOKEN: ' .getenv('TOKEN'));  
//"TOKEN: " 取得できない(X_X)

 

 

■ phpdotenv導入後

$ composer require vlucas/phpdotenv
$ vi get_env.php
<?php
var_dump('PATH: ' . getenv('PATH'));  
//"PATH: /Users/XXXXXX/.pyenv/shims:/usr/local/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin" 

var_dump('TOKEN: ' .getenv('TOKEN'));  
//"TOKEN: token_123"  取得できた\(^^)/

JP_Stripes (Stripe ユーザーグループ)in 宮崎 Vol.2〜初登壇の反省付き〜

どうも!
先日、JP_Stripes (Stripe ユーザーグループ)in 宮崎 Vol.2
に行ってきました!
そこで、今回、初社外LTしてきました!\(^^)/
宮崎での開催は2回目ということでした。(1回目も参加してます)

 

黒レアらしいです!やったー

 

まずはじめに、
Stripe Japanの小島さんより、Stripeの概要説明がありました。

前回も概要説明はありましたが、内容が新しくなっていて聞き応えがありました。
わたしが気になったトピックは以下2点です。

<Stripe導入事例>
Cansell
行けなくなったホテル予約を売ったり、買ったりできるサービスらしく、
個人的にぜひ使ってみたいサービスだと思いました!
このサービスにもStripeが使われているとのことです。

SaaSを海外展開するために準備した3つのこと
Stripeを使った海外販売を通しての海外展開の大変さだったりを
詳細にまとめてくださってました。

<新機能!>
Isuuing  …APIでカードを作成
Terminal  …プラグラミング可能POS
Stripe + Twillio<pay> …シニアには良さそう

 

 

 

次に、quote 黒葛原 道さんより
「WordPress+WooCommerce+Stripeで作ってみてわかった、
簡単にECサイトを作る方法」

と題して、実際のオンラインショップquoteでStripeを導入したお話でした。
黒葛原さんは、デザイナーさんです。
購入フローふくめサイトの世界観も大事にしており、
Stripeだとそれを実現することができたようです。

\ 簡単に購入できる仕組みが欲しい /
運営側の、現場の、生の、お話が聞けて刺激になりました。

また、WPの開発ツールで、getflywheelというサービスがあるらしく、
わたしは知らなかったので、勉強になりました!

さらに、Stripeはクレカだけでなく、
ApplePayの決済対応も可能です。
そこで、ApplePayの

日本では、VISA カードは App 内や Web での支払いには使えません。

というこの仕様には初耳で、いい情報知れたなと思いましたー!
※店頭での支払いには対応してるらしいです。
参考: https://support.apple.com/ja-jp/HT201239

 

 

2番手で、私のLTでした。
「簡単決済「stripe」を導入してみる。」
という題名で、stripeのクイックスタートよりテストしてみた
の手順をまとめて、最後にデモしました^^
社外LTが初めてだったので、緊張しました。。。
詳しくは、Stripe決済をフレームワーク使わずに組み込んでみる!(PHP)
にまとめています。

<反省点>
– 自己紹介にインパクトが足らなかった。
– 声出し練習不足。
– 伝えたいことが、明確に出てなかった・まとめきれてなかった。
– 緊張で楽しめてなかった。次はもっと楽しみたい。

初LTということで、場数不足は当たり前に痛感しました。
これから、さらに経験値積んでいきたいと思います。
貴重な機会を提供してくださってありがとうございました!

 

 

最後に、イラスティックコンサルタンツ株式会社
緒方 宣行さん、野島 隆さんより
「もっと自由で柔軟に構築しよう!
Stripre決済にも対応した新しいカートシステム」
と題して、 Stripeを使ったAPIサービスのお話でした。

PHPとVue.jsを使ったサービスでした。
技術者の方が、
PHPerでPhpStorm使いというだけで共感わいちゃいました。

Stripeを使っての、
フロント側のデザイン自由度の高いサービスを作ることができる事例でした。
いろんなビジネスの可能性を感じました。

 

 

Stripeはじめキャッシュレスは安倍さんが擁護してるだけあって、
今後さらに注目していきたいなと思います!

JP_Stripesに参加すると毎回思うのですが、
ビジネスアイデアが沸けば、Stripeを使うことで一攫千金も夢じゃないなあ
っとしみじみ感じます。#JP_Stripes

 

stripe決済をフレームワーク使わずに組み込んでみる!(PHP)

こんにちは!
過去に簡単決済「stripe」を導入してみる。を紹介しました。
今更気づいたんですが、べつにLaravel使う必要なかったなって(笑)
ただ、使いたかったんだと思います!ww

そこで!
PHPのフレームワークを使わないパターンで
もっとシンプルに組み込みたいと思います。

完成は、こちらです。
[ kin29/stripe_practice_php ]
↑だと、.envの設定だけで
ビルドインサーバ立てたら、もうできちゃいます。

 

さあ、つくろう。

リファレンス

stripe API
Card Payments Quickstart
ほぼ、↑のクイックスタートをやってます。

環境

– Mac
– PHP7.2.7

準備

stripeアカウント発行、テスト環境申請(申請後すぐできました)
↑これだけ!

手順

1.プロジェクト(作業ディレクトリ)の作成

~$ mkdir stripe_practice_php/

 

2.stripe/stripe-phpの導入 ←composer経由

$ cd stripe_practice_php/
$ composer require stripe/stripe-php
You are running composer with xdebug enabled. This has a major impact on runtime performance. See https://getcomposer.org/xdebug
Using version ^6.20 for stripe/stripe-php
./composer.json has been created
Loading composer repositories with package information
Updating dependencies (including require-dev)
  - Installing stripe/stripe-php (v6.20.0)
    Downloading: 100%
Writing lock file
Generating autoload files

$ ls
composer.json composer.lock vendor

 

3.カード情報入力フォームをつくる。

$ cd stripe_practice_php/
$ vi index.php
...
<div class="content">  
  <div class="title">stripe DE おかいもの</div>
  <div>¥100</div>
    <form action="./payment.php" method="POST">
    <script
       src="https://checkout.stripe.com/checkout.js"
       class="stripe-button"
       data-key="{pk_test_XXXXXXXXXXXXXXXXXXX}"
       data-amount="{商品の値段}"
       data-name="{カード入力モーダルのタイトル}"
       data-description="{カード入力モーダルのタイトル下の説明文}"
       data-image="https://stripe.com/img/documentation/checkout/marketplace.png"
       data-locale="auto"
       data-currency="jpy">
    </script>
  </form>
</div>
...

 

 

4.バックエンドをつくる。

$ cd stripe_practice_php/
$ vi payment.php
<?php
require __DIR__.'/vendor/autoload.php';

\Stripe\Stripe::setApiKey("{sk_test_XXXXXX}"); 

$token = $_POST['stripeToken']; //ここでAPIにリクエストしてる
   
$charge = \Stripe\Charge::create([
    'amount' => 100,
    'currency' => 'jpy',  //usd(ドル)→jpy(円)に変更しました。
    'description' => 'Example charge',
    'source' => $token,
]);
    
//thanks.phpにリダイレクトさせる。
header("Location: ./thanks.php");

 

5.サンクスページをつくる。

$ cd stripe_practice_php/
$ vi thanks.php
...

<div class="content">
   <div class="title">「stripe DE おかいもの」<br>ご利用TEGEありがとうございました。</div>
   <div>利用金額:¥100</div>
  </form>
</div>

...

 

6.完成! →実際に動かしてみる「http://localhost:8080/index.php

$ cd stripe_practice_php/
$ php -S localhost:8080   //ビルドインサーバを立てる

※テスト用のカード番号の参考はこちら
https://stripe.com/docs/testing#cards

 

7.管理画面をみてみる。 →実際にみせちゃう
https://dashboard.stripe.com/test/dashboard

 

‘currency’ => jpy

に変更することにより、
円請求ができますが、管理画面ではドルに換算されていました。

 

まとめ

・簡単!早い!わかりやすい!

・ドキュメントは英語ですが、読みやすく充実してます。

・リンク型なので、面倒なトークン化(カード情報非保持)対応の必要なし!

・次は、PHP以外の言語でもしてみたいです!

簡単決済「stripe」を導入してみる。

 

どうも、
先週、#JP_Stripes in 宮崎 キックオフに行ってきました!

Stripe自体は聞いたことはありましたが、
使い方やできることは全く知らなかったので、
事例など交え、とてもいい話を聞くことができました。

もくじ

stirpeのいいところ

– 初期費用不要
– 申請は契約書いらず、ペーパレス。申請〜導入までが速い!
– Apple Pay / Google Pay / 他通貨決済も導入可
– cloud (AWS) →Saasだから保守が楽
APIリファレンスがある!PHP,Ruby,Node,Go,Python対応
– クレジットカード情報「非保持化」及び「PCI DSS(準拠)」してる
↑リンク型みたいな感じの認識です。

申請は、ほぼどんなものでも通るものの、
途中で止められることもあるとのこと。
物として実在するか形に残るもののほうがいいらしいです。

stripeのいろんな機能

– sigma …sqlでデータの検索ができる
– rader …機械学習を使って怪しい人を見つけてくれる。自分でカスタムパターンもいれることができる。
– billing…定期購入に対応。

stripeの導入をやってみる!

参考:
Stripe API Reference

<導入環境>
– PHP 5.6.30
– Laravel 5.2

PHP5.6.4以上だったら、Laravel5.4いけたんですが、、、
ローカルを更新するの諦めました^^;

localは非sslでもおkです!
テスト環境のアカウントは申請直後にできました。

Githubにソース置いてます。
[ kin29/stripe_practice_laravel ]
↑ここには、ほぼcomposer installだけでできるもの置いてます。

以下では、
どうやって最初作ったか、忘れないように、
Laravel/stripeの構築の仕方memoっときます。

 

1.プロジェクト作成

$ composer create-project laravel/laravel stripe_practice_laravel --prefer-dist "5.2.*"

–prefer-distなので、指定なしのデフォルトのgit clone でなく
zipで取ってくる(git clone より高速です)

 

2.stripe/stripe-phpの導入

// $composer require [package name]:[version]
$ composer require stripe/stripe-php:^6.17

 

3.フロント系いらんので消しました。

(package.json/gulpfile.jsとか)

 

4.envの調整
DBとか使わないので、stripeのAPIキーを環境変数として追記のみ

.env

STRIPE_PUBLIC_KEY=test
STRIPE_SECRET_KEY=test

 

5.カード情報入力フォームをつくる。
resources/views/welcome.blade.phpにthanksへのformを追記
参考:Card Payments Quickstart

 

6.バックエンドをつくる
app/Http/route.phpに以下を追記

Route::post('/thanks', function () {

    \Stripe\Stripe::setApiKey(getenv('STRIPE_SECRET_KEY'));

    try {
        $charge = \Stripe\Charge::create(array(
            "amount" => 100,
            "currency" => "jpy",
            "source" => $_POST['stripeToken'],
            "description" => "100yen pay"
        ));
    } catch(\Stripe\Error\Card $e) {

    }

    return view('thanks');
});

 

7.動かしてみる。→エラー調整

この時点でだいたい動きましたが、POSTすると以下のエラーが出てきました。

 

TokenMismatchException in VerifyCsrfToken.php line 67:

app/Http/Middleware/VerifyCsrfToken.php

に以下を追記することで、
CSRF保護の対象外にすることができます。
ただし、クロス・サイト・リクエスト・フォージェリ(CSRF)保護の対象外となりますので、吟味することも大事だと思います!

    /**
     * The URIs that should be excluded from CSRF verification.
     *
     * @var array
     */
    protected $except = [
        'thanks' //追記
    ];

 

クロス・サイト・リクエスト・フォージェリ(CSRF)
… 脆弱性を利用して、悪意のある攻撃をすることだそうで、
信頼できるユーザーになり代わり、認められていないコマンドを実行するとのこと。

Laravelでは、セッションごとにCSRF「トークン」を自動的に生成していて、
リクエスト時に、このトークンを送信して、認証済みのユーザーかを確認するために利用しているとのこと。

なので、HTMLフォームを定義する場合はいつでも、隠しCSRFトークンフィールドをフォームに埋め込んで、
CSRF保護でのチェックできるようにしなければならないとのこと。

 

 

8.動かしてみる。(完成)
カード決済できたー!

Stripeの管理画面にも、疎通確認できました!

 

stripeとっても簡単!

ログもあるし、デバックしやすかったです!

composer の–prefer-distってよく使うけど何してる?

composer コマンドって実際何してるのかわからずやっちゃってます。
そろそろ向き合おうと思ってます。

参考:
http://blog.tojiru.net/article/440339824.html

 

例えば、これ!

$ composer create-project laravel/laravel app_dir

このコマンドなんしてるんだっけ?

//おそらく↓
git clone git@github.com:laravel/laravel.git
mv laravel app_dir
cd app_dir
composer install

 

 

では、–prefer-dist がつくとどうでしょうか
例えば、これ!

$ composer create-project laravel/laravel app_dir --prefer-dist

調べてみると、
–prefer-dist の他に –prefer-source というオプションもあります。

–prefer-source
… git cloneでソースを落としてくる。
デフォルト(指定なしではこっちしてる)
つまり、最初のコマンドはこっちなんです!

–prefer-dist
… zipでダウンロードする。こっちのほうが高速!

 

なので、

$ composer create-project laravel/laravel app_dir --prefer-dist

上記コマンドは、以下をしているご様子。

//おそらく↓
wget https://github.com/laravel/laravel/archive/master.zip
unzip laravel
mv laravel app_dir //多分。
cd app_dir
composer install

composerのコマンドってもっとオプションがあるので、
随時ちゃんと解明しようと思います。

 

InterfaceとAbstractを使ってみる

「インターフェース」ってよく聞きますが、あんまりわかってないです。
というか全くわかりません、「インターフェース」って言いたいだけです。

PHP conference Kansai2018で
インターフェース再入門」というセッションがあり、
そこから気になりだしたので探ってみます。
会社で、PHP conference Kansai2018共有LTしたので、
もうちょい深いところつつけたらなと思います。

ちなみに過去に私が書いたPHP conference Kansai2018の記事はこちら

PHPカンファレンス関西へ初参戦!

インターフェースとは…

何か目的を果たすための手段となるもの。
中身を知らなくても使う側は使うことができる。

例えば…

ECサイト(「ブーメラン」を売っているお店とする)で考えると

  • 使い手 = 買い手
  • 目的 = 「ブーメラン」をクレジットカードで購入したい
  • 手段 = 決済モジュールのクレジットカード決済

→ この時のインターフェースは「決済モジュール」になります!

例えば…(パート2)

  • 使い手 = わたし
  • 目的 = 青い空の下で音楽を聞きながら、お酒飲みたい!
  • 手段 = フェスに行く

→ この時のインターフェースは「フェス」になります!

↑をPHPで書いてみます!
〜InterfaceとAbstract使って〜

実際に書いてたらabstractとの違いがわかんなくなってきたので、両方使ってみます。

参考:
https://havelog.ayumusato.com/develop/php/e166-php-interface-abstract.html

\  Github – kin29/fes  /

  • GoodFesInterface.php             ←Interface。
  • AbstractFes.php                        ←Abstract。(WildBunchFesの継承クラス)
  • WildBunchFes.php                  ← AbstractFesを継承し、GoodFesInterfaceを使用
  • Watashi.php                              ←わたし(使い手)

◎ 前提

「青い空の下で音楽を聞きながら、お酒飲みたい!」という、
わたしの願いを叶えるための良いフェスの必須条件を
GoodFesInterface.php」  にこめています。

さらに、わたしが今年の夏に楽しんだフェス
「WildBunchFes(通称WBF)」 「CircleFukuoka」 「まつり宮崎」 「AoshimaBeachParkFes」。
これら4つに共通するもの、
「音楽」 「酒」 「晴れ」 「野外」 「フェスの名前」 「思い出」を
AbstractFesクラス」 に詰め込んで各Fesで継承しています。

 

GoodFesInterface.php [Interface]

<?php

namespace Fes;

interface GoodFesInterface
{
    public function isMusic();

    public function isDrink();

    public function isSunny();

    public function isOutdoor();
}

 

AbstractFes.php [Abstract class]

<?php

namespace Fes;

abstract class AbstractFes
{
    public $fes_name;
    public $music;
    public $drink;
    public $place;
    public $weather;
    public $memory;

    public function __construct()
    {
        $this->place = '野外';
        $this->weather = '快晴';
        $this->memory = 'フェス最高 ^ω^';
    }

    /**
     * @return string
     */
    public function getFesName()
    {
        return $this->fes_name;
    }

    /**
     * @return bool
     */
    public function isMusic()
    {
        return isset($this->music);
    }

    /**
     * @return bool
     */
    public function isDrink()
    {
        return isset($this->drink);
    }

    /**
     * @return bool
     */
    public function isOutdoor()
    {
        return ($this->place === '野外');
    }

    /**
     * @return bool
     */
    public function isSunny()
    {
        return ($this->weather === '快晴');
    }

    /**
     * @return string
     */
    public function getMemory()
    {
        return $this->memory;
    }
}

 

WildBunchFes.php

<?php

namespace Fes;

class WildBunchFes extends AbstractFes implements GoodFesInterface
{
    public $fes_name;
    public $music;
    public $drink;
    public $memory;

    public function __construct()
    {
        parent::__construct();
        $this->fes_name = '「ワイルドバンチ」';
        $this->music = 'ヤバT/サカナクション/スカパラ/10-FEET/フォーリミ/teto/ハルカミライ...etc';
        $this->drink = 'ビール、ビール';
        $this->memory = 'しかし、2日目は台風直撃で中止になりました。';
    }
}

 

Watashi.php

<?php

namespace Bootstrap;
require dirname(__DIR__) . '/vendor/autoload.php';

use Fes\WildBunchFes;
...


class Wahatashi
{
    public $wbf;
    ...

    public function __construct()
    {
        $this->wbf = new WildBunchFes();
        ...
    }

    public function done()
    {
        $arrRet = array();
        $arrRet[get_class($this->wbf)] = $this->doneList($this->wbf);
        ...

        var_dump($arrRet);
    }

    public function doneList($class)
    {
        $arrRet = array();
        foreach ($this->arrDoList as $item){
            $arrRet[$item] = $class->{$item}();
        }
        return $arrRet;
    }
}

$i_am = new Wahatashi();
$i_am->done();

Watashi.phpは、
WildBunchFesクラスを通して、GoodFesInterfaceを使って(手段)として、
目的を果たしています。ですよね?w

 

まだまだ私の理解が乏しく、間違っている部分もあるかと思います。
そして、「こんなソースいつ使うんだ?」って感じですが、
自分の好きなものでソースを書くってなかなか面白かったです。

みなさんもぜひしてみてください! \(^^)/