Skip to content
Code-Schnipsel Gruppen Projekte
Commit 8f312fac erstellt von Patrick Müller's avatar Patrick Müller
Dateien durchsuchen

feat: Apply pay registration #5

Übergeordneter d0609069
Keine zugehörigen Branchen gefunden
Keine zugehörigen Tags gefunden
Keine zugehörigen Merge Requests gefunden
<?php
use QUI\System\VhostManager;
/**
* Get registration status data for Apple Pay domains
*
* @return array
*/
QUI::$Ajax->registerFunction(
'package_quiqqer_payment-stripe_ajax_backend_settings_getApplePayData',
function () {
$VhostManager = new VhostManager();
$vhosts = $VhostManager->getList();
$Conf = QUI::getPackage('quiqqer/payment-stripe')->getConfig();
$registered = $Conf->get('payment', 'apple_pay_domains');
if (empty($registered)) {
$registered = [];
} else {
$registered = \json_decode($registered, true);
}
foreach ($vhosts as $vhost => $data) {
if (!isset($registered[$vhost])) {
$registered[$vhost] = 0;
}
}
return $registered;
},
[],
['Permission::checkAdminUser']
);
<?php
use QUI\System\VhostManager;
use QUI\ERP\Payments\Stripe\Provider;
use Stripe\ApplePayDomain;
use Stripe\Stripe as StripeApiClient;
/**
* Register a domain with Apple Pay
*
* @return bool - success
*/
QUI::$Ajax->registerFunction(
'package_quiqqer_payment-stripe_ajax_backend_settings_registerApplePayDomain',
function ($domain) {
$VhostManager = new VhostManager();
$vhosts = $VhostManager->getList();
if (!isset($vhosts[$domain])) {
return false;
}
if (\mb_strpos($domain, 'https://') !== 0) {
$domain = 'https://'.$domain;
}
$clientSecret = Provider::getClientSecret(false);
if (empty($clientSecret)) {
QUI::getMessagesHandler()->addError(
QUI::getLocale()->get(
'quiqqer/payment-stripe',
'message.ajax.backend.settings.registerApplePayDomain.error.secret_key_required'
)
);
return false;
}
try {
// Setup API with LIVE secret
StripeApiClient::setApiKey($clientSecret);
// Make Stripe API request to register Apple Pay domain
ApplePayDomain::create([
'domain_name' => $domain
]);
// Save in conf
$Conf = QUI::getPackage('quiqqer/payment-stripe')->getConfig();
$registered = $Conf->get('payment', 'apple_pay_domains');
if (empty($registered)) {
$registered = [];
} else {
$registered = \json_decode($registered, true);
}
$registered[$domain] = 1;
$Conf->set('payment', 'apple_pay_domains', \json_encode($registered));
$Conf->save();
} catch (\Exception $Exception) {
QUI\System\Log::writeException($Exception);
QUI::getMessagesHandler()->addError(
QUI::getLocale()->get(
'quiqqer/payment-stripe',
'message.ajax.backend.settings.registerApplePayDomain.error',
[
'domain' => $domain,
'error' => $Exception->getMessage()
]
)
);
return false;
}
QUI::getMessagesHandler()->addSuccess(
QUI::getLocale()->get(
'quiqqer/payment-stripe',
'message.ajax.backend.settings.registerApplePayDomain.success',
[
'domain' => $domain
]
)
);
return true;
},
['domain'],
['Permission::checkAdminUser']
);
.quiqqer-payment-stripe-applepay-entry {
background-color: #ececec;
color: #4a964d;
float: left;
line-height: 33px;
list-style-type: none;
padding: 10px;
width: 100%;
}
.quiqqer-payment-stripe-applepay-entry:not(:first-of-type) {
margin-top: 5px;
}
.quiqqer-payment-stripe-applepay-entry-btn {
float: right;
}
.quiqqer-payment-stripe-applepay-entry-not-registered {
color: red;
line-height: 33px;
}
.quiqqer-payment-stripe-applepay-entry-registered {
color: #4a964d;
line-height: 33px;
}
\ No newline at end of file
/**
* Register domain for Apple Pay
*
* @module package/quiqqer/payment-stripe/bin/controls/backend/settings/ApplePayRegister
* @author www.pcsg.de (Patrick Müller)
*/
define('package/quiqqer/payment-stripe/bin/controls/backend/settings/ApplePayRegister', [
'qui/controls/Control',
'qui/controls/loader/Loader',
'qui/controls/buttons/Button',
'Locale',
'Ajax',
'css!package/quiqqer/payment-stripe/bin/controls/backend/settings/ApplePayRegister.css'
], function (QUIControl, QUILoader, QUIButton, QUILocale, QUIAjax) {
"use strict";
var lg = 'quiqqer/payment-stripe';
return new Class({
Extends: QUIControl,
Type : 'package/quiqqer/payment-stripe/bin/controls/backend/settings/ApplePayRegister',
Binds: [
'$refresh',
'$onImport',
'$onRegisterBtnClick',
'$getApplePayData',
'$registerApplePayDomain'
],
initialize: function (options) {
this.parent(options);
this.$Content = null;
this.Loader = new QUILoader();
this.addEvents({
onCreate: this.$onCreate,
onResize: this.$onResize,
onImport: this.$onImport
});
},
/**
* Control event: onImport
*/
$onImport: function () {
var Input = this.getElm();
Input.type = 'hidden';
this.$Content = new Element('div', {
'class': 'quiqqer-payment-stripe-applepay field-container-field'
}).inject(this.getElm(), 'after');
this.Loader.inject(this.$Content);
this.$refresh();
},
/**
* Refresh register status display
*/
$refresh: function () {
var self = this;
this.Loader.show();
var registerIcon = 'fa fa-check',
registerText = QUILocale.get(lg, 'controls.backend.settings.ApplePayRegister.btn.register');
this.$getApplePayData().then(function (Domains) {
for (var domain in Domains) {
if (!Domains.hasOwnProperty(domain)) {
continue;
}
var ListElm = new Element('li', {
'class': 'quiqqer-payment-stripe-applepay-entry',
html : '<span>' + domain + '</span>' +
'<div class="quiqqer-payment-stripe-applepay-entry-btn"></div>'
}).inject(self.$Content);
var isRegistered = !!parseInt(Domains[domain]);
if (isRegistered) {
ListElm.addClass('quiqqer-payment-stripe-applepay-entry-registered');
} else {
ListElm.addClass('quiqqer-payment-stripe-applepay-entry-not-registered');
}
new QUIButton({
disabled : isRegistered,
text : isRegistered ? cancelText : registerText,
textimage : isRegistered ? cancelIcon : registerIcon,
isRegistered: isRegistered,
domain : domain,
events : {
onClick: self.$onRegisterBtnClick
}
}).inject(ListElm.getElement('.quiqqer-payment-stripe-applepay-entry-btn'));
}
self.Loader.hide();
});
},
/**
* (Un)register Apple Pay domain
*
* @param {Object} Btn
*/
$onRegisterBtnClick: function (Btn) {
var self = this;
this.Loader.show();
if (Btn.getAttribute('isRegistered')) {
console.log("unregister");
return;
}
this.$registerApplePayDomain(Btn.getAttribute('domain')).then(function (success) {
self.Loader.hide();
if (success) {
self.$refresh();
}
});
},
/**
* Register a domain with Apple Pay
*
* @param {String} domain
* @return {Promise}
*/
$registerApplePayDomain: function (domain) {
return new Promise(function (resolve, reject) {
QUIAjax.post('package_quiqqer_payment-stripe_ajax_backend_settings_registerApplePayDomain', resolve, {
'package': lg,
domain : domain,
onError : reject
});
});
},
/**
* Fetch Apple Day registration data for current system
*
* @return {Promise}
*/
$getApplePayData: function () {
return new Promise(function (resolve, reject) {
QUIAjax.get('package_quiqqer_payment-stripe_ajax_backend_settings_getApplePayData', resolve, {
'package': lg,
onError : reject
});
});
}
});
});
<?xml version="1.0" encoding="UTF-8"?>
<events>
<event on="onRequest" fire="\QUI\ERP\Payments\Stripe\Provider::onApplePayRegisterRequest"/>
</events>
\ No newline at end of file
......@@ -123,6 +123,18 @@
<de><![CDATA[Stripe Abrechnungsvereinbarungen (Subscriptions)]]></de>
<en><![CDATA[Stripe Subscriptions]]></en>
</locale>
<locale name="settings.payment.title">
<de><![CDATA[Zahlungsmittel]]></de>
<en><![CDATA[Payment methods]]></en>
</locale>
<locale name="settings.payment.apple_pay_domains.title">
<de><![CDATA[Apple Pay]]></de>
<en><![CDATA[Apple Pay]]></en>
</locale>
<locale name="settings.payment.apple_pay_domains.description">
<de><![CDATA[Für die Nutzung von Apple Pay ist es notwendig, dass Ihre Domains bei Apple über Stripe registriert werden. Bitte klicken Sie daher auf den Registrierungs-Button für die jeweilige Domain, für die Apple Pay verfügbar sein soll.]]></de>
<en><![CDATA[For the use of Apple Pay it is necessary that your domains are registered with Apple via Stripe. Please click on the registration button for the domain you want Apple Pay to be available for.]]></en>
</locale>
<!-- Cron -->
<locale name="cron.processUnpaidInvoices.title">
......@@ -189,6 +201,18 @@
<de><![CDATA[Leider konnte der Zahlungsvorgang nicht erfolgreich durchgeführt werden. Bitte wiederholen Sie den Vorgang oder wählen Sie eine andere Zahlungsmethode.]]></de>
<en><![CDATA[Unfortunately, the payment process could not be completed successfully. Please repeat the process or choose another payment method.]]></en>
</locale>
<locale name="message.ajax.backend.settings.registerApplePayDomain.error" html="true">
<de><![CDATA[Die Domain [domain] konnte leider nicht Apple Pay registriert werden.<br/><br/>[error]]]></de>
<en><![CDATA[The domain [domain] could not be registered with Apple Pay.<br/><br/>[error]]]></en>
</locale>
<locale name="message.ajax.backend.settings.registerApplePayDomain.success" html="true">
<de><![CDATA[Die Domain [domain] wurde erfolgreich für Apple Pay registriert.]]></de>
<en><![CDATA[The domain [domain] was successfully registered with Apple Pay.]]></en>
</locale>
<locale name="message.ajax.backend.settings.registerApplePayDomain.error.secret_key_required">
<de><![CDATA[Für die Einrichtung einer Apple Pay Domain wird der LIVE Geheimschlüssel Ihres Stripe-Kontos benötigt. Bitte legen Sie diesen in die Einstellungen ein.]]></de>
<en><![CDATA[To set up an Apple Pay Domain, the LIVE secret key of your Stripe account is required. Please insert it in the settings.]]></en>
</locale>
<!-- Exceptions -->
<locale name="exception.BasePayment.error_refund_status">
......@@ -445,6 +469,16 @@
<en><![CDATA[Cancel Subscription now]]></en>
</locale>
<!-- Control: settings/ApplePayRegister -->
<locale name="controls.backend.settings.ApplePayRegister.btn.register">
<de><![CDATA[Domain registrieren]]></de>
<en><![CDATA[Register domain]]></en>
</locale>
<locale name="controls.backend.settings.ApplePayRegister.btn.cancel">
<de><![CDATA[Registrierung aufheben]]></de>
<en><![CDATA[Terminate registration]]></en>
</locale>
</groups>
</locales>
......@@ -23,6 +23,12 @@
</conf>
</section>
<section name="payment">
<conf name="apple_pay_domains">
<type><![CDATA[string]]></type>
</conf>
</section>
</config>
<window>
......@@ -91,6 +97,22 @@
</input>
</settings>
<settings title="payment" name="payment">
<title>
<locale group="quiqqer/payment-stripe" var="settings.payment.title"/>
</title>
<input conf="payment.apple_pay_domains" type="text" data-qui="package/quiqqer/payment-stripe/bin/controls/backend/settings/ApplePayRegister">
<text>
<locale group="quiqqer/payment-stripe" var="settings.payment.apple_pay_domains.title"/>
</text>
<description>
<locale group="quiqqer/payment-stripe" var="settings.payment.apple_pay_domains.description"/>
</description>
</input>
</settings>
</category>
<category name="stripe_billing_plans">
......
<?php
/**
* This file contains QUI\ERP\Payments\Stripe\Provider
*/
namespace QUI\ERP\Payments\Stripe;
use QUI;
......@@ -84,11 +80,12 @@ public static function getPublicKey()
/**
* Get Stripe client secret
*
* @param bool $considerSandbox (optional) - Considers sandbox settings when retrieving key [default: true]
* @return bool
*/
public static function getClientSecret()
public static function getClientSecret($considerSandbox = true)
{
if (self::isSandbox()) {
if ($considerSandbox && self::isSandbox()) {
return self::getApiSetting('sandbox_client_secret');
}
......@@ -179,4 +176,46 @@ public static function getStripeBillingSubscriptionsTransactionsTable()
{
return QUI::getDBTableName(self::TBL_STRIPE_BILLING_SUBSCRIPTIONS_TRANSACTIONS);
}
/**
* quiqqer/quiqqer: onRequest
*
* Handle registration request for Apple Pay
*
* @param QUI\Rewrite $Rewrite
* @param String $url
*/
public static function onApplePayRegisterRequest(QUI\Rewrite $Rewrite, $url)
{
if ($url !== '.well-known/apple-developer-merchantid-domain-association') {
return;
}
try {
$Conf = QUI::getPackage('quiqqer/payment-stripe')->getConfig();
$registered = $Conf->get('payment', 'apple_pay_domains');
} catch (\Exception $Exception) {
QUI\System\Log::writeException($Exception);
return;
}
if (empty($registered)) {
exit;
}
$headers = getallheaders();
if (empty($headers['Host'])) {
exit;
}
foreach ($registered as $domain => $isRegistered) {
if ($isRegistered && $headers['Host'] === $domain) {
echo \file_get_contents(\dirname(__FILE__).'/apple-developer-merchantid-domain-association');
exit;
}
}
exit;
}
}
7B227073704964223A2239373943394538343346343131343044463144313834343232393232313734313034353044314339464446394437384337313531303944334643463542433731222C2276657273696F6E223A312C22637265617465644F6E223A313536363233343735303036312C227369676E6174757265223A22333038303036303932613836343838366637306430313037303261303830333038303032303130313331306633303064303630393630383634383031363530333034303230313035303033303830303630393261383634383836663730643031303730313030303061303830333038323033653333303832303338386130303330323031303230323038346333303431343935313964353433363330306130363038326138363438636533643034303330323330376133313265333032633036303335353034303330633235343137303730366336353230343137303730366336393633363137343639366636653230343936653734363536373732363137343639366636653230343334313230326432303437333333313236333032343036303335353034306230633164343137303730366336353230343336353732373436393636363936333631373436393666366532303431373537343638366637323639373437393331313333303131303630333535303430613063306134313730373036633635323034393665363332653331306233303039303630333535303430363133303235353533333031653137306433313339333033353331333833303331333333323335333735613137306433323334333033353331333633303331333333323335333735613330356633313235333032333036303335353034303330633163363536333633326437333664373032643632373236663662363537323264373336393637366535663535343333343264353035323466343433313134333031323036303335353034306230633062363934663533323035333739373337343635366437333331313333303131303630333535303430613063306134313730373036633635323034393665363332653331306233303039303630333535303430363133303235353533333035393330313330363037326138363438636533643032303130363038326138363438636533643033303130373033343230303034633231353737656465626436633762323231386636386464373039306131323138646337623062643666326332383364383436303935643934616634613534313162383334323065643831316633343037653833333331663163353463336637656233323230643662616435643465666634393238393839336537633066313361333832303231313330383230323064333030633036303335353164313330313031666630343032333030303330316630363033353531643233303431383330313638303134323366323439633434663933653465663237653663346636323836633366613262626664326534623330343530363038326230363031303530353037303130313034333933303337333033353036303832623036303130353035303733303031383632393638373437343730336132663266366636333733373032653631373037303663363532653633366636643266366636333733373033303334326436313730373036633635363136393633363133333330333233303832303131643036303335353164323030343832303131343330383230313130333038323031306330363039326138363438383666373633363430353031333038316665333038316333303630383262303630313035303530373032303233303831623630633831623335323635366336393631366536333635323036663665323037343638363937333230363336353732373436393636363936333631373436353230363237393230363136653739323037303631373237343739323036313733373337353664363537333230363136333633363537303734363136653633363532303666363632303734363836353230373436383635366532303631373037303663363936333631363236633635323037333734363136653634363137323634323037343635373236643733323036313665363432303633366636653634363937343639366636653733323036663636323037353733363532633230363336353732373436393636363936333631373436353230373036663663363936333739323036313665363432303633363537323734363936363639363336313734363936663665323037303732363136333734363936333635323037333734363137343635366436353665373437333265333033363036303832623036303130353035303730323031313632613638373437343730336132663266373737373737326536313730373036633635326536333666366432663633363537323734363936363639363336313734363536313735373436383666373236393734373932663330333430363033353531643166303432643330326233303239613032376130323538363233363837343734373033613266326636333732366332653631373037303663363532653633366636643266363137303730366336353631363936333631333332653633373236633330316430363033353531643065303431363034313439343537646236666435373438313836383938393736326637653537383530376537396235383234333030653036303335353164306630313031666630343034303330323037383033303066303630393261383634383836663736333634303631643034303230353030333030613036303832613836343863653364303430333032303334393030333034363032323130306265303935373166653731653165373335623535653561666163623463373266656234343566333031383532323263373235313030326236316562643666353530323231303064313862333530613564643664643665623137343630333562313165623263653837636661336536616636636264383338303839306463383263646461613633333038323032656533303832303237356130303330323031303230323038343936643266626633613938646139373330306130363038326138363438636533643034303330323330363733313162333031393036303335353034303330633132343137303730366336353230353236663666373432303433343132303264323034373333333132363330323430363033353530343062306331643431373037303663363532303433363537323734363936363639363336313734363936663665323034313735373436383666373236393734373933313133333031313036303335353034306130633061343137303730366336353230343936653633326533313062333030393036303335353034303631333032353535333330316531373064333133343330333533303336333233333334333633333330356131373064333233393330333533303336333233333334333633333330356133303761333132653330326330363033353530343033306332353431373037303663363532303431373037303663363936333631373436393666366532303439366537343635363737323631373436393666366532303433343132303264323034373333333132363330323430363033353530343062306331643431373037303663363532303433363537323734363936363639363336313734363936663665323034313735373436383666373236393734373933313133333031313036303335353034306130633061343137303730366336353230343936653633326533313062333030393036303335353034303631333032353535333330353933303133303630373261383634386365336430323031303630383261383634386365336430333031303730333432303030346630313731313834313964373634383564353161356532353831303737366538383061326566646537626165346465303864666334623933653133333536643536363562333561653232643039373736306432323465376262613038666437363137636538386362373662623636373062656338653832393834666635343435613338316637333038316634333034363036303832623036303130353035303730313031303433613330333833303336303630383262303630313035303530373330303138363261363837343734373033613266326636663633373337303265363137303730366336353265363336663664326636663633373337303330333432643631373037303663363537323666366637343633363136373333333031643036303335353164306530343136303431343233663234396334346639336534656632376536633466363238366333666132626266643265346233303066303630333535316431333031303166663034303533303033303130316666333031663036303335353164323330343138333031363830313462626230646561313538333338383961613438613939646562656264656261666461636232346162333033373036303335353164316630343330333032653330326361303261613032383836323636383734373437303361326632663633373236633265363137303730366336353265363336663664326636313730373036633635373236663666373436333631363733333265363337323663333030653036303335353164306630313031666630343034303330323031303633303130303630613261383634383836663736333634303630323065303430323035303033303061303630383261383634386365336430343033303230333637303033303634303233303361636637323833353131363939623138366662333563333536636136326266663431376564643930663735346461323865626566313963383135653432623738396638393866373962353939663938643534313064386639646539633266653032333033323264643534343231623061333035373736633564663333383362393036376664313737633263323136643936346663363732363938323132366635346638376137643162393963623962303938393231363130363939306630393932316430303030333138323031386233303832303138373032303130313330383138363330376133313265333032633036303335353034303330633235343137303730366336353230343137303730366336393633363137343639366636653230343936653734363536373732363137343639366636653230343334313230326432303437333333313236333032343036303335353034306230633164343137303730366336353230343336353732373436393636363936333631373436393666366532303431373537343638366637323639373437393331313333303131303630333535303430613063306134313730373036633635323034393665363332653331306233303039303630333535303430363133303235353533303230383463333034313439353139643534333633303064303630393630383634383031363530333034303230313035303061303831393533303138303630393261383634383836663730643031303930333331306230363039326138363438383666373064303130373031333031633036303932613836343838366637306430313039303533313066313730643331333933303338333133393331333733313332333333303561333032613036303932613836343838366637306430313039333433313164333031623330306430363039363038363438303136353033303430323031303530306131306130363038326138363438636533643034303330323330326630363039326138363438383666373064303130393034333132323034323062303731303365313430613462386231376262613230316130336163643036396234653431366232613263383066383661383338313435633239373566633131333030613036303832613836343863653364303430333032303434363330343430323230343639306264636637626461663833636466343934396534633035313039656463663334373665303564373261313264376335666538633033303033343464663032323032363764353863393365626233353031333836363062353730373938613064643731313734316262353864626436613138363633353038353431656565393035303030303030303030303030227D
\ No newline at end of file
0% Lade oder .
You are about to add 0 people to the discussion. Proceed with caution.
Bearbeitung dieser Nachricht zuerst beenden!
Bitte registrieren oder zum Kommentieren