From 7f70738eb628003d5e645e7f0849cf37f2854e57 Mon Sep 17 00:00:00 2001
From: Immanuel Onyeka <immanuel@onyeka.ca>
Date: Sat, 19 Jun 2021 18:13:40 -0400
Subject: [PATCH] Change payment section from stripe to payeer

---
 app/Http/Controllers/BillingController.php    |  51 +++---
 .../2014_10_12_000000_create_users_table.php  |   2 +-
 ...06_08_224029_create_transactions_table.php |   1 -
 database/seeders/DatabaseSeeder.php           |   8 +-
 resources/images/payeer.png                   | Bin 0 -> 3610 bytes
 resources/images/perfect_money.svg            |  88 +++++++++++
 resources/js/panel/credits.vue                | 147 +++++++++---------
 resources/js/panel/settings.vue               |   7 +-
 resources/scss/main.scss                      |  35 ++++-
 resources/views/home.blade.php                |   3 +-
 resources/views/master.blade.php              |   1 -
 routes/web.php                                |   3 +-
 12 files changed, 237 insertions(+), 109 deletions(-)
 create mode 100644 resources/images/payeer.png
 create mode 100644 resources/images/perfect_money.svg

diff --git a/app/Http/Controllers/BillingController.php b/app/Http/Controllers/BillingController.php
index 56c2c55..2b5f1ef 100644
--- a/app/Http/Controllers/BillingController.php
+++ b/app/Http/Controllers/BillingController.php
@@ -23,21 +23,28 @@ class BillingController extends Controller
 		$this->user = Auth::user();
 	}
 
