buildOneTimeDonationSession( $amount, $email, ); mkbh_donate_page_member_subscribe_checkout_flow_api_response([ 'status' => 'ok', 'session_id' => $session->id, ]); } catch (\Exception $e) { mkbh_donate_page_member_subscribe_checkout_flow_api_response([ 'status' => 'error', 'errors' => [ $e->getMessage(), ], ]); http_response_code(500); drupal_exit(); } } else { mkbh_donate_page_member_subscribe_checkout_flow_api_response([ 'status' => 'error', 'errors' => [ '405 Method Not Allowed', ], ]); } } function mkbh_donate_page_stripe_api_checkout_session_subscription_create() { global $user; if (drupal_strtoupper($_SERVER['REQUEST_METHOD']) === 'POST') { try { $plan = data_get($_POST, 'plan', null); $quantity = max((int)data_get($_POST, 'quantity', 1), 1); $email = data_get($user, 'mail'); $sessionBuilder = new SessionBuilder(); $session = $sessionBuilder->buildSubscriptionSession( $plan, $quantity, $email, ); mkbh_donate_page_member_subscribe_checkout_flow_api_response([ 'status' => 'ok', 'session_id' => $session->id, ]); } catch (\Exception $e) { mkbh_donate_page_member_subscribe_checkout_flow_api_response([ 'status' => 'error', 'errors' => [ $e->getMessage(), ], ]); http_response_code(500); drupal_exit(); } } else { mkbh_donate_page_member_subscribe_checkout_flow_api_response([ 'status' => 'error', 'errors' => [ '405 Method Not Allowed', ], ]); } } function mkbh_donate_page_stripe_api_checkout_session_setup_create() { global $user; if (drupal_strtoupper($_SERVER['REQUEST_METHOD']) === 'POST') { try { $email = data_get($user, 'mail'); $sessionBuilder = new SessionBuilder(); $session = $sessionBuilder->buildPaymentSetupSession( $email, ); mkbh_donate_page_member_subscribe_checkout_flow_api_response([ 'status' => 'ok', 'session_id' => $session->id, ]); } catch (\Exception $e) { mkbh_donate_page_member_subscribe_checkout_flow_api_response([ 'status' => 'error', 'errors' => [ $e->getMessage(), ], ]); http_response_code(500); drupal_exit(); } } else { mkbh_donate_page_member_subscribe_checkout_flow_api_response([ 'status' => 'error', 'errors' => [ '405 Method Not Allowed', ], ]); } } function mkbh_donate_page_stripe_pages_thank_you() { $stripeSessionKey = data_get($_GET, 'sid'); if ($stripeSessionKey === null) { drupal_goto(); } try { $stripeThankYouPage = new ThankYouPage( $stripeSessionKey, ); return $stripeThankYouPage->render(); } catch (\Exception $e) { drupal_set_message($e->getMessage(), 'error'); watchdog('mkbh_donate_page', 'Error while processing stripe redirect: !message', ['!message' => $e->getMessage()], WATCHDOG_CRITICAL); return null; } } function mkbh_donate_page_stripe_pages_cancel() { return [ '#theme' => 'mkbh_donate_page_stripe_pages_cancel', ]; } function mkbh_donate_page_member_subscribe_checkout_flow() { global $user; $account = entity_metadata_wrapper('user', $user); $modulePath = drupal_get_path('module', 'mkbh_donate_page'); $lastVisitedNode = mkbh_paywall_get_last_checked_node(); /** @noinspection PhpUndefinedFieldInspection */ return [ '#theme' => 'mkbh_donate_page_member_subscribe_checkout_flow', '#attached' => [ 'js' => [ [ 'data' => 'https://js.stripe.com/v3', 'type' => 'file', ], [ 'data' => $modulePath . '/assets/javascript/vue--mkbh-donate-page--member-subscribe-checkout-flow.js', 'type' => 'file', ], [ 'data' => [ 'mkbh_donate_page_member_subscribe_checkout_flow' => [ 'user' => user_is_anonymous() ? null : [ 'uid' => (int)$user->uid, 'email' => $user->mail, 'fields' => [ 'first_name' => $account->field_first_name->value(), 'last_name' => $account->field_last_name->value(), 'manual_membership_plans' => array_values( $account->field_manual_membership_plans->value(), ), ], ], 'userIsSubscribed' => property_exists($user, 'mail') ? _mkbh_blocks_user_has_stripe_subscription($user->mail) : false, 'fromMobilePay' => data_get($_GET, 'fromMobilePay') !== null, 'preselectedPlan' => isset($_GET['plan']) && in_array($_GET['plan'], ['basis', 'plus']) ? $_GET['plan'] : null, 'plans' => [ 'basis' => [ 'monthly' => MKBH_DONATE_PERSONAL_BASIS_PLAN_ID, 'annual' => MKBH_DONATE_PERSONAL_BASIS_YEAR_PLAN_ID, ], 'plus' => [ 'monthly' => MKBH_DONATE_PERSONAL_PLUS_PLAN_ID, 'annual' => MKBH_DONATE_PERSONAL_PLUS_YEAR_PLAN_ID, ], ], 'stripeConfig' => [ 'key' => MKBH_STRIPE_IS_LIVE ? MKBH_STRIPE_LIVE_PK_KEY : MKBH_STRIPE_TEST_PK_KEY, ], 'destination' => $lastVisitedNode ? url("node/{$lastVisitedNode->nid}") : '', 'preText' => data_get(variable_get('member_checkout_flow_pre_text'), 'value'), ], ], 'type' => 'setting', ], ], ], ]; } function mkbh_donate_page_mobile_pay_merchant_redirect_callback() { $modulePath = drupal_get_path('module', 'mkbh_donate_page'); /** @noinspection PhpUndefinedFieldInspection */ return [ '#theme' => 'mkbh_donate_page_mobile_pay_merchant_redirect_callback', '#attached' => [ 'js' => [ [ 'data' => $modulePath . '/assets/javascript/vue--mkbh-donate-page--mobile-pay-merchant-redirect-callback.js', 'type' => 'file', ], ], ], ]; } function mkbh_donate_page_member_subscribe_checkout_flow_api_do_login() { global $user; if ($user && property_exists($user, 'uid') && $user->uid > 0) { mkbh_donate_page_member_subscribe_checkout_flow_api_response([ 'status' => 'ok', ]); } ['email' => $email, 'password' => $password] = array_only($_POST, ['email', 'password']); $validatedUserKey = user_authenticate($email, $password); if (!$validatedUserKey) { $userLookup = user_load_by_mail($email); if ($userLookup && property_exists($userLookup, 'name')) { $validatedUserKey = user_authenticate($userLookup->name, $password); } } if ($validatedUserKey) { $validatedUser = user_load($validatedUserKey); if (!$validatedUser) { mkbh_donate_page_member_subscribe_checkout_flow_api_response([ 'status' => 'error', 'errors' => [ 'Den givne bruger kunne ikke findes!', ], ]); } $form_state = [ 'uid' => $validatedUserKey, ]; user_login_submit([], $form_state); $login_array = ['name' => $validatedUser->name]; user_login_finalize($login_array); $user = $validatedUser; mkbh_donate_page_member_subscribe_checkout_flow_api_response([ 'status' => 'ok', ]); } else { mkbh_donate_page_member_subscribe_checkout_flow_api_response([ 'status' => 'error', 'errors' => [ 'E-mail-adresse genkendes ikke, eller adgangskode stemmer ikke overens', ], ]); } } function mkbh_donate_page_member_subscribe_checkout_flow_api_do_register() { global $user; if ($user && property_exists($user, 'uid') && $user->uid > 0) { mkbh_donate_page_member_subscribe_checkout_flow_api_response([ 'status' => 'error', 'errors' => [ 'Du er allerede logget ind.', ], ]); } ['email' => $email, 'password' => $password] = array_only($_POST, ['email', 'password']); if (!filter_var($email, FILTER_VALIDATE_EMAIL)) { mkbh_donate_page_member_subscribe_checkout_flow_api_response([ 'status' => 'error', 'errors' => [ 'E-mail-adresse er ikke gyldig.', ], ]); } if (user_load_by_mail($email) || user_load_by_name($email)) { mkbh_donate_page_member_subscribe_checkout_flow_api_response([ 'status' => 'error', 'errors' => [ 'Denne e-mail-adresse er allerede taget.', ], ]); } try { $account = user_save(null, [ 'name' => email_registration_unique_username(explode("@", $email)[0]), 'mail' => $email, 'init' => $email, 'pass' => $password, 'status' => true, 'roles' => [ DRUPAL_AUTHENTICATED_RID => 'authenticated user', ], 'field_first_name' => [ LANGUAGE_NONE => [ ['value' => $_POST['firstName']], ], ], 'field_last_name' => [ LANGUAGE_NONE => [ ['value' => $_POST['lastName']], ], ], ]); _user_mail_notify('register_no_approval_required', $account); $account = user_load($account->uid); $form_state = [ 'uid' => $account->uid, ]; user_login_submit([], $form_state); $login_array = ['name' => $account->name]; user_login_finalize($login_array); $user = $account; mkbh_donate_page_member_subscribe_checkout_flow_api_response([ 'status' => 'ok', ]); } catch (\Exception $e) { mkbh_donate_page_member_subscribe_checkout_flow_api_response([ 'status' => 'error', 'errors' => [ 'Ups! Noget gik galt.', $e->getMessage(), $e->getTraceAsString(), ], ]); } } function mkbh_donate_page_api_mobile_pay_agreements_create() { global $user; if (!$user || (property_exists($user, 'uid') && $user->uid === 0)) { mkbh_donate_page_member_subscribe_checkout_flow_api_response([ 'status' => 'error', 'errors' => [ 'Brugeren er ikke logget ind.', ], ]); } /** @var MobilePayPlans $mobilePayPlans */ $mobilePayPlans = container()->make(MobilePayPlans::class); /** @var MobilePayClient $mobilePayClient */ $mobilePayClient = container()->make(MobilePayClient::class); $plan = data_get($_POST, 'plan'); if (!$plan || !isset($mobilePayPlans[$plan])) { mkbh_donate_page_member_subscribe_checkout_flow_api_response([ 'status' => 'error', 'errors' => [ 'Den valgte medlemskabsplan er ikke tilgængelig.', ], ]); } $destination = url(data_get($_POST, 'destination', '/medlem/kassen'), ['absolute' => false]); $agreement = $mobilePayClient->createDraft($user, $plan, $destination); if (!$agreement) { mkbh_donate_page_member_subscribe_checkout_flow_api_response([ 'status' => 'error', 'errors' => [ 'Aftalen kunne ikke oprettes.', ], ]); } mkbh_donate_page_member_subscribe_checkout_flow_api_response([ 'status' => 'ok', 'agreement' => $agreement, ]); } function mkbh_donate_page_api_mobile_pay_agreements_activate() { $start_time = microtime(true); global $user; if (!$user || (property_exists($user, 'uid') && $user->uid === 0)) { mkbh_donate_page_member_subscribe_checkout_flow_api_response([ 'status' => 'error', 'error' => 'user_not_logged_in', ]); } /** @var MobilePayRepository $mobilePayRepository */ $mobilePayRepository = container()->make(MobilePayRepository::class); /** @var MobilePayClient $mobilePayClient */ $mobilePayClient = container()->make(MobilePayClient::class); /** @var MobilePayLogger $mobilePayLogger */ $mobilePayLogger = container()->make(MobilePayLogger::class); $account = user_load($user->uid); $agreement = $mobilePayRepository->findForAccount($account); if ($agreement === null) { mkbh_donate_page_member_subscribe_checkout_flow_api_response([ 'status' => 'error', 'error' => 'agreement_not_found', ]); } $remoteAgreement = $mobilePayClient->fetch( $agreement->agreement_id, ); if ($remoteAgreement === null) { watchdog('mobile_pay_agreements_activate:debug', 'error:remote_agreement_not_found | Time: ' . (microtime(true) - $start_time), [], WATCHDOG_DEBUG); mkbh_donate_page_member_subscribe_checkout_flow_api_response([ 'status' => 'error', 'error' => 'agreement_not_found', ]); } if ($agreement->status !== MobilePayAgreementStatusEnum::ACTIVE && $remoteAgreement->status === MobilePayAgreementStatusEnum::ACTIVE) { $mobilePayLogger->log( MobilePayLogger::SEVERITY_INFO, 'api:mobile_pay_agreements_activate', 'Agreement has been activated via callback', [ 'server' => $_SERVER, 'payload' => file_get_contents('php://input'), ], ); try { $mobilePayClient->captureCharge($agreement->agreement_id, $agreement->initial_payment_id); } catch (\Throwable $error) { // we try to capture the charge, but if it fails, we don't want to stop the process // since the agreements in new system are created with DIRECT_CAPTURE charge type and captured automatically. // no-op } if ($plan = $mobilePayRepository->getPlanForAgreement($agreement->agreement_id)) { rules_invoke_event('mkbh_mobile_pay_plan_subscribed', $account->mail, $plan['name']); $insert = [ 'user_id' => data_get($account, 'uid'), 'user_email' => drupal_strtolower( trim(data_get($account, 'mail')) ), 'subscription_type' => with($plan, function ($plan) { switch ($plan['id']) { case MKBH_DONATE_PERSONAL_BASIS_PLAN_ID: case MKBH_DONATE_PERSONAL_BASIS_YEAR_PLAN_ID: case MKBH_DONATE_PERSONAL_PLUS_PLAN_ID: case MKBH_DONATE_PERSONAL_PLUS_YEAR_PLAN_ID: return 'personal'; case MKBH_DONATE_BUSINESS_PER_MONTH_PLAN_ID: case MKBH_DONATE_BUSINESS_PER_YEAR_PLAN_ID: return 'business'; } return 'N/A'; }), 'subscription_source' => 'mobile_pay', 'subscription_id' => $agreement->agreement_id, 'subscription_plan_name' => with($plan, function ($plan) { switch ($plan['id']) { case MKBH_DONATE_PERSONAL_BASIS_PLAN_ID: case MKBH_DONATE_PERSONAL_BASIS_YEAR_PLAN_ID: return 'Medlem Basis'; case MKBH_DONATE_PERSONAL_PLUS_PLAN_ID: case MKBH_DONATE_PERSONAL_PLUS_YEAR_PLAN_ID: return 'Medlem Plus'; case MKBH_DONATE_BUSINESS_PER_MONTH_PLAN_ID: return 'Abonnement / Måned'; case MKBH_DONATE_BUSINESS_PER_YEAR_PLAN_ID: return 'Abonnement / År'; } return 'N/A'; }), 'subscription_plan_frequency' => with($remoteAgreement, function ($remoteAgreement) { $count = $remoteAgreement->interval->unit; switch ($remoteAgreement->interval->unit) { case MobilePayIntervalEnum::DAY: return "$count day(s)"; case MobilePayIntervalEnum::WEEK: return "$count week(s)"; case MobilePayIntervalEnum::YEAR: return "year"; case MobilePayIntervalEnum::MONTH: return "month"; } return null; }), ]; database()->table('mkbh_subscribers_aggregation')->insert($insert); } } $mobilePayRepository->updateStatus( $agreement->agreement_id, $remoteAgreement->status, ); mkbh_donate_page_member_subscribe_checkout_flow_api_response([ 'status' => 'ok', 'agreement' => $remoteAgreement, ]); } function mkbh_donate_page_member_subscribe_checkout_flow_api_response($response) { drupal_json_output($response); drupal_exit(); }