--- /dev/null
+<?php
+
+namespace App\Http\Controllers;
+
+use App\IsStripeUnlockable;
+use App\User;
+use Illuminate\Http\Request;
+
+class StripeController extends Controller
+{
+
+ public function paymentIntents (Request $request)
+ {
+ $class = $request->input('model_type');
+ $id = $request->input('model_id');
+
+ throw_unless(class_exists($class), "Class $class doesn't exist");
+
+ /** @var IsStripeUnlockable $model */
+ $model = $class::findOrFail($id);
+
+ throw_unless(method_exists($model, 'getUnlockPrice'), 'Could not get unlock price');
+
+ $price = $model->getUnlockPrice();
+
+ /** @var User $user */
+ $user = \Auth::user();
+ $customer = $user->getStripeCustomer();
+
+ $paymentIntent = \Stripe\PaymentIntent::create([
+ "amount" => $price,
+ "currency" => 'eur',
+// 'setup_future_usage' => 'on_session',
+ 'customer' => $customer->id,
+ 'metadata' => [
+ 'model_type' => $class,
+ 'model_id' => $id
+ ]
+ ]);
+ // Send Payment Intent details to client
+ return response()->json($paymentIntent);
+ }
+
+
+
+}
--- /dev/null
+<?php
+
+namespace App\Http\Controllers;
+use App\IsStripeUnlockable;
+use App\User;
+use Illuminate\Http\Response;
+use Illuminate\Support\Arr;
+use Illuminate\Http\Request;
+use Laravel\Cashier\Http\Controllers\WebhookController as BaseStripeWebhookController;
+
+class StripeWebhookController extends BaseStripeWebhookController
+{
+
+ /**
+ * @param array $payload
+ * @return \Symfony\Component\HttpFoundation\Response
+ */
+ protected function handlePaymentIntentSucceeded($payload)
+ {
+ $data = Arr::get($payload, 'data.object');
+ $class = $data['metadata']['model_type'];
+ $id = $data['metadata']['model_id'];
+
+ /** @var IsStripeUnlockable $article */
+ $article = $class::findOrFail($id);
+
+
+ if ($user = $this->getUserByStripeId($data['customer'])) {
+ $article->unlockedUsers()->attach($user->id, [
+ 'stripe_payment' => $data
+ ]);
+ }
+
+
+ return $this->successMethod();
+
+ }
+
+ /**
+ * @param $payload
+ * @return \Symfony\Component\HttpFoundation\Response
+ */
+ protected function handlePaymentMethodAttached($payload)
+ {
+
+ $data = Arr::get($payload, 'data.object');
+ if ($user = $this->getUserByStripeId($data['customer'])) {
+ if($data['type'] !== 'card')
+ return $this->successMethod();
+
+ $user->forceFill([
+ 'card_brand' => Arr::get($data, 'card.brand'),
+ 'card_last_four' => Arr::get($data, 'card.last4')
+ ])->save();
+
+ return $this->successMethod();
+ }
+
+ return new Response('Customer not found', 404);
+ }
+
+
+
+ /**
+ * Get the billable entity instance by Stripe ID.
+ *
+ * @param string|null $stripeId
+ * @return User
+ */
+ protected function getUserByStripeId($stripeId)
+ {
+ return User::where('stripe_id', $stripeId)->first();
+ }
+
+ protected function missingMethod($parameters = [])
+ {
+ return new Response('Not found', 404);
+ }
+
+}
--- /dev/null
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+class AddInfosToUsers extends Migration
+{
+ /**
+ * Run the migrations.
+ *
+ * @return void
+ */
+ public function up()
+ {
+ Schema::table('users', function (Blueprint $table) {
+ $table->string('service')->nullable();
+ $table->boolean('wants_pdf')->default(0);
+ $table->boolean('accepts_polls')->default(0);
+ });
+ }
+
+ /**
+ * Reverse the migrations.
+ *
+ * @return void
+ */
+ public function down()
+ {
+ Schema::table('users', function (Blueprint $table) {
+ $table->dropColumn('service');
+ $table->dropColumn('wants_pdf');
+ $table->dropColumn('accepts_polls');
+ });
+ }
+}
--- /dev/null
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+class CreateUnlockedArticlesTables extends Migration
+{
+ /**
+ * Run the migrations.
+ *
+ * @return void
+ */
+ public function up()
+ {
+ Schema::create('unlocked_articles_table', function (Blueprint $table) {
+ $table->id();
+ $table->unsignedBigInteger('user_id');
+ $table->morphs('article');
+ $table->json('stripe_payment')->nullable();
+ $table->timestamps();
+ });
+ }
+
+ /**
+ * Reverse the migrations.
+ *
+ * @return void
+ */
+ public function down()
+ {
+ Schema::dropIfExists('unlocked_articles_table');
+ }
+}