-	protected function attempt(Request $request) {
+	protected function attempt($packs) {
 		$user = Auth::user();
-		$amount = $request->packs[ 'credits10' ]*1099 +
-			$request->packs[ 'credits50' ]*5499 + $request->packs[ 'credits100' ]*10999
-			+ $request->packs[ 'credits1000' ]*101000;
+
+		foreach($packs as $value) {
+			if ($value < 0) {
+				abort(422);
+			}
+		}
+
+		$amount = $packs[ 'credits10' ]*1099 +
+			$packs[ 'credits50' ]*5499 + $packs[ 'credits100' ]*10999
+			+ $packs[ 'credits1000' ]*101000;
 
 		$transaction = new Transaction;
-		$transaction->credits = $request->packs['credits10']*1000 +
-			$request->packs['credits50']*5000 +
-			$request->packs['credits100']*10000 +
-			$request->packs['credits1000']*100000;
+		$transaction->credits = $packs['credits10']*1000 +
+			$packs['credits50']*5000 +
+			$packs['credits100']*10000 +
+			$packs['credits1000']*100000;
 		$transaction->credits_extra =
-			$request->packs['credits50']*500 +
-			$request->packs['credits100']*1000 +
-			$request->packs['credits1000']*15000;
+			$packs['credits50']*500 +
+			$packs['credits100']*1000 +
+			$packs['credits1000']*15000;
 
 		$transaction->user_id = $user->id;
 		$transaction->charge = $amount;
@@ -51,7 +58,7 @@ class BillingController extends Controller
 	//Should validate that all amounts are positive integers in a reasonable range
 	public function stripeSecret(Request $request) {
 		$user = Auth::user();
-		$transaction = $this->attempt($request);
+		$transaction = $this->attempt($request->packs);
 
 		$intent = PaymentIntent::create([
 			'amount' => $amount,
@@ -125,25 +132,33 @@ class BillingController extends Controller
 	//Receives a request with a packs. It is an array of each type of credit
 	//amount to be bought
 	public function payeer(Request $request) {
-		$transaction = $this->attempt($request);
+		$user = Auth::user();
+		$transaction = $this->attempt($request->packs);
 		$shopid = config('services.payeer.id');
 		$secret = config('services.payeer.secret');
 		$param_key = config('services.payeer.param_key');
-		$total = $transaction->credits + $transaction->credits_extra;
+		$total = $transaction->credits/100 + $transaction->credits_extra/100;
+		$description =  base64_encode("You will receive $total credits.");
 
-		$arHash = [$shopid, $transaction->id, $transaction->charge, 'USD', "You
-			will receive $total credits."];
+		$arHash = [$shopid, $transaction->id, $transaction->charge/100, 'USD',
+			$description];
 
 		$params = ['reference' => ['transaction_id' => $transaction->id]];
 		$key = md5($param_key.$transaction->id);
-		$encodedParams = urlencode(base64_encode(openssl_encrypt(
+		$encodedParams = @urlencode(base64_encode(openssl_encrypt(
 			json_encode($params), 'AES-256-CBC', $key, OPENSSL_RAW_DATA
 		)));
 		$arHash[] = $encodedParams;
 		$arHash[] = $secret;
 
 		$signature = strtoupper(hash('sha256', implode(':', $arHash)));
+		$user->paying = true; $user->save();
+
 		return [ 'signature' => $signature, 'params' => $encodedParams, 'shop'
-			=> $shopid, 'transaction' => $transaction->id ];
+			=> $shopid, 'transaction' => $transaction->id, 'amount' =>
+			$transaction->charge/100, 'description' => $description ];
+	}
+
+	public function processPayeer(Request $request) {
 	}
 }
diff --git a/database/migrations/2014_10_12_000000_create_users_table.php b/database/migrations/2014_10_12_000000_create_users_table.php
index 1dac20a..702dc14 100644
--- a/database/migrations/2014_10_12_000000_create_users_table.php
+++ b/database/migrations/2014_10_12_000000_create_users_table.php
@@ -17,7 +17,7 @@ class CreateUsersTable extends Migration
             $table->id();
             $table->string('name');
             $table->string('email')->unique();
-            $table->string('customer_id')->unique();
+            $table->string('customer_id')->unique()->nullable();
             $table->timestamp('email_verified_at')->nullable();
             $table->string('password');
             $table->enum('role', ['client', 'guest', 'admin']);
diff --git a/database/migrations/2021_06_08_224029_create_transactions_table.php b/database/migrations/2021_06_08_224029_create_transactions_table.php
index 1240a26..647e4d4 100644
--- a/database/migrations/2021_06_08_224029_create_transactions_table.php
+++ b/database/migrations/2021_06_08_224029_create_transactions_table.php
@@ -20,7 +20,6 @@ class CreateTransactionsTable extends Migration
 			$table->integer('credits')->unsigned();
 			$table->integer('credits_extra')->unsigned()->default(0);
             $table->string('status');
-            $table->string('intent_id')->unique();
             $table->boolean('completed');
             $table->string('note')->nullable();
             $table->timestamps();
diff --git a/database/seeders/DatabaseSeeder.php b/database/seeders/DatabaseSeeder.php
index fb04301..5bac2c7 100644
--- a/database/seeders/DatabaseSeeder.php
+++ b/database/seeders/DatabaseSeeder.php
@@ -20,11 +20,12 @@ class DatabaseSeeder extends Seeder
     public function run()
     {
 		Stripe::setApiKey(config('services.stripe.secret'));
+
 		 User::create([
 			'name' => 'test_user_unverified',
 			'email' => 'unverified@example.com',
 			'role' => 'client',
-			'customer_id' => Customer::create(['email' => 'unverified@example.com'])->id,
+			'credits' => 55000,
 			'active' => true,
 			'password' => Hash::make("test123")
 		]);
@@ -32,8 +33,7 @@ class DatabaseSeeder extends Seeder
 			'name' => 'test_user_verified',
 			'email' => 'verified@example.com',
 			'email_verified_at' => now(),
-			'credits' => 250,
-			'customer_id' => Customer::create(['email' => 'verified@example.com'])->id,
+			'credits' => 25000,
 			'role' => 'client',
 			'active' => true,
 			'password' => Hash::make("test123")
@@ -42,8 +42,8 @@ class DatabaseSeeder extends Seeder
 			'name' => 'test_admin_verified',
 			'email' => 'admin_verified@example.com',
 			'email_verified_at' => now(),
-			'customer_id' => Customer::create(['email' => 'admin_verified@example.com'])->id,
 			'role' => 'admin',
+			'credits' => 55000,
 			'active' => true,
 			'password' => Hash::make("test123")
 		]);
diff --git a/resources/images/payeer.png b/resources/images/payeer.png
new file mode 100644
index 0000000000000000000000000000000000000000..257c0170264dec4231428f8e0346e2328472532e
GIT binary patch
literal 3610
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
A+5i9m

literal 0
HcmV?d00001

diff --git a/resources/images/perfect_money.svg b/resources/images/perfect_money.svg
new file mode 100644
index 0000000..9630019
--- /dev/null
+++ b/resources/images/perfect_money.svg
@@ -0,0 +1,88 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="230px" height="60px" viewBox="0 0 230 60" enable-background="new 0 0 230 60" xml:space="preserve">  <image id="image0" width="230" height="60" x="0" y="0"
+    xlink:href="data:image/png;base64,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
+AElFTkSuQmCC" />
+</svg>
diff --git a/resources/js/panel/credits.vue b/resources/js/panel/credits.vue
index 00ef39b..ac4a3e7 100644
--- a/resources/js/panel/credits.vue
+++ b/resources/js/panel/credits.vue
@@ -23,25 +23,26 @@
 	<h4>Select a payment method</h4>
 
 	<div class="sliding-menu">
-	<a @click="selectSaved = true" :class="{selected: selectSaved}">Saved Card</a>
-	<a @click="selectSaved = false" :class="{selected: !selectSaved}">New Card</a>
-	<div :class="{right: !selectSaved}" class="menu-slider"><div></div></div>
+	<a @click="method = 'payeer'" :class="{selected: method == 'payeer'}">Payeer</a>
+	<a @click="method = 'pm'" :class="{selected: method == 'pm'}">Perfect Money</a>
+	<div :class="{right: (method == 'pm')}" class="menu-slider"><div></div></div>
 	</div>
 
-	<saved-cards :preferred="preferred" v-model:picked-card="picked" :cards="cards"
-	:token="token" v-if="selectSaved"></saved-cards>
-
-	<payment-card @set-card="(c) => {card = c}" @card-valid="(val) => {cardValid = val}"
-	@update-billing-name="billingName = $event.target.value" :stripe="stripe"
-	v-if="!selectSaved">
-	</payment-card>
-	<div>
-	<input type="checkbox"><label>I have read and agree to the<a
-	href="/terms-and-policy">Terms and Policy</a></label>
-	<div class="info-grey">
-		<span>A chargeback will result in a ban. Contact <a
-		href="#contact">support</a>if you have any problems of concerns.</span>
+	<div v-if="method == 'payeer'" class="payment-window">
+	<img src="../../images/payeer.png" alt="">
+	<p>Payeer allows you to pay securely by transfering your choice of cryptocurrency
+	to a temporary address.
+	</p>
 	</div>
+
+	<div v-if="method == 'pm'" class="payment-window">
+	<img src="../../images/perfect_money.svg" alt="">
+	<p>Pay by transfering USD from your Perfect Money wallet.</p>
+	</div>
+
+	<div id="agreement-check">
+	<input v-model="agreed" type="checkbox"><label>I have read and agree to the <a
+	href="/terms-and-policy">Terms and Policy</a> and will not pursue a fraudulent dispute or chargeback.</label>
 	<div id="payment-error"></div>
 	</div>
 </section>
@@ -51,14 +52,10 @@
 	class="brand-btn">Buy<loading v-if="loading"></loading></button>
 </section>
 
-<PurchaseCompleted v-if="complete"></PurchaseCompleted>
 </template>
 
 <script>
 import Loading from '../icons/loading.vue'
-import PaymentCard from './payment-card.vue'
-import SavedCards from './saved-cards.vue'
-import PurchaseCompleted from './purchase-completed.vue'
 
 function total() {
 	return this.packs.credits10*10.99 + this.packs.credits50*54.99
@@ -88,78 +85,78 @@ function getSecret() {
 	})
 }
 
-//Gets key from the server then sends it with stripe
-//Maybe it should asl attach the user's receipt email
 function pay() {
-	this.getSecret().then(secret => {
-		if (!secret) {return}
-		this.loading = true
-		if (!this.selectSaved) {
-			return this.stripe.confirmCardPayment(secret, {
-				payment_method: {
-					card: this.card,
-					billing_details: {name:
-					document.getElementById('billing-name').value},
-				},
-				setup_future_usage: document.querySelector(
-				"#save-card input").value == 'on' ? 'off_session' : null
-			})
-		} else {
-			return this.stripe.confirmCardPayment(secret, {
-				payment_method: this.picked
-			})
-		}
-	}).then(result => {
-		if (result.error) {
-			document.getElementById('payment-error').textContent =
-			result.error.message
-		} else if (result.paymentIntent.status === 'succeeded') {
-			setTimeout(() => {this.$emit('purchaseComplete')}, 4000)
-			setTimeout(() => {this.$emit('purchaseComplete')}, 10000)
-			this.complete = true
-		} else {
-			document.getElementById('payment-error').textContent =
-			'An unknown error occured'
-		}
-		this.loading = false
-	})
+	if (this.method == 'payeer') {
+		this.payPayeer();
+	} else if (this.method == 'pm') {
+		this.payPm();
+	}
+}
+
+function makeInput(name, value) {
+	let input = document.createElement('input')
+	input.type = 'hidden'
+	input.name = name
+	input.value = value
+	return input
 }
 
-function getCards() {
-	fetch('/panel/cards', {
-		method: 'GET',
+function payPayeer() {
+	fetch('/panel/payeer', {
+		method: 'POST',
 		headers: {'Content-Type': 'application/json',
 			'Accept': 'application/json',
-		'X-XSRF-TOKEN': this.token}
-	}).then((response) => {response.json().then(data => {
-		this.cards = data.data
-		if (this.cards && this.cards.length > 0) {
-			this.picked = this.cards[0].id
-		}
-	})})
+		'X-XSRF-TOKEN': this.token},
+		body: JSON.stringify({'packs': this.packs})
+		}).then(response => {return response.json()}).then(data => {
+			let form = document.createElement('form')
+			document.body.appendChild(form)
+			form.method = 'post'
+			form.action = 'https://payeer.com/merchant/'
+			form.appendChild(this.makeInput('m_shop', data.shop))
+			form.appendChild(this.makeInput('m_orderid', data.transaction))
+			form.appendChild(this.makeInput('m_amount', data.amount))
+			form.appendChild(this.makeInput('m_curr', 'USD'))
+			form.appendChild(this.makeInput('m_desc', data.description))
+			form.appendChild(this.makeInput('m_sign', data.signature))
+			form.appendChild(this.makeInput('m_params', data.params))
+			form.appendChild(this.makeInput('m_cipher_method', 'AES-256-CBC'))
+			form.submit()
+			/* console.log(data.description) */
+			/* console.log(data.signature) */
+		})
+
+}
+
+function payPm() {
+
 }
 
 function ready() {
-	return this.total != 0 && !this.loading && ((this.cardValid &&
-	this.billingName) || this.picked)
+	if (this.packs.credis10 < 0) {
+		return false
+	} else if (this.packs.credis50 < 0) {
+		return false	
+	} else if (this.packs.credis100 < 0) {
+		return false
+	} else if (this.packs.credis1000 < 0) {
+		return false
+	}
+
+	return this.total > 0 && !this.loading && this.agreed
 }
 
 export default {
-	components:{Loading, PaymentCard, SavedCards, PurchaseCompleted},
+	components:{Loading},
 	data() {
 		return {packs: {credits10: 0, credits50: 0,
-		credits100: 0, credits1000: 0}, loading: false, stripe:
-		window.Stripe(process.env.VUE_APP_STRIPE_KEY), card:
-		null, billingName: null, selectSaved: true, cardValid: false, cards:
-		null, picked: null, complete: false
+		credits100: 0, credits1000: 0}, loading: false, method: 'payeer',
+		complete: false, agreed: false
 		}
 	},
 	computed: {total, ready},
-	methods: {getSecret, pay, getCards},
+	methods: {getSecret, pay, payPm, payPayeer, makeInput},
 	props: ['preferred', 'token'],
 	emits: ['purchaseComplete'],
-	created() {
-		this.getCards()	
-	}
 }
 </script>
diff --git a/resources/js/panel/settings.vue b/resources/js/panel/settings.vue
index 9f7e376..d0bfbc0 100644
--- a/resources/js/panel/settings.vue
+++ b/resources/js/panel/settings.vue
@@ -1,10 +1,6 @@
 <template>
 <div>
 	<h3>Settings</h3>
-	<section class="billing-pane">
-		<h4>Billing</h4>
-		<edit-cards :preferred="user.payment_method" :token="token"></edit-cards>
-	</section>
 	<section class="change-name-pane">
 		<h4>Name</h4>
 		<input :value="user.name" name="name" id="changed_name" type="text">
@@ -30,7 +26,6 @@
 
 <script>
 import Loading from '../icons/loading.vue'
-import EditCards from './edit-cards.vue'
 
 function changeName() {
 	let name = document.getElementById('changed_name').value
@@ -115,7 +110,7 @@ function changePassword() {
 }
 
 export default {
-	components: {Loading, EditCards},
+	components: {Loading,},
 	methods: {
 		changePassword, changeName, changeEmail
 	},
diff --git a/resources/scss/main.scss b/resources/scss/main.scss
index c4bead1..98dc50f 100644
--- a/resources/scss/main.scss
+++ b/resources/scss/main.scss
@@ -567,7 +567,8 @@ section.features-info {
 }
 
 div.register-area.active {
-	min-height: 35em;
+	height: fit-content;
+	min-height: 20em;
 	opacity: 1;
 }
 
@@ -1336,3 +1337,35 @@ main.terms {
 		color: grey;
 	}
 }
+
+.payment-window {
+	min-height: 5em;
+	margin-top: 1em;
+	text-align: center;
+	color: grey;
+	img {
+		width: 250px;
+		max-width: 80%;
+		margin: auto;
+		margin-bottom: 1em;
+		display: block;
+		height: 90px;
+	}
+}
+
+#agreement-check {
+	margin: auto;
+	max-width: 30em;
+	display: flex;
+	align-items: center;
+
+	label {
+		display: inline-block;
+		// width: 85%;
+		margin: 1em;
+	}
+
+	input {
+		display: inline-block;
+	}
+}
diff --git a/resources/views/home.blade.php b/resources/views/home.blade.php
index 8aa0eb1..2052902 100644
--- a/resources/views/home.blade.php
+++ b/resources/views/home.blade.php
@@ -193,7 +193,8 @@
 		</p></div></div>
 		<div class="collapsible"><button>How can I pay?</button>
 		<div class="content"><p>
-		We accept credit and debit through Mastercard and Visa.
+		We accept Bitcoin, Litecoin, and other cryptocurrencies through our
+		Payeer and Perfect Money payment providers.
 		</p></div></div>
 
 		</div>
diff --git a/resources/views/master.blade.php b/resources/views/master.blade.php
index de9b6a1..3ed0b76 100644
--- a/resources/views/master.blade.php
+++ b/resources/views/master.blade.php
@@ -35,7 +35,6 @@
 @show
 
 @section('scripts')
-	<script src="https://js.stripe.com/v3/"></script>
 @show
 
 </body>
diff --git a/routes/web.php b/routes/web.php
index cc30c70..cd76ea9 100644
--- a/routes/web.php
+++ b/routes/web.php
@@ -112,6 +112,7 @@ Route::post('/panel/orders', [OrderController::class,
 Route::post('/panel/secret', [BillingController::class,
 	'stripeSecret'])->middleware([ 'auth', 'verified' ]);
 
+//Initiate a payeer payment
 Route::post('/panel/payeer', [BillingController::class,
 	'payeer'])->middleware([ 'auth', 'verified' ]);
 
@@ -124,4 +125,4 @@ Route::post('/hooks/charge',
 
 //Payeer handler function
 Route::post('/hooks/payeer-transaction',
-	[BillingController::class, 'payeer']);
+	[BillingController::class, 'processPayeer']);