複数チケットサービス検索用ライブラリを作って、はじめてのpackagist登録

どうもー!
5月なのに暑いですね、そして梅雨こないですねー
宮崎にも来る気配なしです。

 

今日も音楽フェスに行くのですが、
皆さん、チケットを取る際にどのチケット販売サービスを使っていますか?
どういう基準で選んでますか?
ポイントだったり会員ランクなどてしょうか。

 

入手困難なバンドなんかだと、
私の経験でよくあるのがA,Bというサービスではsold outにもかかわらず、
Cでは残りわずかで残っていたりするのです。
ありがたく即購入するんですが、
この事実に辿りつくまで、
サービスAで検索→sold outを確認
→サービスBで検索→sold outを確認
→サービスCで検索→残りわずかを確認
→嬉し恥ずかし焦る気持ちを抑える
→無事ゲット!!!(ゴール)

ゴールに行くまで3サイトも順番に回るのです。
順番や早さによっては、
先に早く見ておけば取れたかもしれないチケットを
失ってしまうのです。
そんな自分の経験から、複数サービス
(現在チケットぴあ、eplus、ローチケ)を
一括検索できるライブラリを作りました!
スクレイピングを使ってるので、
リニューアルとかされると困りますw

Github→kin29/ticket-hunter

 

Packagistにも登録済みですので、

$ composer require kin29/ticket-hunter

からも取得可能でございます。

 

今回、Packagistへの登録を初めてしました!

こちらを参考にさせてもらいました。

https://qiita.com/niikunihiro/items/fbd696e506e734782d8f

6. GithubのサービスフックにPackagistを登録する

は、自動になったのか勝手に登録された気がしました。

 

 

使い方は、簡単です!

  • 使いたい販売サービス名(TicketPia/Eplus/LawsonTicketのどれか、複数指定可)
  • キーワード(「雨のパレード」など)

を渡すだけです。

<?php

try {
  $ticketVendors = new Kin29\TicketHunter\TicketHunter(['TicketPia', 'Eplus', 'LawsonTicket'], '雨のパレード');
  $ticketVendors->echoJson($ticketVendors->getList());
} catch (\Exception $e) {
    die($e->getMessage());
}

出力結果はこんな感じです。

{
  "TicketPia": [
    {
      "title": "GRAPEVINE/雨のパレード〔愛知〕",
      "date_time": "2019/8/2(金)",
      "pref_id": "23",
      "pref_name": "愛知県",
      "stage": "名古屋クラブクアトロ",
      "sale_method": "先行抽選",
      "sale_status": "近日抽選受付2019/6/8(土) 10:00 ~ 2019/6/10(月) 18:00",
      "link": "http://ticket.pia.jp/pia/ticketInformation.do?eventCd=1922500&rlsCd=&lotRlsCd=27947"
    },
    ...
  ],
  "Eplus": [
    {...省略...},
  ],
  "LawsonTicket": [
    {...省略...},
  ]
}

販売前の場合、販売開始日を取得できるといいな
と今気づきました、issueに入れておこう!
日付のフォーマットも入れてないな、、、入れよう。
アウトプットしてると気づくことて多いですよね、大切。

 

このライブラリを作っていた矢先、先を越されたかのように、
Freaxがリリースれました、、便利ですね。

内容が被っていますが、ライブラリはなさそうなので作り続けました^^;

 

今後は、このライブラリを使ってAPIを作りたいなとおもっています。
BearSundayでまた作りたいなあと思っております。
さらに、検索フォームをSymfonyで作ろうかと思っています。

 

怠けないように宣言しておきます!

では、森道市場2019行ってきます!

 

 

PHP7.3からbreakの代わりにcontinueを使うとWarningになる。

最近PHP7.3にしました!
すると、以下のエラーで大好きなcomposerが使えなくなりました。

 "continue" targeting switch is equivalent to "break". Did you mean to use "continue 2"?  

Google翻訳さんを使って、
「continue」ターゲティングスイッチは「break」と同じです。 “continue 2″を使用するつもりでしたか?
的なことをいってるみたいだなとわかりました。

 

