@@ -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) { | |||
} | |||
} |
@@ -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']); | |||
@@ -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(); | |||
@@ -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") | |||
]); | |||
@@ -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> | |||
<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> |
@@ -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 | |||
}, | |||
@@ -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; | |||
} | |||
} |
@@ -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> | |||
@@ -35,7 +35,6 @@ | |||
@show | |||
@section('scripts') | |||
<script src="https://js.stripe.com/v3/"></script> | |||
@show | |||
</body> |
@@ -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']); |