@@ -23,21 +23,28 @@ class BillingController extends Controller | |||||
$this->user = Auth::user(); | $this->user = Auth::user(); | ||||
} | } | ||||
protected function attempt(Request $request) { | |||||
protected function attempt($packs) { | |||||
$user = Auth::user(); | $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 = 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 = | $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->user_id = $user->id; | ||||
$transaction->charge = $amount; | $transaction->charge = $amount; | ||||
@@ -51,7 +58,7 @@ class BillingController extends Controller | |||||
//Should validate that all amounts are positive integers in a reasonable range | //Should validate that all amounts are positive integers in a reasonable range | ||||
public function stripeSecret(Request $request) { | public function stripeSecret(Request $request) { | ||||
$user = Auth::user(); | $user = Auth::user(); | ||||
$transaction = $this->attempt($request); | |||||
$transaction = $this->attempt($request->packs); | |||||
$intent = PaymentIntent::create([ | $intent = PaymentIntent::create([ | ||||
'amount' => $amount, | '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 | //Receives a request with a packs. It is an array of each type of credit | ||||
//amount to be bought | //amount to be bought | ||||
public function payeer(Request $request) { | public function payeer(Request $request) { | ||||
$transaction = $this->attempt($request); | |||||
$user = Auth::user(); | |||||
$transaction = $this->attempt($request->packs); | |||||
$shopid = config('services.payeer.id'); | $shopid = config('services.payeer.id'); | ||||
$secret = config('services.payeer.secret'); | $secret = config('services.payeer.secret'); | ||||
$param_key = config('services.payeer.param_key'); | $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]]; | $params = ['reference' => ['transaction_id' => $transaction->id]]; | ||||
$key = md5($param_key.$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 | json_encode($params), 'AES-256-CBC', $key, OPENSSL_RAW_DATA | ||||
))); | ))); | ||||
$arHash[] = $encodedParams; | $arHash[] = $encodedParams; | ||||
$arHash[] = $secret; | $arHash[] = $secret; | ||||
$signature = strtoupper(hash('sha256', implode(':', $arHash))); | $signature = strtoupper(hash('sha256', implode(':', $arHash))); | ||||
$user->paying = true; $user->save(); | |||||
return [ 'signature' => $signature, 'params' => $encodedParams, 'shop' | 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) { | |||||
} | } | ||||
} | } |
@@ -17,7 +17,7 @@ class CreateUsersTable extends Migration | |||||
$table->id(); | $table->id(); | ||||
$table->string('name'); | $table->string('name'); | ||||
$table->string('email')->unique(); | $table->string('email')->unique(); | ||||
$table->string('customer_id')->unique(); | |||||
$table->string('customer_id')->unique()->nullable(); | |||||
$table->timestamp('email_verified_at')->nullable(); | $table->timestamp('email_verified_at')->nullable(); | ||||
$table->string('password'); | $table->string('password'); | ||||
$table->enum('role', ['client', 'guest', 'admin']); | $table->enum('role', ['client', 'guest', 'admin']); | ||||
@@ -20,7 +20,6 @@ class CreateTransactionsTable extends Migration | |||||
$table->integer('credits')->unsigned(); | $table->integer('credits')->unsigned(); | ||||
$table->integer('credits_extra')->unsigned()->default(0); | $table->integer('credits_extra')->unsigned()->default(0); | ||||
$table->string('status'); | $table->string('status'); | ||||
$table->string('intent_id')->unique(); | |||||
$table->boolean('completed'); | $table->boolean('completed'); | ||||
$table->string('note')->nullable(); | $table->string('note')->nullable(); | ||||
$table->timestamps(); | $table->timestamps(); | ||||
@@ -20,11 +20,12 @@ class DatabaseSeeder extends Seeder | |||||
public function run() | public function run() | ||||
{ | { | ||||
Stripe::setApiKey(config('services.stripe.secret')); | Stripe::setApiKey(config('services.stripe.secret')); | ||||
User::create([ | User::create([ | ||||
'name' => 'test_user_unverified', | 'name' => 'test_user_unverified', | ||||
'email' => 'unverified@example.com', | 'email' => 'unverified@example.com', | ||||
'role' => 'client', | 'role' => 'client', | ||||
'customer_id' => Customer::create(['email' => 'unverified@example.com'])->id, | |||||
'credits' => 55000, | |||||
'active' => true, | 'active' => true, | ||||
'password' => Hash::make("test123") | 'password' => Hash::make("test123") | ||||
]); | ]); | ||||
@@ -32,8 +33,7 @@ class DatabaseSeeder extends Seeder | |||||
'name' => 'test_user_verified', | 'name' => 'test_user_verified', | ||||
'email' => 'verified@example.com', | 'email' => 'verified@example.com', | ||||
'email_verified_at' => now(), | 'email_verified_at' => now(), | ||||
'credits' => 250, | |||||
'customer_id' => Customer::create(['email' => 'verified@example.com'])->id, | |||||
'credits' => 25000, | |||||
'role' => 'client', | 'role' => 'client', | ||||
'active' => true, | 'active' => true, | ||||
'password' => Hash::make("test123") | 'password' => Hash::make("test123") | ||||
@@ -42,8 +42,8 @@ class DatabaseSeeder extends Seeder | |||||
'name' => 'test_admin_verified', | 'name' => 'test_admin_verified', | ||||
'email' => 'admin_verified@example.com', | 'email' => 'admin_verified@example.com', | ||||
'email_verified_at' => now(), | 'email_verified_at' => now(), | ||||
'customer_id' => Customer::create(['email' => 'admin_verified@example.com'])->id, | |||||
'role' => 'admin', | 'role' => 'admin', | ||||
'credits' => 55000, | |||||
'active' => true, | 'active' => true, | ||||
'password' => Hash::make("test123") | 'password' => Hash::make("test123") | ||||
]); | ]); | ||||
@@ -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> |
@@ -23,25 +23,26 @@ | |||||
<h4>Select a payment method</h4> | <h4>Select a payment method</h4> | ||||
<div class="sliding-menu"> | <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> | </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> | ||||
<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 id="payment-error"></div> | ||||
</div> | </div> | ||||
</section> | </section> | ||||
@@ -51,14 +52,10 @@ | |||||
class="brand-btn">Buy<loading v-if="loading"></loading></button> | class="brand-btn">Buy<loading v-if="loading"></loading></button> | ||||
</section> | </section> | ||||
<PurchaseCompleted v-if="complete"></PurchaseCompleted> | |||||
</template> | </template> | ||||
<script> | <script> | ||||
import Loading from '../icons/loading.vue' | 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() { | function total() { | ||||
return this.packs.credits10*10.99 + this.packs.credits50*54.99 | 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() { | 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', | headers: {'Content-Type': 'application/json', | ||||
'Accept': '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() { | 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 { | export default { | ||||
components:{Loading, PaymentCard, SavedCards, PurchaseCompleted}, | |||||
components:{Loading}, | |||||
data() { | data() { | ||||
return {packs: {credits10: 0, credits50: 0, | 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}, | computed: {total, ready}, | ||||
methods: {getSecret, pay, getCards}, | |||||
methods: {getSecret, pay, payPm, payPayeer, makeInput}, | |||||
props: ['preferred', 'token'], | props: ['preferred', 'token'], | ||||
emits: ['purchaseComplete'], | emits: ['purchaseComplete'], | ||||
created() { | |||||
this.getCards() | |||||
} | |||||
} | } | ||||
</script> | </script> |
@@ -1,10 +1,6 @@ | |||||
<template> | <template> | ||||
<div> | <div> | ||||
<h3>Settings</h3> | <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"> | <section class="change-name-pane"> | ||||
<h4>Name</h4> | <h4>Name</h4> | ||||
<input :value="user.name" name="name" id="changed_name" type="text"> | <input :value="user.name" name="name" id="changed_name" type="text"> | ||||
@@ -30,7 +26,6 @@ | |||||
<script> | <script> | ||||
import Loading from '../icons/loading.vue' | import Loading from '../icons/loading.vue' | ||||
import EditCards from './edit-cards.vue' | |||||
function changeName() { | function changeName() { | ||||
let name = document.getElementById('changed_name').value | let name = document.getElementById('changed_name').value | ||||
@@ -115,7 +110,7 @@ function changePassword() { | |||||
} | } | ||||
export default { | export default { | ||||
components: {Loading, EditCards}, | |||||
components: {Loading,}, | |||||
methods: { | methods: { | ||||
changePassword, changeName, changeEmail | changePassword, changeName, changeEmail | ||||
}, | }, | ||||
@@ -567,7 +567,8 @@ section.features-info { | |||||
} | } | ||||
div.register-area.active { | div.register-area.active { | ||||
min-height: 35em; | |||||
height: fit-content; | |||||
min-height: 20em; | |||||
opacity: 1; | opacity: 1; | ||||
} | } | ||||
@@ -1336,3 +1337,35 @@ main.terms { | |||||
color: grey; | 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; | |||||
} | |||||
} |
@@ -193,7 +193,8 @@ | |||||
</p></div></div> | </p></div></div> | ||||
<div class="collapsible"><button>How can I pay?</button> | <div class="collapsible"><button>How can I pay?</button> | ||||
<div class="content"><p> | <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> | </p></div></div> | ||||
</div> | </div> | ||||
@@ -35,7 +35,6 @@ | |||||
@show | @show | ||||
@section('scripts') | @section('scripts') | ||||
<script src="https://js.stripe.com/v3/"></script> | |||||
@show | @show | ||||
</body> | </body> |
@@ -112,6 +112,7 @@ Route::post('/panel/orders', [OrderController::class, | |||||
Route::post('/panel/secret', [BillingController::class, | Route::post('/panel/secret', [BillingController::class, | ||||
'stripeSecret'])->middleware([ 'auth', 'verified' ]); | 'stripeSecret'])->middleware([ 'auth', 'verified' ]); | ||||
//Initiate a payeer payment | |||||
Route::post('/panel/payeer', [BillingController::class, | Route::post('/panel/payeer', [BillingController::class, | ||||
'payeer'])->middleware([ 'auth', 'verified' ]); | 'payeer'])->middleware([ 'auth', 'verified' ]); | ||||
@@ -124,4 +125,4 @@ Route::post('/hooks/charge', | |||||
//Payeer handler function | //Payeer handler function | ||||
Route::post('/hooks/payeer-transaction', | Route::post('/hooks/payeer-transaction', | ||||
[BillingController::class, 'payeer']); | |||||
[BillingController::class, 'processPayeer']); |