mirror of
https://github.com/invoiceninja/invoiceninja.git
synced 2025-05-24 02:14:21 -04:00
Merge branch 'wepay' of https://github.com/turbo124/invoiceninja into wepay
This commit is contained in:
commit
24f935e277
@ -34,7 +34,6 @@ class StripeConnectController extends BaseController
|
||||
if(!is_array($request->getTokenContent()))
|
||||
abort(400, 'Invalid token');
|
||||
|
||||
|
||||
MultiDB::findAndSetDbByCompanyKey($request->getTokenContent()['company_key']);
|
||||
|
||||
$data = [
|
||||
|
62
app/Http/Controllers/WePayController.php
Normal file
62
app/Http/Controllers/WePayController.php
Normal file
@ -0,0 +1,62 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Invoice Ninja (https://invoiceninja.com).
|
||||
*
|
||||
* @link https://github.com/invoiceninja/invoiceninja source repository
|
||||
*
|
||||
* @copyright Copyright (c) 2021. Invoice Ninja LLC (https://invoiceninja.com)
|
||||
*
|
||||
* @license https://opensource.org/licenses/AAL
|
||||
*/
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use App\Libraries\MultiDB;
|
||||
use App\Models\CompanyGateway;
|
||||
use App\Models\User;
|
||||
use App\PaymentDrivers\WePayPaymentDriver;
|
||||
use App\Utils\Traits\MakesHash;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\Cache;
|
||||
|
||||
class WePayController extends BaseController
|
||||
{
|
||||
use MakesHash;
|
||||
/**
|
||||
* Initialize WePay Signup.
|
||||
*/
|
||||
public function signup(string $token)
|
||||
{
|
||||
|
||||
// $hash = [
|
||||
// 'user_id' => auth()->user()->id,
|
||||
// 'company_key'=> auth()->user()->company()->company_key,
|
||||
// 'context' => $request->input('context'),
|
||||
// ];
|
||||
|
||||
$hash = Cache::get($token);
|
||||
|
||||
//temporarily comment this out
|
||||
// if(!$hash)
|
||||
// abort(400, 'Link expired');
|
||||
// MultiDB::findAndSetDbByCompanyKey($hash['company_key']);
|
||||
// $data['user_id'] = $this->encodePrimaryKey($hash['user_id']);
|
||||
// $data['company_key'] = $hash['company_key'];
|
||||
|
||||
$user = User::first();
|
||||
$data['user_id'] = $user->id;
|
||||
|
||||
$data['company_key'] = $user->account->companies()->first()->company_key;
|
||||
|
||||
$wepay_driver = new WePayPaymentDriver(new CompanyGateway, null, null);
|
||||
|
||||
return $wepay_driver->setup($data);
|
||||
|
||||
}
|
||||
|
||||
public function processSignup(Request $request)
|
||||
{
|
||||
|
||||
}
|
||||
}
|
138
app/Http/Livewire/WepaySignup.php
Normal file
138
app/Http/Livewire/WepaySignup.php
Normal file
@ -0,0 +1,138 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Invoice Ninja (https://invoiceninja.com).
|
||||
*
|
||||
* @link https://github.com/invoiceninja/invoiceninja source repository
|
||||
*
|
||||
* @copyright Copyright (c) 2021. Invoice Ninja LLC (https://invoiceninja.com)
|
||||
*
|
||||
* @license https://opensource.org/licenses/AAL
|
||||
*/
|
||||
|
||||
namespace App\Http\Livewire;
|
||||
|
||||
use App\Models\Company;
|
||||
use App\Models\CompanyGateway;
|
||||
use App\Models\User;
|
||||
use App\PaymentDrivers\WePayPaymentDriver;
|
||||
use Illuminate\Support\Facades\Hash;
|
||||
use Livewire\Component;
|
||||
use WePay;
|
||||
|
||||
class WepaySignup extends Component
|
||||
{
|
||||
public $user;
|
||||
public $user_id;
|
||||
public $company_key;
|
||||
public $first_name;
|
||||
public $last_name;
|
||||
public $email;
|
||||
public $company_name;
|
||||
public $country;
|
||||
public $ach;
|
||||
public $wepay_payment_tos_agree;
|
||||
|
||||
public $terms;
|
||||
public $privacy_policy;
|
||||
|
||||
public $saved;
|
||||
|
||||
protected $rules = [
|
||||
'first_name' => ['required'],
|
||||
'last_name' => ['required'],
|
||||
'email' => ['required', 'email'],
|
||||
'company_name' => ['required'],
|
||||
'country' => ['required'],
|
||||
'ach' => ['sometimes'],
|
||||
'wepay_payment_tos_agree' => ['accepted'],
|
||||
];
|
||||
|
||||
public function mount()
|
||||
{
|
||||
$user = User::find($this->user_id);
|
||||
$company = Company::where('company_key', $this->company_key)->first();
|
||||
|
||||
$this->fill([
|
||||
'wepay_payment_tos_agree' => '',
|
||||
'ach' => '',
|
||||
'country' => 'US',
|
||||
'user' => $user,
|
||||
'first_name' => $user->first_name,
|
||||
'last_name' => $user->last_name,
|
||||
'email' => $user->email,
|
||||
'company_name' => $company->present()->name(),
|
||||
'saved' => ctrans('texts.confirm'),
|
||||
'terms' => '<a href="https://go.wepay.com/terms-of-service" target="_blank">'.ctrans('texts.terms_of_service').'</a>',
|
||||
'privacy_policy' => '<a href="https://go.wepay.com/privacy-policy" target="_blank">'.ctrans('texts.privacy_policy').'</a>',
|
||||
]);
|
||||
}
|
||||
|
||||
public function render()
|
||||
{
|
||||
return render('gateways.wepay.signup.wepay-signup');
|
||||
}
|
||||
|
||||
public function submit()
|
||||
{
|
||||
|
||||
$data = $this->validate($this->rules);
|
||||
|
||||
$this->saved = ctrans('texts.processing');
|
||||
|
||||
$wepay_driver = new WePayPaymentDriver(new CompanyGateway, null, null);
|
||||
|
||||
$wepay_driver->init();
|
||||
|
||||
$user_details = [
|
||||
'client_id' => config('ninja.wepay.client_id'),
|
||||
'client_secret' => config('ninja.wepay.client_secret'),
|
||||
'email' => $data['email'],
|
||||
'first_name' => $data['first_name'],
|
||||
'last_name' => $data['last_name'],
|
||||
'original_ip' => request()->ip(),
|
||||
'original_device' => request()->server('HTTP_USER_AGENT'),
|
||||
'tos_acceptance_time' => time(),
|
||||
'redirect_uri' => route('wepay.process_signup'),
|
||||
'scope' => 'manage_accounts,collect_payments,view_user,preapprove_payments,send_money',
|
||||
];
|
||||
|
||||
$wepay_user = $wepay_driver->request('user/register/', $user_details);
|
||||
|
||||
$access_token = $wepay_user->access_token;
|
||||
|
||||
$access_token_expires = $wepay_user->expires_in ? (time() + $wepay_user->expires_in) : null;
|
||||
|
||||
$wepay = new WePay($access_token);
|
||||
|
||||
$account_details = [
|
||||
'name' => $data['company_name']),
|
||||
'description' => ctrans('texts.wepay_account_description'),
|
||||
'theme_object' => json_decode({"name":"Invoice Ninja","primary_color":"0b4d78","secondary_color":"0b4d78","background_color":"f8f8f8","button_color":"33b753"}),
|
||||
'callback_uri' => $accountGateway->getWebhookUrl(),
|
||||
'rbits' => $account->present()->rBits,
|
||||
'country' => $data['country'],
|
||||
];
|
||||
|
||||
if (Input::get('country') == 'CA') {
|
||||
$accountDetails['currencies'] = ['CAD'];
|
||||
$accountDetails['country_options'] = ['debit_opt_in' => boolval(Input::get('debit_cards'))];
|
||||
} elseif (Input::get('country') == 'GB') {
|
||||
$accountDetails['currencies'] = ['GBP'];
|
||||
}
|
||||
|
||||
$wepayAccount = $wepay->request('account/create/', $accountDetails);
|
||||
|
||||
try {
|
||||
$wepay->request('user/send_confirmation/', []);
|
||||
$confirmationRequired = true;
|
||||
} catch (\WePayException $ex) {
|
||||
if ($ex->getMessage() == 'This access_token is already approved.') {
|
||||
$confirmationRequired = false;
|
||||
} else {
|
||||
throw $ex;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
@ -65,6 +65,7 @@ class SystemLog extends Model
|
||||
const TYPE_CHECKOUT = 304;
|
||||
const TYPE_AUTHORIZE = 305;
|
||||
const TYPE_CUSTOM = 306;
|
||||
const TYPE_WEPAY = 309;
|
||||
|
||||
const TYPE_QUOTA_EXCEEDED = 400;
|
||||
const TYPE_UPSTREAM_FAILURE = 401;
|
||||
|
@ -47,164 +47,5 @@ class Account
|
||||
]);
|
||||
}
|
||||
|
||||
/*** If this is a new account (ie there is no account_id in company_gateways.config, the we need to create an account as below.
|
||||
|
||||
///
|
||||
// $stripe = new \Stripe\StripeClient(
|
||||
// 'sk_test_4eC39HqLyjWDarjtT1zdp7dc'
|
||||
// );
|
||||
// $stripe->accounts->create([
|
||||
// 'type' => 'standard',
|
||||
// 'country' => 'US', //if we have it - inject
|
||||
// 'email' => 'jenny.rosen@example.com', //if we have it - inject
|
||||
// ]);
|
||||
///
|
||||
|
||||
|
||||
//response
|
||||
|
||||
//******************* We should store the 'id' as a property in the config with the key `account_id`
|
||||
|
||||
/**
|
||||
* {
|
||||
"id": "acct_1032D82eZvKYlo2C",
|
||||
"object": "account",
|
||||
"business_profile": {
|
||||
"mcc": null,
|
||||
"name": "Stripe.com",
|
||||
"product_description": null,
|
||||
"support_address": null,
|
||||
"support_email": null,
|
||||
"support_phone": null,
|
||||
"support_url": null,
|
||||
"url": null
|
||||
},
|
||||
"capabilities": {
|
||||
"card_payments": "active",
|
||||
"transfers": "active"
|
||||
},
|
||||
"charges_enabled": false,
|
||||
"country": "US",
|
||||
"default_currency": "usd",
|
||||
"details_submitted": false,
|
||||
"email": "site@stripe.com",
|
||||
"metadata": {},
|
||||
"payouts_enabled": false,
|
||||
"requirements": {
|
||||
"current_deadline": null,
|
||||
"currently_due": [
|
||||
"business_profile.product_description",
|
||||
"business_profile.support_phone",
|
||||
"business_profile.url",
|
||||
"external_account",
|
||||
"tos_acceptance.date",
|
||||
"tos_acceptance.ip"
|
||||
],
|
||||
"disabled_reason": "requirements.past_due",
|
||||
"errors": [],
|
||||
"eventually_due": [
|
||||
"business_profile.product_description",
|
||||
"business_profile.support_phone",
|
||||
"business_profile.url",
|
||||
"external_account",
|
||||
"tos_acceptance.date",
|
||||
"tos_acceptance.ip"
|
||||
],
|
||||
"past_due": [],
|
||||
"pending_verification": []
|
||||
},
|
||||
"settings": {
|
||||
"bacs_debit_payments": {},
|
||||
"branding": {
|
||||
"icon": null,
|
||||
"logo": null,
|
||||
"primary_color": null,
|
||||
"secondary_color": null
|
||||
},
|
||||
"card_issuing": {
|
||||
"tos_acceptance": {
|
||||
"date": null,
|
||||
"ip": null
|
||||
}
|
||||
},
|
||||
"card_payments": {
|
||||
"decline_on": {
|
||||
"avs_failure": true,
|
||||
"cvc_failure": false
|
||||
},
|
||||
"statement_descriptor_prefix": null
|
||||
},
|
||||
"dashboard": {
|
||||
"display_name": "Stripe.com",
|
||||
"timezone": "US/Pacific"
|
||||
},
|
||||
"payments": {
|
||||
"statement_descriptor": null,
|
||||
"statement_descriptor_kana": null,
|
||||
"statement_descriptor_kanji": null
|
||||
},
|
||||
"payouts": {
|
||||
"debit_negative_balances": true,
|
||||
"schedule": {
|
||||
"delay_days": 7,
|
||||
"interval": "daily"
|
||||
},
|
||||
"statement_descriptor": null
|
||||
},
|
||||
"sepa_debit_payments": {}
|
||||
},
|
||||
"type": "standard"
|
||||
}
|
||||
|
||||
*/
|
||||
|
||||
|
||||
//At this stage we have an account, so we need to generate the account link
|
||||
//then create the account link
|
||||
|
||||
// now we start the stripe onboarding flow
|
||||
// https://stripe.com/docs/api/account_links/object
|
||||
//
|
||||
/**
|
||||
* $stripe = new \Stripe\StripeClient(
|
||||
'sk_test_4eC39HqLyjWDarjtT1zdp7dc'
|
||||
);
|
||||
$stripe->accountLinks->create([
|
||||
'account' => 'acct_1032D82eZvKYlo2C',
|
||||
'refresh_url' => 'https://example.com/reauth',
|
||||
'return_url' => 'https://example.com/return',
|
||||
'type' => 'account_onboarding',
|
||||
]);
|
||||
*/
|
||||
|
||||
/**
|
||||
* Response =
|
||||
* {
|
||||
"object": "account_link",
|
||||
"created": 1618869558,
|
||||
"expires_at": 1618869858,
|
||||
"url": "https://connect.stripe.com/setup/s/9BhFaPdfseRF"
|
||||
}
|
||||
*/
|
||||
|
||||
//The users account may not be active yet, we need to pull the account back and check for the property `charges_enabled`
|
||||
//
|
||||
//
|
||||
|
||||
|
||||
// What next?
|
||||
//
|
||||
// Now we need to create a superclass of the StripePaymentDriver, i believe the only thing we need to change is the way we initialize the gateway..
|
||||
|
||||
/**
|
||||
*
|
||||
\Stripe\Stripe::setApiKey("{{PLATFORM_SECRET_KEY}}"); <--- platform secret key = Invoice Ninja secret key
|
||||
\Stripe\Customer::create(
|
||||
["email" => "person@example.edu"],
|
||||
["stripe_account" => "{{CONNECTED_STRIPE_ACCOUNT_ID}}"] <------ company_gateway.config.account_id
|
||||
);
|
||||
|
||||
|
||||
*/
|
||||
|
||||
}
|
||||
|
31
app/PaymentDrivers/WePay/CreditCard.php
Normal file
31
app/PaymentDrivers/WePay/CreditCard.php
Normal file
@ -0,0 +1,31 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Invoice Ninja (https://invoiceninja.com).
|
||||
*
|
||||
* @link https://github.com/invoiceninja/invoiceninja source repository
|
||||
*
|
||||
* @copyright Copyright (c) 2021. Invoice Ninja LLC (https://invoiceninja.com)
|
||||
*
|
||||
* @license https://opensource.org/licenses/AAL
|
||||
*/
|
||||
|
||||
namespace App\PaymentDrivers\WePay;
|
||||
|
||||
use App\PaymentDrivers\WePayPaymentDriver;
|
||||
|
||||
class CreditCard
|
||||
{
|
||||
public $wepay;
|
||||
|
||||
public function __construct(WePayPaymentDriver $wepay)
|
||||
{
|
||||
$this->wepay = $wepay;
|
||||
}
|
||||
|
||||
public function authorizeView($data)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
}
|
206
app/PaymentDrivers/WePay/Setup.php
Normal file
206
app/PaymentDrivers/WePay/Setup.php
Normal file
@ -0,0 +1,206 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Invoice Ninja (https://invoiceninja.com).
|
||||
*
|
||||
* @link https://github.com/invoiceninja/invoiceninja source repository
|
||||
*
|
||||
* @copyright Copyright (c) 2021. Invoice Ninja LLC (https://invoiceninja.com)
|
||||
*
|
||||
* @license https://opensource.org/licenses/AAL
|
||||
*/
|
||||
|
||||
namespace App\PaymentDrivers\WePay;
|
||||
|
||||
use App\PaymentDrivers\WePayPaymentDriver;
|
||||
use Illuminate\Http\Request;
|
||||
|
||||
class Setup
|
||||
{
|
||||
public $wepay;
|
||||
|
||||
public function __construct(WePayPaymentDriver $wepay)
|
||||
{
|
||||
$this->wepay = $wepay;
|
||||
}
|
||||
|
||||
public function boot($data)
|
||||
{
|
||||
/*
|
||||
'user_id',
|
||||
'company_key',
|
||||
*/
|
||||
|
||||
return render('gateways.wepay.signup.index', $data);
|
||||
}
|
||||
|
||||
|
||||
public function processSignup(Request $request)
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
protected function setupWePay($accountGateway, &$response)
|
||||
{
|
||||
$user = Auth::user();
|
||||
$account = $user->account;
|
||||
|
||||
$rules = [
|
||||
'company_name' => 'required',
|
||||
'tos_agree' => 'required',
|
||||
'first_name' => 'required',
|
||||
'last_name' => 'required',
|
||||
'email' => 'required|email',
|
||||
'country' => 'required|in:US,CA,GB',
|
||||
];
|
||||
|
||||
$validator = Validator::make(Input::all(), $rules);
|
||||
|
||||
if ($validator->fails()) {
|
||||
return Redirect::to('gateways/create')
|
||||
->withErrors($validator)
|
||||
->withInput();
|
||||
}
|
||||
|
||||
if (! $user->email) {
|
||||
$user->email = trim(Input::get('email'));
|
||||
$user->first_name = trim(Input::get('first_name'));
|
||||
$user->last_name = trim(Input::get('last_name'));
|
||||
$user->save();
|
||||
}
|
||||
|
||||
try {
|
||||
$wepay = Utils::setupWePay();
|
||||
|
||||
$userDetails = [
|
||||
'client_id' => WEPAY_CLIENT_ID,
|
||||
'client_secret' => WEPAY_CLIENT_SECRET,
|
||||
'email' => Input::get('email'),
|
||||
'first_name' => Input::get('first_name'),
|
||||
'last_name' => Input::get('last_name'),
|
||||
'original_ip' => \Request::getClientIp(true),
|
||||
'original_device' => \Request::server('HTTP_USER_AGENT'),
|
||||
'tos_acceptance_time' => time(),
|
||||
'redirect_uri' => URL::to('gateways'),
|
||||
'scope' => 'manage_accounts,collect_payments,view_user,preapprove_payments,send_money',
|
||||
];
|
||||
|
||||
$wepayUser = $wepay->request('user/register/', $userDetails);
|
||||
|
||||
$accessToken = $wepayUser->access_token;
|
||||
$accessTokenExpires = $wepayUser->expires_in ? (time() + $wepayUser->expires_in) : null;
|
||||
|
||||
$wepay = new WePay($accessToken);
|
||||
|
||||
$accountDetails = [
|
||||
'name' => Input::get('company_name'),
|
||||
'description' => trans('texts.wepay_account_description'),
|
||||
'theme_object' => json_decode(WEPAY_THEME),
|
||||
'callback_uri' => $accountGateway->getWebhookUrl(),
|
||||
'rbits' => $account->present()->rBits,
|
||||
'country' => Input::get('country'),
|
||||
];
|
||||
|
||||
if (Input::get('country') == 'CA') {
|
||||
$accountDetails['currencies'] = ['CAD'];
|
||||
$accountDetails['country_options'] = ['debit_opt_in' => boolval(Input::get('debit_cards'))];
|
||||
} elseif (Input::get('country') == 'GB') {
|
||||
$accountDetails['currencies'] = ['GBP'];
|
||||
}
|
||||
|
||||
$wepayAccount = $wepay->request('account/create/', $accountDetails);
|
||||
|
||||
try {
|
||||
$wepay->request('user/send_confirmation/', []);
|
||||
$confirmationRequired = true;
|
||||
} catch (\WePayException $ex) {
|
||||
if ($ex->getMessage() == 'This access_token is already approved.') {
|
||||
$confirmationRequired = false;
|
||||
} else {
|
||||
throw $ex;
|
||||
}
|
||||
}
|
||||
|
||||
$accountGateway->gateway_id = GATEWAY_WEPAY;
|
||||
$accountGateway->setConfig([
|
||||
'userId' => $wepayUser->user_id,
|
||||
'accessToken' => $accessToken,
|
||||
'tokenType' => $wepayUser->token_type,
|
||||
'tokenExpires' => $accessTokenExpires,
|
||||
'accountId' => $wepayAccount->account_id,
|
||||
'state' => $wepayAccount->state,
|
||||
'testMode' => WEPAY_ENVIRONMENT == WEPAY_STAGE,
|
||||
'country' => Input::get('country'),
|
||||
]);
|
||||
|
||||
if ($confirmationRequired) {
|
||||
Session::flash('message', trans('texts.created_wepay_confirmation_required'));
|
||||
} else {
|
||||
$updateUri = $wepay->request('/account/get_update_uri', [
|
||||
'account_id' => $wepayAccount->account_id,
|
||||
'redirect_uri' => URL::to('gateways'),
|
||||
]);
|
||||
|
||||
$response = Redirect::to($updateUri->uri);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
$response = Redirect::to("gateways/{$accountGateway->public_id}/edit");
|
||||
|
||||
return true;
|
||||
} catch (\WePayException $e) {
|
||||
Session::flash('error', $e->getMessage());
|
||||
$response = Redirect::to('gateways/create')
|
||||
->withInput();
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
|
||||
|
||||
rbits
|
||||
|
||||
|
||||
private function createRBit($type, $source, $properties)
|
||||
{
|
||||
$data = new stdClass();
|
||||
$data->receive_time = time();
|
||||
$data->type = $type;
|
||||
$data->source = $source;
|
||||
$data->properties = new stdClass();
|
||||
|
||||
foreach ($properties as $key => $val) {
|
||||
$data->properties->$key = $val;
|
||||
}
|
||||
|
||||
return $data;
|
||||
}
|
||||
|
||||
public function rBits()
|
||||
{
|
||||
$account = $this->entity;
|
||||
$user = $account->users()->first();
|
||||
$data = [];
|
||||
|
||||
$data[] = $this->createRBit('business_name', 'user', ['business_name' => $account->name]);
|
||||
$data[] = $this->createRBit('industry_code', 'user', ['industry_detail' => $account->present()->industry]);
|
||||
$data[] = $this->createRBit('comment', 'partner_database', ['comment_text' => 'Logo image not present']);
|
||||
$data[] = $this->createRBit('business_description', 'user', ['business_description' => $account->present()->size]);
|
||||
|
||||
$data[] = $this->createRBit('person', 'user', ['name' => $user->getFullName()]);
|
||||
$data[] = $this->createRBit('email', 'user', ['email' => $user->email]);
|
||||
$data[] = $this->createRBit('phone', 'user', ['phone' => $user->phone]);
|
||||
$data[] = $this->createRBit('website_uri', 'user', ['uri' => $account->website]);
|
||||
$data[] = $this->createRBit('external_account', 'partner_database', ['is_partner_account' => 'yes', 'account_type' => 'Invoice Ninja', 'create_time' => time()]);
|
||||
|
||||
return $data;
|
||||
}
|
||||
*/
|
112
app/PaymentDrivers/WePayPaymentDriver.php
Normal file
112
app/PaymentDrivers/WePayPaymentDriver.php
Normal file
@ -0,0 +1,112 @@
|
||||
<?php
|
||||
/**
|
||||
* Invoice Ninja (https://invoiceninja.com).
|
||||
*
|
||||
* @link https://github.com/invoiceninja/invoiceninja source repository
|
||||
*
|
||||
* @copyright Copyright (c) 2021. Invoice Ninja LLC (https://invoiceninja.com)
|
||||
*
|
||||
* @license https://opensource.org/licenses/AAL
|
||||
*/
|
||||
|
||||
namespace App\PaymentDrivers;
|
||||
|
||||
use App\Models\ClientGatewayToken;
|
||||
use App\Models\GatewayType;
|
||||
use App\Models\Payment;
|
||||
use App\Models\PaymentHash;
|
||||
use App\Models\SystemLog;
|
||||
use App\PaymentDrivers\WePay\CreditCard;
|
||||
use App\PaymentDrivers\WePay\Setup;
|
||||
use App\Utils\Traits\MakesHash;
|
||||
use Illuminate\Http\Request;
|
||||
use WePay;
|
||||
|
||||
class WePayPaymentDriver extends BaseDriver
|
||||
{
|
||||
use MakesHash;
|
||||
|
||||
public $refundable = true; //does this gateway support refunds?
|
||||
|
||||
public $token_billing = true; //does this gateway support token billing?
|
||||
|
||||
public $can_authorise_credit_card = true; //does this gateway support authorizations?
|
||||
|
||||
public $wepay; //initialized gateway
|
||||
|
||||
public $payment_method; //initialized payment method
|
||||
|
||||
public static $methods = [
|
||||
GatewayType::CREDIT_CARD => CreditCard::class, //maps GatewayType => Implementation class
|
||||
];
|
||||
|
||||
const SYSTEM_LOG_TYPE = SystemLog::TYPE_WEPAY;
|
||||
|
||||
public function init()
|
||||
{
|
||||
|
||||
if (WePay::getEnvironment() == 'none') {
|
||||
|
||||
if(config('ninja.wepay.environment') == 'staging')
|
||||
WePay::useStaing(config('ninja.wepay.client_id'), config('ninja.wepay.client_secret'));
|
||||
else
|
||||
WePay::useProduction(config('ninja.wepay.client_id'), config('ninja.wepay.client_secret'));
|
||||
|
||||
}
|
||||
|
||||
if ($this->company_gateway)
|
||||
$this->wepay = new WePay($this->company_gateway->getConfig()->accessToken);
|
||||
|
||||
$this->wepay = new WePay(null);
|
||||
|
||||
return $this;
|
||||
|
||||
}
|
||||
|
||||
public function setup(array $data)
|
||||
{
|
||||
return (new Setup($this))->boot($data);
|
||||
}
|
||||
|
||||
public function processSetup(Request $request)
|
||||
{
|
||||
return (new Setup($this))->processSignup($request);
|
||||
}
|
||||
|
||||
public function setPaymentMethod($payment_method_id)
|
||||
{
|
||||
$class = self::$methods[$payment_method_id];
|
||||
$this->payment_method = new $class($this);
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function authorizeView(array $data)
|
||||
{
|
||||
return $this->payment_method->authorizeView($data); //this is your custom implementation from here
|
||||
}
|
||||
|
||||
public function authorizeResponse($request)
|
||||
{
|
||||
return $this->payment_method->authorizeResponse($request); //this is your custom implementation from here
|
||||
}
|
||||
|
||||
public function processPaymentView(array $data)
|
||||
{
|
||||
return $this->payment_method->paymentView($data); //this is your custom implementation from here
|
||||
}
|
||||
|
||||
public function processPaymentResponse($request)
|
||||
{
|
||||
return $this->payment_method->paymentResponse($request); //this is your custom implementation from here
|
||||
}
|
||||
|
||||
public function refund(Payment $payment, $amount, $return_client_response = false)
|
||||
{
|
||||
return $this->payment_method->yourRefundImplementationHere(); //this is your custom implementation from here
|
||||
}
|
||||
|
||||
public function tokenBilling(ClientGatewayToken $cgt, PaymentHash $payment_hash)
|
||||
{
|
||||
return $this->payment_method->yourTokenBillingImplmentation(); //this is your custom implementation from here
|
||||
}
|
||||
}
|
@ -71,7 +71,14 @@ class InvoiceMigrationRepository extends BaseRepository
|
||||
|
||||
$model->fill($tmp_data);
|
||||
$model->status_id = $tmp_data['status_id'];
|
||||
$model->save();
|
||||
|
||||
if(array_key_exists('created_at', $data))
|
||||
$model->created_at = $data['created_at'];
|
||||
|
||||
if(array_key_exists('updated_at', $data))
|
||||
$model->updated_at = $data['updated_at'];
|
||||
|
||||
$model->save(['timestamps' => false]);
|
||||
|
||||
if (array_key_exists('documents', $data)) {
|
||||
$this->saveDocuments($data['documents'], $model);
|
||||
|
@ -70,6 +70,7 @@
|
||||
"turbo124/beacon": "^1.0",
|
||||
"turbo124/laravel-gmail": "^5",
|
||||
"webpatser/laravel-countries": "dev-master#75992ad",
|
||||
"wepay/php-sdk": "^0.3",
|
||||
"wildbit/swiftmailer-postmark": "^3.3"
|
||||
},
|
||||
"require-dev": {
|
||||
@ -136,4 +137,4 @@
|
||||
},
|
||||
"minimum-stability": "dev",
|
||||
"prefer-stable": true
|
||||
}
|
||||
}
|
||||
|
53
composer.lock
generated
53
composer.lock
generated
@ -4,7 +4,7 @@
|
||||
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
|
||||
"This file is @generated automatically"
|
||||
],
|
||||
"content-hash": "38a79899673526624db4d62a76dd9a5e",
|
||||
"content-hash": "8ebeefd50035c907152aebf54d1dbd21",
|
||||
"packages": [
|
||||
{
|
||||
"name": "asm/php-ansible",
|
||||
@ -10155,6 +10155,57 @@
|
||||
},
|
||||
"time": "2019-07-12T14:06:05+00:00"
|
||||
},
|
||||
{
|
||||
"name": "wepay/php-sdk",
|
||||
"version": "0.3.1",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/wepay/PHP-SDK.git",
|
||||
"reference": "2a89ceb2954d117d082f869d3bfcb7864e6c2a7d"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/wepay/PHP-SDK/zipball/2a89ceb2954d117d082f869d3bfcb7864e6c2a7d",
|
||||
"reference": "2a89ceb2954d117d082f869d3bfcb7864e6c2a7d",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"ext-curl": "*",
|
||||
"php": ">=5.3.0"
|
||||
},
|
||||
"type": "library",
|
||||
"extra": {
|
||||
"branch-alias": {
|
||||
"dev-master": "0.2.x-dev"
|
||||
}
|
||||
},
|
||||
"autoload": {
|
||||
"classmap": [
|
||||
"wepay.php"
|
||||
]
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"Apache-2.0"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "WePay",
|
||||
"email": "api@wepay.com"
|
||||
}
|
||||
],
|
||||
"description": "WePay APIv2 SDK for PHP",
|
||||
"keywords": [
|
||||
"payment",
|
||||
"sdk",
|
||||
"wepay"
|
||||
],
|
||||
"support": {
|
||||
"issues": "https://github.com/wepay/PHP-SDK/issues",
|
||||
"source": "https://github.com/wepay/PHP-SDK/tree/master"
|
||||
},
|
||||
"time": "2017-01-21T07:03:26+00:00"
|
||||
},
|
||||
{
|
||||
"name": "wildbit/swiftmailer-postmark",
|
||||
"version": "3.3.0",
|
||||
|
@ -148,4 +148,9 @@ return [
|
||||
'disable_auto_update' => env('DISABLE_AUTO_UPDATE', false),
|
||||
'invoiceninja_hosted_pdf_generation' => env('NINJA_HOSTED_PDF', false),
|
||||
'ninja_stripe_key' => env('NINJA_STRIPE_KEY', null),
|
||||
'wepay' => [
|
||||
'environment' => env('WEPAY_ENVIRONMENT', 'staging'),
|
||||
'client_id' => env('WEPAY_CLIENT_ID', ''),
|
||||
'client_secret' => env('WEPAY_CLIENT_SECRET',''),
|
||||
]
|
||||
];
|
||||
|
30
database/migrations/2021_05_05_014713_activate_we_pay.php
Normal file
30
database/migrations/2021_05_05_014713_activate_we_pay.php
Normal file
@ -0,0 +1,30 @@
|
||||
<?php
|
||||
|
||||
use App\Models\Gateway;
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
|
||||
class ActivateWePay extends Migration
|
||||
{
|
||||
/**
|
||||
* Run the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function up()
|
||||
{
|
||||
if(Gateway::count() >=1)
|
||||
Gateway::whereIn('id', [49])->update(['visible' => true]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function down()
|
||||
{
|
||||
//
|
||||
}
|
||||
}
|
@ -95,7 +95,7 @@ class PaymentLibrariesSeeder extends Seeder
|
||||
|
||||
Gateway::query()->update(['visible' => 0]);
|
||||
|
||||
Gateway::whereIn('id', [1,15,20,39,55])->update(['visible' => 1]);
|
||||
Gateway::whereIn('id', [1,15,20,39,55,49])->update(['visible' => 1]);
|
||||
|
||||
Gateway::all()->each(function ($gateway) {
|
||||
$gateway->site_url = $gateway->getHelp();
|
||||
|
383
public/images/wepay.svg
Normal file
383
public/images/wepay.svg
Normal file
@ -0,0 +1,383 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="146.57001"
|
||||
height="53.70924"
|
||||
viewBox="0 0 38.779979 14.21057"
|
||||
version="1.1"
|
||||
id="svg3260"
|
||||
inkscape:version="0.92.0 r15299"
|
||||
sodipodi:docname="wepay.svg">
|
||||
<defs
|
||||
id="defs3254">
|
||||
<clipPath
|
||||
id="clipPath3278"
|
||||
clipPathUnits="userSpaceOnUse">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path3276"
|
||||
d="M 0,0 H 595.276 V 841.89 H 0 Z" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath3288"
|
||||
clipPathUnits="userSpaceOnUse">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path3286"
|
||||
d="M 0,841.89 H 595.276 V 0 H 0 Z" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath3318"
|
||||
clipPathUnits="userSpaceOnUse">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path3316"
|
||||
d="M 0,841.89 H 595.276 V 0 H 0 Z" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath3326"
|
||||
clipPathUnits="userSpaceOnUse">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path3324"
|
||||
d="M 419.528,14.172 H 581.103 V 31.18 H 419.528 Z" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath3340"
|
||||
clipPathUnits="userSpaceOnUse">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path3338"
|
||||
d="M 419.528,14.172 H 581.102 V 31.18 H 419.528 Z" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath4412"
|
||||
clipPathUnits="userSpaceOnUse">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path4410"
|
||||
d="M 0,0 H 598.441 V 612 H 0 Z" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath4436"
|
||||
clipPathUnits="userSpaceOnUse">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path4434"
|
||||
d="m 536.641,119.187 h 220.051 v 64.601 H 536.641 Z" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath4640"
|
||||
clipPathUnits="userSpaceOnUse">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path4638"
|
||||
d="M 0,0 H 612 V 792 H 0 Z" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath4648"
|
||||
clipPathUnits="userSpaceOnUse">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path4646"
|
||||
d="M 35,523.946 H 577 V 98.36 H 35 Z" />
|
||||
</clipPath>
|
||||
<radialGradient
|
||||
id="radialGradient4660"
|
||||
spreadMethod="pad"
|
||||
gradientTransform="matrix(533.4704,0,0,-533.4704,126.08601,504.87846)"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
r="1"
|
||||
cy="0"
|
||||
cx="0"
|
||||
fy="0"
|
||||
fx="0">
|
||||
<stop
|
||||
id="stop4654"
|
||||
offset="0"
|
||||
style="stop-opacity:1;stop-color:#ffffff" />
|
||||
<stop
|
||||
id="stop4656"
|
||||
offset="0.288571"
|
||||
style="stop-opacity:1;stop-color:#ffffff" />
|
||||
<stop
|
||||
id="stop4658"
|
||||
offset="1"
|
||||
style="stop-opacity:1;stop-color:#f58345" />
|
||||
</radialGradient>
|
||||
<clipPath
|
||||
id="clipPath4686"
|
||||
clipPathUnits="userSpaceOnUse">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path4684"
|
||||
d="M 0,0 H 612 V 792 H 0 Z" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath4722"
|
||||
clipPathUnits="userSpaceOnUse">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path4720"
|
||||
d="M 0,0 H 612 V 792 H 0 Z" />
|
||||
</clipPath>
|
||||
<linearGradient
|
||||
id="linearGradient4744"
|
||||
spreadMethod="pad"
|
||||
gradientTransform="matrix(540,0,0,-540,36,610.90001)"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
y2="0"
|
||||
x2="1"
|
||||
y1="0"
|
||||
x1="0">
|
||||
<stop
|
||||
id="stop4740"
|
||||
offset="0"
|
||||
style="stop-opacity:1;stop-color:#808285" />
|
||||
<stop
|
||||
id="stop4742"
|
||||
offset="1"
|
||||
style="stop-opacity:1;stop-color:#4f4f51" />
|
||||
</linearGradient>
|
||||
<clipPath
|
||||
id="clipPath4766"
|
||||
clipPathUnits="userSpaceOnUse">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path4764"
|
||||
d="M 44.28,414.765 H 255.575 V 495 H 44.28 Z" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath4896"
|
||||
clipPathUnits="userSpaceOnUse">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path4894"
|
||||
d="m 36.544,99.36 h 539.4 v 422.445 h -539.4 z" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath4904"
|
||||
clipPathUnits="userSpaceOnUse">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path4902"
|
||||
d="M -32.9452,542.473 H 652.766 V -381.128 H -32.9452 Z" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath4936"
|
||||
clipPathUnits="userSpaceOnUse">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path4934"
|
||||
d="M 139.265,232.92 H 474.15 V 389.039 H 139.265 Z" />
|
||||
</clipPath>
|
||||
<mask
|
||||
id="mask4940"
|
||||
height="1"
|
||||
width="1"
|
||||
y="0"
|
||||
x="0"
|
||||
maskUnits="userSpaceOnUse">
|
||||
<image
|
||||
id="image4942"
|
||||
xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAdIAAADbCAAAAAD8c0+WAAAAAXNCSVQI5gpbmQAABJtJREFUeJzt3U9om2UcwPGkia1Zy9YqbqMOrA5HRUZxeFE8yFAY8zAvevGgZ0GGePUgzKuXOS86xJPgn5NjgjBYRaH+ISdZD26zW8VtnX+2lrazSZN48CCzSZb3fZ8+Sb79fo7vm/yeh355m7xvYcvlJEmSJEmSJG0Z+YhrPXz87oir9Ynzb14PPDFe0r1HX9wVbbE+Mv/e+zeDDoyVtPjWq2ORluo73xxeDjmuEHJYG28cK0Vaqf88MHY65LhISXec9Bpt7fG/fgg4bSDgrDZefzDOOv0p/87TAafFSbrv5SjL9K27ngs4LE7SVyaiLNO/RgPOipO0EmWVPhbyhj3SZ6niMWlPGAn4fMCkPeHJkXCzTNoTSgE7mLQn1APOMimOSXFMimNSHJPimBTHpDgmxTEpjklxTIpjUhyT4pgUx6Q4JsUxKY5JcUyKY1Ick+KYFMekOCbFMSmOSXFMimNSHJPimBTHpDgmxTEpjklxTIpjUhyT4pgUx6Q43UjaCPmv/Oj/unKVNrqx6JbRlaQx/yeTrcekOMUurGnRTeU3XhyT4pgUx6Q4JsUxKY5JcUyKY1Ick+KYFMekOCbFMSmOSXFMimNSHJPimBTHpDgmxTEpjklxTIpjUhyT4pgUx6Q4JsUxKY5JcUyKY1Ick+KYFMekOCbFMSmOSXFMimNSHJPimBTHpDgmxTEpjklxTIpjUhyT4pgUx6Q4JsUxKY5JcUyKY1Ick+KYFMekOCbFMSmOSXFMimNSHJPimBTHpDgmxTEpjklxTIpjUhyT4pgUx6Q4JsUxKY5JcUyKY1Ick+KYFMekOCbFMSmOSXFMimNSHJPimBTHpDgmxTEpjklxTIpjUhyT4pgUx6Q4JsUxKY5JcUyKY1Ick+KYFMekOCbFMSmOSXFMimNSHJPimBTHpDgmxTEpjklxTIpjUhyT4pgUx6Q4JsUxKY5JcUyKY1KcOEkrUVbpY42VcLOKnb6wNL57Z23k+ftSrTKR6l1byMjZ9XRv/G52/uertx/Kd/refLFYqI9/8Ui6lbVJXvuwXq3dfqjjq7RRreZyy8uht6RsllY3HEr2WdrxNa1ImhRJmLQQaCcKpEm/ZEnXLgTaicL4+/eNx5IlvfXVxUB7UQiV6V82Hkz2m7RxbW6lMu4nam+olj8+fmnjLX/SPIV9U0enSmG2pCxq66c+OrPW5ETS7zuNxUvXboxvD7EnZTJz6sRM06dyib/C1teuLq5Mbsu+JWWxXP7gs9l601NpPheH7j/07ORkti0pi4XpTy7+1GhxMs2NZu3GXPnK4J6OHzwpsPnP351eaHk23bOD1YXL51b/2D2Udk/K4Er55Kfn2pxPf0NSuvfwUwe3jaV+v5KrVa5/efn0b0u1di/Kco85ODj12EsPDQ9nGKEEKitnZs/+WK3e4WXZHhsMDN1z4NEXcrnCaGlnpkFqq7a0uJS/+fW331dutfpS9J/sT4LyjVwut//YkcyD1NL6ibf//PcH3YEAf1oZnXji0P4jPn3YRAPrOw5uLzR5RN9Mtqu0WBye2PXMngN7M01RJy7MzZTP/1qp3vFa/Qd4HqFCB+U7NwAAAABJRU5ErkJggg=="
|
||||
preserveAspectRatio="none"
|
||||
style="image-rendering:optimizeSpeed"
|
||||
height="1"
|
||||
width="1" />
|
||||
</mask>
|
||||
<style
|
||||
id="style5609">.cls-1{fill:#508ecb;}.cls-2{fill:#32af4a;}.cls-3{fill:#231f20;}</style>
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="5.509377"
|
||||
inkscape:cx="72.784999"
|
||||
inkscape:cy="26.354619"
|
||||
inkscape:document-units="mm"
|
||||
inkscape:current-layer="layer1"
|
||||
showgrid="false"
|
||||
fit-margin-top="0"
|
||||
fit-margin-left="0"
|
||||
fit-margin-right="0"
|
||||
fit-margin-bottom="0"
|
||||
units="px"
|
||||
inkscape:window-width="1280"
|
||||
inkscape:window-height="744"
|
||||
inkscape:window-x="-4"
|
||||
inkscape:window-y="-4"
|
||||
inkscape:window-maximized="1" />
|
||||
<metadata
|
||||
id="metadata3257">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:label="Layer 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1"
|
||||
transform="translate(-89.599445,-326.04814)">
|
||||
<g
|
||||
id="g5682"
|
||||
transform="matrix(0.26458333,0,0,0.26458333,89.258134,325.73801)">
|
||||
<path
|
||||
d="m 27.08,27.23 h -2.6 L 19.1,10.51 H 19 L 13.63,27.23 H 11.08 L 1.79,2.39 h 5 l 5.52,16.14 H 12.4 L 17.53,2.39 h 3 l 5.16,16.14 h 0.09 L 31.3,2.39 h 5 z"
|
||||
class="cls-1"
|
||||
data-name="<Compound Path>"
|
||||
id="_Compound_Path_"
|
||||
inkscape:connector-curvature="0"
|
||||
style="fill:#508ecb" />
|
||||
<path
|
||||
d="m 41.26,16.83 a 8.43,8.43 0 0 0 8.16,6.77 7.94,7.94 0 0 0 7.09,-4.17 h 4.66 a 12.66,12.66 0 0 1 -11.92,8.43 c -7,0 -12.65,-6.06 -12.65,-13.1 A 12.700946,12.700946 0 1 1 62,14.45 c 0,0.81 -0.09,2.06 -0.13,2.38 z m 16.06,-3.59 a 8.07,8.07 0 0 0 -16.06,0 z"
|
||||
class="cls-1"
|
||||
data-name="<Compound Path>"
|
||||
id="_Compound_Path_2"
|
||||
inkscape:connector-curvature="0"
|
||||
style="fill:#508ecb" />
|
||||
<path
|
||||
d="m 65.52,2.39 h 4.26 V 6.2 h 0.09 a 10.49,10.49 0 0 1 8.84,-4.48 c 8.43,0 12.86,6.77 12.86,13.4 A 12.52,12.52 0 0 1 79,27.86 c -5.2,0 -7.8,-2.65 -8.74,-4.22 H 70.17 V 35.53 H 65.52 Z M 78.39,6 C 73.5,6 70.1,10.21 70.1,14.78 a 8.41,8.41 0 1 0 16.81,0.09 C 86.91,10.42 83.46,6 78.39,6 Z"
|
||||
class="cls-2"
|
||||
data-name="<Compound Path>"
|
||||
id="_Compound_Path_3"
|
||||
inkscape:connector-curvature="0"
|
||||
style="fill:#32af4a" />
|
||||
<path
|
||||
d="m 115.56,27.23 v -3.86 h -0.09 A 9.5,9.5 0 0 1 107,27.86 12.75,12.75 0 0 1 93.82,14.86 C 93.82,8.81 98.08,1.68 107,1.68 a 9.82,9.82 0 0 1 8.43,4.17 h 0.09 V 2.39 h 4.67 V 27.23 Z M 107,6 c -5.74,0 -8.52,5 -8.52,8.87 a 8.57,8.57 0 1 0 17.13,0 A 8.48,8.48 0 0 0 107,6 Z"
|
||||
class="cls-2"
|
||||
data-name="<Compound Path>"
|
||||
id="_Compound_Path_4"
|
||||
inkscape:connector-curvature="0"
|
||||
style="fill:#32af4a" />
|
||||
<path
|
||||
d="m 133.68,35.53 h -4.84 l 3.63,-8.79 -9.91,-24.35 h 5 l 7.31,19.28 7.49,-19.28 h 5 z"
|
||||
class="cls-2"
|
||||
data-name="<Compound Path>"
|
||||
id="_Compound_Path_5"
|
||||
inkscape:connector-curvature="0"
|
||||
style="fill:#32af4a" />
|
||||
<path
|
||||
id="path5620"
|
||||
d="m 78,41.32 a 0.46,0.46 0 0 0 -0.45,0.46 V 45 h 8.49 l -3.87,-3.68 z"
|
||||
class="cls-3"
|
||||
inkscape:connector-curvature="0"
|
||||
style="fill:#231f20" />
|
||||
<path
|
||||
id="path5622"
|
||||
d="M 86.4,46 A 0.47,0.47 0 0 0 85.94,45.54 H 82.72 V 54 l 3.68,-3.87 z"
|
||||
class="cls-3"
|
||||
inkscape:connector-curvature="0"
|
||||
style="fill:#231f20" />
|
||||
<path
|
||||
id="path5624"
|
||||
d="m 81.75,54.32 a 0.46,0.46 0 0 0 0.45,-0.46 v -3.22 h -8.5 l 3.87,3.68 z"
|
||||
class="cls-3"
|
||||
inkscape:connector-curvature="0"
|
||||
style="fill:#231f20" />
|
||||
<path
|
||||
id="path5626"
|
||||
d="m 73.39,49.67 a 0.47,0.47 0 0 0 0.46,0.46 h 3.22 v -8.5 l -3.68,3.87 z"
|
||||
class="cls-3"
|
||||
inkscape:connector-curvature="0"
|
||||
style="fill:#231f20" />
|
||||
<path
|
||||
id="path5628"
|
||||
d="M 34.44,42.87 V 46.8 H 29 v -3.93 h -2 v 9.9 h 2 v -4.25 h 5.47 v 4.25 h 2 v -9.9 z"
|
||||
class="cls-3"
|
||||
inkscape:connector-curvature="0"
|
||||
style="fill:#231f20" />
|
||||
<path
|
||||
id="path5630"
|
||||
d="m 60.93,42.87 v 9.89 h 8.74 L 68.56,51 h -5.63 v -2.5 h 5.46 v -1.66 h -5.46 v -2.27 h 5.62 l 1.09,-1.7 z"
|
||||
class="cls-3"
|
||||
inkscape:connector-curvature="0"
|
||||
style="fill:#231f20" />
|
||||
<path
|
||||
id="path5632"
|
||||
d="M 19.57,42.87 A 2.84,2.84 0 0 0 16.46,46 v 3.7 a 2.85,2.85 0 0 0 3.1,3.11 h 6.25 L 24.65,51 H 20 c -1,0 -1.43,-0.36 -1.43,-1.48 v -3.39 c 0,-1.09 0.36,-1.51 1.46,-1.51 h 4.67 l 1.11,-1.75 z"
|
||||
class="cls-3"
|
||||
inkscape:connector-curvature="0"
|
||||
style="fill:#231f20" />
|
||||
<path
|
||||
id="path5634"
|
||||
d="m 52.19,42.87 a 2.33,2.33 0 0 0 -2.42,2.57 v 0.47 a 2.34,2.34 0 0 0 2.36,2.67 h 4.14 c 0.43,0 0.78,0.07 0.78,0.8 v 0.84 c 0,0.65 -0.33,0.8 -0.79,0.8 h -5.45 l -1.12,1.74 h 6.7 a 2.41,2.41 0 0 0 2.71,-2.65 v -0.69 a 2.37,2.37 0 0 0 -2.6,-2.64 h -4 c -0.43,0 -0.74,-0.12 -0.74,-0.77 v -0.68 c 0,-0.56 0.21,-0.76 0.72,-0.76 h 5.19 l 1.09,-1.71 z"
|
||||
class="cls-3"
|
||||
inkscape:connector-curvature="0"
|
||||
style="fill:#231f20" />
|
||||
<path
|
||||
id="path5636"
|
||||
d="m 42.22,42.87 -4.69,9.9 h 2.21 l 0.92,-2.05 h 5.1 l 0.91,2.05 h 2.22 l -4.7,-9.9 z m 1,2.06 L 45,49 h -3.6 z"
|
||||
class="cls-3"
|
||||
inkscape:connector-curvature="0"
|
||||
style="fill:#231f20" />
|
||||
<path
|
||||
id="path5638"
|
||||
d="M 10.17,51.48 10,50.57 H 9.93 A 2.88,2.88 0 0 1 8.98,51.39 3,3 0 0 1 7.79,51.6 2.14,2.14 0 0 1 6.29,51.11 1.81,1.81 0 0 1 5.75,49.71 c 0,-1.29 1,-2 3.11,-2 h 1.08 v -0.4 A 1.6,1.6 0 0 0 9.62,46.2 1.34,1.34 0 0 0 8.62,45.84 4.18,4.18 0 0 0 6.81,46.33 L 6.51,45.59 A 4.48,4.48 0 0 1 8.64,45 a 2.5,2.5 0 0 1 1.7,0.5 2.14,2.14 0 0 1 0.55,1.64 v 4.37 z M 8,50.8 a 2,2 0 0 0 1.42,-0.5 1.83,1.83 0 0 0 0.52,-1.39 v -0.58 h -1 a 3.6,3.6 0 0 0 -1.67,0.36 1.08,1.08 0 0 0 -0.51,1 1,1 0 0 0 0.32,0.8 A 1.28,1.28 0 0 0 8,50.8 Z"
|
||||
class="cls-3"
|
||||
inkscape:connector-curvature="0"
|
||||
style="fill:#231f20" />
|
||||
<path
|
||||
id="path5640"
|
||||
d="m 94,51.6 a 2.75,2.75 0 0 1 -2.16,-0.86 3.51,3.51 0 0 1 -0.76,-2.42 3.67,3.67 0 0 1 0.77,-2.49 2.83,2.83 0 0 1 2.2,-0.83 4.9,4.9 0 0 1 0.93,0.1 3,3 0 0 1 0.72,0.24 l -0.3,0.82 a 4.13,4.13 0 0 0 -0.7,-0.21 2.88,2.88 0 0 0 -0.67,-0.09 c -1.3,0 -2,0.83 -2,2.5 a 3,3 0 0 0 0.47,1.81 1.67,1.67 0 0 0 1.42,0.63 4.3,4.3 0 0 0 1.64,-0.34 v 0.86 A 3.54,3.54 0 0 1 94,51.6 Z"
|
||||
class="cls-3"
|
||||
inkscape:connector-curvature="0"
|
||||
style="fill:#231f20" />
|
||||
<path
|
||||
id="path5642"
|
||||
d="M 102.57,48.27 A 3.52,3.52 0 0 1 101.78,50.72 2.77,2.77 0 0 1 99.6,51.6 3,3 0 0 1 98.07,51.2 2.71,2.71 0 0 1 97,50 4.08,4.08 0 0 1 96.64,48.23 3.54,3.54 0 0 1 97.42,45.79 2.75,2.75 0 0 1 99.64,45 a 2.72,2.72 0 0 1 2.14,0.9 3.56,3.56 0 0 1 0.79,2.37 z m -4.89,0 a 3,3 0 0 0 0.5,1.87 1.68,1.68 0 0 0 1.44,0.65 1.74,1.74 0 0 0 1.45,-0.64 3.05,3.05 0 0 0 0.49,-1.88 3,3 0 0 0 -0.49,-1.86 1.75,1.75 0 0 0 -1.46,-0.63 1.72,1.72 0 0 0 -1.44,0.62 3,3 0 0 0 -0.49,1.87 z"
|
||||
class="cls-3"
|
||||
inkscape:connector-curvature="0"
|
||||
style="fill:#231f20" />
|
||||
<path
|
||||
id="path5644"
|
||||
d="m 112.35,51.48 v -4.17 a 1.73,1.73 0 0 0 -0.33,-1.15 1.29,1.29 0 0 0 -1,-0.38 1.64,1.64 0 0 0 -1.34,0.52 2.47,2.47 0 0 0 -0.43,1.6 v 3.58 h -1 v -4.17 a 1.73,1.73 0 0 0 -0.33,-1.15 1.29,1.29 0 0 0 -1,-0.38 1.57,1.57 0 0 0 -1.34,0.55 3,3 0 0 0 -0.42,1.79 v 3.36 h -1 V 45.07 H 105 l 0.15,0.88 v 0 a 1.84,1.84 0 0 1 0.78,-0.73 2.29,2.29 0 0 1 1.12,-0.27 A 1.91,1.91 0 0 1 109,46 v 0 a 2,2 0 0 1 0.83,-0.79 2.5,2.5 0 0 1 1.24,-0.3 2.19,2.19 0 0 1 1.63,0.56 2.5,2.5 0 0 1 0.54,1.79 v 4.18 z"
|
||||
class="cls-3"
|
||||
inkscape:connector-curvature="0"
|
||||
style="fill:#231f20" />
|
||||
<path
|
||||
id="path5646"
|
||||
d="m 118.21,51.6 a 2.88,2.88 0 0 1 -1.15,-0.23 2.28,2.28 0 0 1 -0.87,-0.71 h -0.07 a 8,8 0 0 1 0.07,1.06 v 2.64 h -1 V 45.07 H 116 l 0.14,0.88 v 0 a 2.18,2.18 0 0 1 0.88,-0.76 2.58,2.58 0 0 1 1.14,-0.24 2.36,2.36 0 0 1 2,0.88 4.62,4.62 0 0 1 0,4.89 2.35,2.35 0 0 1 -1.95,0.88 z m -0.14,-5.82 a 1.75,1.75 0 0 0 -1.43,0.54 2.82,2.82 0 0 0 -0.45,1.73 v 0.22 a 3.18,3.18 0 0 0 0.45,1.93 1.73,1.73 0 0 0 1.45,0.59 1.5,1.5 0 0 0 1.3,-0.68 3.2,3.2 0 0 0 0.47,-1.85 3.1,3.1 0 0 0 -0.47,-1.84 1.53,1.53 0 0 0 -1.32,-0.64 z"
|
||||
class="cls-3"
|
||||
inkscape:connector-curvature="0"
|
||||
style="fill:#231f20" />
|
||||
<path
|
||||
id="path5648"
|
||||
d="m 126.41,51.48 -0.19,-0.91 v 0 a 2.88,2.88 0 0 1 -1,0.82 3,3 0 0 1 -1.19,0.21 2.14,2.14 0 0 1 -1.5,-0.49 1.81,1.81 0 0 1 -0.54,-1.4 c 0,-1.29 1,-2 3.11,-2 h 1.08 v -0.4 a 1.6,1.6 0 0 0 -0.32,-1.11 1.34,1.34 0 0 0 -1,-0.36 4.18,4.18 0 0 0 -1.81,0.49 l -0.3,-0.74 a 4.48,4.48 0 0 1 2.17,-0.55 2.5,2.5 0 0 1 1.7,0.5 2.14,2.14 0 0 1 0.55,1.64 v 4.37 z m -2.19,-0.68 a 2,2 0 0 0 1.42,-0.5 1.83,1.83 0 0 0 0.52,-1.39 v -0.58 h -1 a 3.6,3.6 0 0 0 -1.67,0.36 1.08,1.08 0 0 0 -0.51,1 1,1 0 0 0 0.32,0.8 1.28,1.28 0 0 0 0.92,0.31 z"
|
||||
class="cls-3"
|
||||
inkscape:connector-curvature="0"
|
||||
style="fill:#231f20" />
|
||||
<path
|
||||
id="path5650"
|
||||
d="m 133.42,51.48 v -4.15 a 1.72,1.72 0 0 0 -0.35,-1.17 1.49,1.49 0 0 0 -1.12,-0.38 1.84,1.84 0 0 0 -1.47,0.54 2.7,2.7 0 0 0 -0.47,1.8 v 3.36 h -1 v -6.41 h 0.79 L 130,46 v 0 a 2,2 0 0 1 0.84,-0.74 2.78,2.78 0 0 1 1.2,-0.26 2.44,2.44 0 0 1 1.74,0.56 2.38,2.38 0 0 1 0.59,1.79 v 4.18 z"
|
||||
class="cls-3"
|
||||
inkscape:connector-curvature="0"
|
||||
style="fill:#231f20" />
|
||||
<path
|
||||
id="path5652"
|
||||
d="m 135.28,45.07 h 1 l 1.4,3.66 a 12.69,12.69 0 0 1 0.57,1.8 h 0.05 c 0,-0.19 0.16,-0.53 0.32,-1 0.16,-0.47 0.69,-2 1.59,-4.44 h 1 l -2.76,7.3 a 3.74,3.74 0 0 1 -0.95,1.54 2,2 0 0 1 -1.34,0.45 3.71,3.71 0 0 1 -0.88,-0.1 V 53.5 a 3.14,3.14 0 0 0 0.72,0.07 1.47,1.47 0 0 0 1.42,-1.12 l 0.36,-0.91 z"
|
||||
class="cls-3"
|
||||
inkscape:connector-curvature="0"
|
||||
style="fill:#231f20" />
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 17 KiB |
@ -0,0 +1,19 @@
|
||||
@extends('portal.ninja2020.layout.clean')
|
||||
@section('meta_title', ctrans('texts.sign_up_with_wepay'))
|
||||
|
||||
@section('body')
|
||||
<div class="bg-gray-50">
|
||||
|
||||
<div class="flex flex-col justify-center items-center mt-10">
|
||||
<img src="{{ asset('images/wepay.svg') }}" alt="We Pay">
|
||||
</div>
|
||||
|
||||
@livewire('wepay-signup', ['user_id' => $user_id, 'company_key' => $company_key])
|
||||
|
||||
</div>
|
||||
@endsection
|
||||
|
||||
@push('footer')
|
||||
<script>
|
||||
</script>
|
||||
@endpush
|
@ -0,0 +1,104 @@
|
||||
<div class="flex flex-col justify-center items-center mt-10">
|
||||
|
||||
<form wire:submit.prevent="submit">
|
||||
@csrf
|
||||
@method('POST')
|
||||
<div class="shadow overflow-hidden rounded">
|
||||
<div class="px-4 py-5 bg-white sm:p-6">
|
||||
<div class="grid grid-cols-6 gap-6">
|
||||
<div class="col-span-6 sm:col-span-3">
|
||||
<label for="first_name" class="input-label">@lang('texts.first_name')</label>
|
||||
<input id="first_name" class="input w-full" name="first_name" wire:model.defer="first_name" />
|
||||
@error('first_name')
|
||||
<div class="validation validation-fail">
|
||||
{{ $message }}
|
||||
</div>
|
||||
@enderror
|
||||
</div>
|
||||
|
||||
<div class="col-span-6 sm:col-span-3">
|
||||
<label for="last_name" class="input-label">@lang('texts.last_name')</label>
|
||||
<input id="last_name" class="input w-full" name="last_name" wire:model.defer="last_name" />
|
||||
@error('last_name')
|
||||
<div class="validation validation-fail">
|
||||
{{ $message }}
|
||||
</div>
|
||||
@enderror
|
||||
</div>
|
||||
|
||||
<div class="col-span-6 sm:col-span-4">
|
||||
<label for="email_address" class="input-label">@lang('texts.email_address')</label>
|
||||
<input id="email_address" class="input w-full" type="email" name="email" wire:model.defer="email" disabled="true" />
|
||||
@error('email')
|
||||
<div class="validation validation-fail">
|
||||
{{ $message }}
|
||||
</div>
|
||||
@enderror
|
||||
</div>
|
||||
|
||||
<div class="col-span-6 sm:col-span-4">
|
||||
<label for="company_name" class="input-label">@lang('texts.company_name')</label>
|
||||
<input id="company_name" class="input w-full" name="company_name" wire:model.defer="company_name" />
|
||||
@error('company_name')
|
||||
<div class="validation validation-fail">
|
||||
{{ $message }}
|
||||
</div>
|
||||
@enderror
|
||||
</div>
|
||||
|
||||
<div class="col-span-6 sm:col-span-4">
|
||||
<label for="country" class="input-label">@lang('texts.country')</label>
|
||||
|
||||
<div class="radio">
|
||||
<input class="form-radio mr-2" type="radio" value="US" name="country" checked wire:model="country">
|
||||
<span>{{ ctrans('texts.country_United States') }}</span>
|
||||
</div>
|
||||
|
||||
<div class="radio">
|
||||
<input class="form-radio mr-2" type="radio" value="CA" name="country" wire:model="country">
|
||||
<span>{{ ctrans('texts.country_Canada') }}</span>
|
||||
</div>
|
||||
|
||||
<div class="radio">
|
||||
<input class="form-radio mr-2" type="radio" value="GB" name="country" wire:model="country">
|
||||
<span>{{ ctrans('texts.country_United Kingdom') }}</span>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<div class="col-span-6 sm:col-span-4">
|
||||
<label for="country" class="input-label">@lang('texts.ach')</label>
|
||||
<div class="checkbox">
|
||||
<input class="switch-input" type="checkbox" name="ach" value="1" wire:model="ach">
|
||||
<span>{{ ctrans('texts.enable_ach')}}</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="col-span-6 sm:col-span-4">
|
||||
<label for="country" class="input-label"></label>
|
||||
<div class="checkbox">
|
||||
<input type="checkbox" name="wepay_payment_tos_agree" value="1" wire:model="wepay_payment_tos_agree">
|
||||
<span>{!! ctrans('texts.wepay_payment_tos_agree', ['terms' => $terms, 'privacy_policy' => $privacy_policy]) !!}</span>
|
||||
</div>
|
||||
@error('wepay_payment_tos_agree')
|
||||
<div class="validation validation-fail">
|
||||
{{ $message }}
|
||||
</div>
|
||||
@enderror
|
||||
</div>
|
||||
|
||||
<div class="col-span-6 sm:col-span-4">
|
||||
|
||||
<span><i>{{ ctrans('texts.standard_fees_apply')}}</i></span>
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
<div class="px-4 py-3 bg-gray-50 text-right sm:px-6">
|
||||
<button class="button button-primary bg-primary">{{ $saved }}</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
|
||||
</div>
|
@ -199,6 +199,7 @@ Route::get('webcron', 'WebCronController@index');
|
||||
Route::group(['middleware' => ['locale']], function () {
|
||||
Route::get('stripe_connect/{token}', 'StripeConnectController@initialize')->name('stripe_connect.initialization');
|
||||
Route::get('stripe_connect/completed', 'StripeConnectController@completed')->name('stripe_connect.return');
|
||||
|
||||
});
|
||||
|
||||
Route::fallback('BaseController@notFound');
|
||||
|
@ -79,6 +79,7 @@ Route::group(['middleware' => ['auth:contact', 'locale', 'check_client_existence
|
||||
Route::post('upload', 'ClientPortal\UploadController')->name('upload.store');
|
||||
|
||||
Route::get('logout', 'Auth\ContactLoginController@logout')->name('logout');
|
||||
|
||||
});
|
||||
|
||||
Route::get('client/subscription/{subscription}/purchase/', 'ClientPortal\SubscriptionPurchaseController@index')->name('client.subscription.purchase');
|
||||
|
@ -20,6 +20,9 @@ Route::post('password/email', 'Auth\ForgotPasswordController@sendResetLinkEmail'
|
||||
Route::get('password/reset/{token}', 'Auth\ResetPasswordController@showResetForm')->name('password.reset');
|
||||
Route::post('password/reset', 'Auth\ResetPasswordController@reset')->name('password.update');
|
||||
|
||||
Route::get('wepay/signup/{token}', 'WePayController@signup')->name('wepay.signup');
|
||||
Route::get('wepay/processSignup', 'WePayController@processSignup')->name('wepay.process_signup');
|
||||
|
||||
/*
|
||||
* Social authentication
|
||||
*/
|
||||
|
Loading…
x
Reference in New Issue
Block a user