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']);