( 解決策はQiitaに書いてます! )

composer installができなくなった時の解決法(PHP7.3)

 

 

そこでまず、
▶︎PHP7.3から、continueをbreakの代わりに使うと、Warningになる?
▶︎continue 2とは?使ったことない!
と私は直感で思いました。

 

 

よくわからなかったので、

とりあえず、やってみます。

参考:https://blog.ohgaki.net/php-7-3#continue

$ php -v
PHP 7.3.1 (cli) (built: Jan 10 2019 13:15:37) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.3.1, Copyright (c) 1998-2018 Zend Technologies
    with Zend OPcache v7.3.1, Copyright (c) 1999-2018, by Zend Technologies

 

test_continue.php

<?php
//$month = 1;を想定

for ($day = 1; $day <= 31; $day++) {

    $message = "{$day}日は、";
    switch ($day) {
        case 1:
            $message .= "月初\n";
            continue;  //break;と同じらしい
        case 15:
            $message .= "月のど真ん中\n";
            continue;
        case 31:
            $message .= "月末\n";
            continue;
        default:
            $message .= "なんともいえない日\n";
            continue;
    }

    echo $message;
}

 

いざ、実行!

$ php test_continue.php 
PHP Warning:  "continue" targeting switch is equivalent to "break". Did you mean to use "continue 2"? in /Users/kin29/php7_3/test_continue.php on line 11
...
/Users/kin29/php7_3/test_continue.php on line 14
...
/Users/kin29/php7_3/test_continue.php on line 17
...
/Users/kin29/php7_3/test_continue.php on line 20
1日は、月初
2日は、なんともいえない日
...
15日は、月のど真ん中
16日は、なんともいえない日
...
31日は、月末

やはり、warningでてますねえ。
おっしゃる通りにcontinue→breakにしてみる。

test_break.php

<?php

//$month = 1;を想定

for ($day = 1; $day <= 31; $day++) {

    $message = "{$day}日は、";
    switch ($day) {
        case 1:
            $message .= "月初\n";
            break;  //continue;と同じ動作をするはず
        case 15:
            $message .= "月のど真ん中\n";
            break;
        case 31:
            $message .= "月末\n";
            break;
        default:
            $message .= "なんともいえない日\n";
            break;
    }

    echo $message;
}

breakで実行すると、
warningも出ず、continueの時と同じ挙動のようです!!!

$ php test_break.php 
1日は、月初
2日は、なんともいえない日
...
15日は、月のど真ん中
16日は、なんともいえない日
...
31日は、月末

そもそも、switchには普段からbreak使ってます。
なんとなくcontinueを使わず、break使ってましたが、それが正しいようです。

ではcontinueの使い時は?continue 2とは?
の確信につきたいと思います。

 

test_continue_2.php

<?php 

//$month = 1;を想定

for ($day = 1; $day <= 31; $day++) {

    $message = "{$day}日は、";
    switch ($day) {
        case 1:
            $message .= "月初\n";
            break;
        case 15:
            $message .= "月のど真ん中\n";
            break;
        case 31:
            $message .= "月末\n";
            break;
        default:
            $message .= "なんともいえない日\n";
            continue 2; //抜けるループのレベル指定
    }

    echo $message;
}

 

さっそく実行!

$ php test_continue_2.php 
1日は、月初
15日は、月のど真ん中
31日は、月末

continueに引数を使うと、抜けるループレベルが指定できるようです。
今回の例でいくと、breakやcontinue(引数なし)ではswitch文しか抜けません。
ただし、continue 2(引数あり)とするとfor文からも抜けだすことができます。

 

まとめ

breakとcontinue(引数なし)は同じ意味なのに、別で存在しているので統一させたい。
あんど、continueは引数ありで使うべきと言いたいんでしょうか。
(そう私は解釈しました。)

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以外の言語でもしてみたいです!

Laravel環境構築してみる!

