Closed17

セルフオーダーシステムのスターターキットを作る

kawaxkawax

セルフオーダー=飲食店などでユーザーが自分のスマホで注文する仕組み。

セルフオーダーの普及が目的なので最初から他の人も使う「スターターキット」として作ってる。
自分だけで普及させるのは無理。

kawaxkawax

対象

大規模なチェーン店で使うことは想定してなくて1店舗1システムで店舗ごとにカスタマイズして使う。
導入コストをあまりかけられない小規模なお店が対象。

kawaxkawax

スターターキットなので「メニューデータの管理方法」「注文情報の送信先」「決済機能を使うかどうかと支払い方法」などはカスタマイズ可能にしている。

kawaxkawax

メニューデータ

  • array : コードで管理。ほとんどメニューを変更しないならこれでも十分。外部へのAPIリクエストがないので最速。
  • microCMS : 店舗側でメニュー情報を変更するならこういうヘッドレスCMSを使う。 https://microcms.io/
  • Googleスプレッドシート

メニューデータの保存場所はいろいろ考えられる。APIで取得できるなにかでも、CSVファイルでも。

kawaxkawax

注文情報の送信先

  • メール
  • LINE Notify

Laravelの通知機能を使えば注文情報の送信先もいろいろ。
通知を使わなくてもどこかに送信さえすればいい。

POSとの連携が一番必要なのもたぶんここ。

kawaxkawax

決済

決済機能はあまり入れなくなかったけどPayPayだけ試しに対応。

  • レジで後払い
  • PayPay
kawaxkawax

PayPay

PayPay SDKのシンプルなラッパーは別パッケージに分離。
https://github.com/kawax/laravel-paypay

公式SDKだとこんな使い方になるけどこれだとLaravelでテストしにくい。

$response = $client->code->createQRCode();

こう使えれば

use Revolution\PayPay\Facades\PayPay;

$response = PayPay::code()->createQRCode();

テストでモックできる。

use Revolution\PayPay\Facades\PayPay;

PayPay::shouldReceive('code->createQRCode')->once()->andReturn([]);
kawaxkawax

POS連携も予定はしてるけど
どのPOSレジを使ってるかは店舗次第なので必要になったら作る、としかできない。

スマレジみたいにAPIがあればメニューデータにも注文送信先にも使えそう。
https://developers.smaregi.jp/

kawaxkawax

導入のハードルを下げたい。
決済もPOS連携もなければ導入も利用中止も簡単。

kawaxkawax

クロージャを減らす

やっとコードの話。
Laravelだとクロージャを使う場面は多い。

return collect()->map(function ($item) {
    return $item * 2;
});

PHP7.4以上ならアロー関数。

return collect()->map(fn ($item) => $item * 2);

このfn () =>は新しいので自動フォーマットしてもfn()fn ()でスペースの有無がはっきりしない。
PhpStormは設定でどっちかにできるけどそもそも曖昧さを避けるためにクロージャを使わないコードにした。

1.同じクラスのpublicメソッド

public function foo($item) {
    return $item * 2;
}
return collect()->map([$this, 'foo']);

[$this, 'method']の形式で呼び出す。
たぶんpublicメソッド限定。

2.別クラスの__invoke()

class Foo
{
    public function __invoke($item) {
        return $item * 2;
    }
}
return collect()->map(new Foo());
return collect()->map(app(Foo::class));

クロージャが複雑なコードになってたらメソッドやクラスに分離できる。

app()でインスタンス化も今回は大量に使ってる。
Laravelの基本:newは避ける。

クロージャを渡すことが多い箇所も正確にはcallable
Laravelでは至るところで使う。
https://www.php.net/manual/ja/language.types.callable.php

kawaxkawax

リアル店舗で試せそうなのでサポート用のサイト作ってる。
自分で導入をビジネスにする用のサポート兼支払い管理用サイト。

kawaxkawax

Stripeの本番利用可能まで進めた。
Laravel Cashierが最近Stripeチェックアウトに対応してたのでチェックアウトとStripeのカスタマーポータル使ってほとんどStripeに丸投げで定期支払いが完成。
(ただしiOSのブラウザからは不具合ある気がする)

サポートサイトは料金プランとか固有すぎて公開できない。
セルフオーダー導入ビジネスしたい人や会社には提供できる。

セルフオーダーシステムとサポートサイトで誰でも事業化。

kawaxkawax

Laravel Cashier、以前はもっと自分で色々作る必要があった。
まともなプログラマー・エンジニアほどお金が関わることは避けたいけどほとんどStripe任せにできる今のCashierなら使えるだろう。

kawaxkawax

StripeのCheckout使ってるけどもっと簡単にするなら「Stripeのダッシュボードで直接定期支払いを作成する方法」でもいい。
Checkoutもこれも今月対応してる最近の話。
https://github.com/laravel/cashier-stripe/pull/1058

「不特定多数の顧客ではない」「顧客ごとに違う料金」にしたいならこれでもいい。

「Stripeの顧客」を作る必要はあるのでユーザー登録のタイミングで

$user->createAsStripeCustomer();

もしくはどこかで

$user->createOrGetStripeCustomer();

Stripe側に顧客だけが作られてる状態。
この顧客に対してStripeのダッシュボードで新しい定期支払いを作成して請求すればLaravel側はなにも作らなくていい。
Webhookを通してLaravel側のDBにも反映されてるので後は通常通り。
キャンセルはポータルでできる。

定期支払いだけでなく1回だけの支払いにも使えるのでサブスク型のサービス以外にも使い所がありそう。

このスクラップは2021/03/08にクローズされました