話題のこの本、
「PHPフレームワーク Laravel Webアプリケーション開発」読んでます!
まだ読み途中ですが・・・。
今回は最初の「環境構築」部分を自分なりにまとめたこと描きます。

Github

環境構築のパターン

  1. VagrantでLaravel環境構築
  2. DockerでLaravel環境構築

二つとも、Macでやります!

1. VagrantでLaravel環境構築

■事前準備
・VirtualBoxのインスートル
・Vagrantのインスートル

■構築する環境
・ドキュメントルート … /home/vagrant/code/testapp/public
・laravelプロジェクトdir … /home/vagrant/code/testapp
・共有dir … /home/vagrant/code = /home/(ユーザdir)/code

■手順

$ cd  /*(user_dir)に移動する*/

$ vagrant box add laravel/homestead

$ git clone git@github.com:laravel/homestead.git Homestead

$ cd Homestead/

# 初期化
$ sh ./init.sh

# ゲストOSの設定ファイル調整
$ vi Homestead.yaml  /* ip、sites、authorize、keyの設定 */

# hosts設定 「192.168.10.10 homestead.test」
$ vi /etc/host  /* Homestead.yamlに合わせてip設定する */

$ cd /*(user_dir)に移動する*/

# ゲストOSとホストOSの共有dir先を作成 
# /home/vagrant/code = /home/(ユーザdir)/code
$ mkdir code/

$ cd Homestead/

# 調整し直したHomestead.yamlの設定でvagrantで環境を立てる 
$ vagrant up

# sshでゲストOSに入る
$ vagrant ssh

# ここからゲストOSにいる
$ cd code/

$ composer create-project laravel/laravel testapp --prefer-dist "5.5.*"

http://homestead.test/
にアクセスするとlaravelのページにアクセスできることを確認!完成\(^^)/

■つまったところ
・何回も作りなお直してたら、もうあるってめちゃ言われました。(以下参照)

The box you're attempting to add already exists. Remove it before
adding it again or add it with the `--force` flag.

Name: laravel/homestead
Provider: virtualbox
Version: 6.3.0

そんなときの対処方法
・その壱

$ vagrant global-status /* 動いてるやつの確認 */
$ vagrant global-status --prune /* 何も出てこない時はこっち */
$ vagrant destroy homestead-7 /* 「homestead-7」を指定してdestroy */

・その弐

$ cd ~/.vagrant.d/boxes/
$ ll
$ rm -rf {target}

2. DockerでLaravel環境構築

■事前準備
・Dockerのインスートール

■構築する環境
・ドキュメントルート … /var/www/public
・laravelプロジェクトdir … /var/www/
・共有dir … /var/www = /home/(ユーザdir)/laravel_docker/testapp

■手順

$ cd

$ mkdir laravel_docker

$ cd laravel_docker

$ git clone https://github.com/laradock/laradock.git

$ cd laradock

$ cp env-example .env

# コンテナ起動(初期化)
$ docker-compose up -d nginx mysql workspace phpmyadmin

# 起動中のコンテナ一覧の確認。各コンテナが起動(up)していることを確認
$ docker-compose ps

# ゲストOSに入る
$ docker-compose exec --user=laradock workspace bash

# testappという名前でlaravelをいれる。
$ composer create-project laravel/laravel testapp --prefer-dist "5.5.*" 

# ゲストOSからでる。
$ exit

# laradock/.envの調整。「APP_CODE_PATH_HOST=../testapp」に書き換える
# /var/www = (user_dir)/laravel_docker/testapp にさせるために!
$ vi .env

# コンテナ一旦シャットダウン
$ docker-compose stop
 
# コンテナ起動。再起動により.envが反映されます。
$ docker-compose up -d nginx mysql

http://localhostでアクセスすると、
laravelのデフォ画面がでるはずです!完成^^

この本ですが
内容はとても親切丁寧なので読みやすいです!
ADRの話なども書いてあって、私には難しいですが頑張れそうです!
もっと読んだらまた記事書きまうす。

簡単決済「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のコマンドってもっとオプションがあるので、
随時ちゃんと解明しようと思います。