Mini-Shop: Umsetzung über Objekt-Wizard - Beschreibung

Der Mini-Shop ist in aktueller Version mit dem Objekt-Wizard umgesetzt. Dies ermöglicht eine individuelle Anpassung auf die jeweiligen Bedürfnisse des Shop-Betreibers.

Die Ausgabe und Pflege der Shop-Produkte ist somit in vielen weiteren Bereichen direkt über Masken möglich und auch die Darstellung des Warenkorbs kann komfortabel über den Editor angepasst werden.
Diverse Bereiche werden nachfolgend genauer beschrieben.

Die Seitenansicht und die Pflegemaske der Produktdaten wurden auf den Objekt-Wizard umgestellt. Dadurch kann der Entwickler die Produkte durch individuelle Darstellungsformen oder Lösungen ergänzen.

Seit April 2022 ist nun auch die Pflege der Listenansicht über den Objekt-Wizard möglich.
Um auf die Funktionen zugreifen zu können, muss die Objektmaske /[IHR-LAYOUT-PROJEKT]/wGlobal/layout/templates/objects/objectMasks/shopProduct.php aktualisiert werden. Des Weiteren muss die Liste unter /[IHR-INHALTS-PROJEKT]/shop/index.php auf die Darstellungsvariante 20100 "Darstellung über Objekt-Wizard" eingestellt werden.

 Für die Verwaltung der Shop-Daten wird eine zentrale Klasse wMyShop.php eingesetzt.
Diese liegt unter /[IHR-LAYOUT-PROJEKT]/wGlobal/scripts/php/wMyShop.php.

Die Klasse wird genutzt um zum Beispiel Produktdaten, Warenkorbdaten oder auch Kundendaten zu verwalten und auszulesen. In der Shop-Umsetzung wird sie in der Regel in den Strukturelementen "Objektdaten manipulieren" eingesetzt.

Die wichtigsten Funktionen sind:

  • wMyShop::prepareShopData()
    Auslesen der Shop-Konfiguration und Shop-Texte, manipuliert diese und gibt diese als Array zurück
  • wMyShop::prepareProductData()
    Vorbereitung der Produktdaten, ergänzt die Daten durch weitere Informationen
  • wMyShop::setProductData()
    Setzen der Produktdaten
  • wMyShop::getCustomerData()
    Rückgabe der aktuellen Kundendaten
  • wMyShop::prepareCartData()
    Vorbereitung der Warenkorbdaten, ergänzt die Informationen durch Gesamtsumme, Steuern etc.
  • wMyShop::prepareOrderString()
    Vorbereitung des Mail-Textes für die Bestellung, der den Platzhalter orderString in der Konfiguration ersetzt

Falls Sie für Ihre individuelle Lösung Anpassungen vornehmen möchten, können Sie das entweder in den Shop-Seiten direkt vornehmen, oder in der wMyShop.php. Beachten Sie in diesem Fall, daß ein Weblic® Update zu den individuell angepassten Dateien ggf. ein erneutes Nachziehen Ihrer Anpassungen erfordert.

Die Darstellung der Shopseiten, warenkorb.php, kundendaten.php und bestellung.php werden nun nicht mehr über das Template cart.wFilelist.php dargestellt, sondern über die Strukturelemente "Objekdaten Manipulieren" und "Objekdaten ausgeben". Dadurch haben Sie die Möglichkeit die Darstellung sowie auch die Funktionalität des Shops über den Objekt-Wizard zu verändern.

In der Seite warenkorb.php ist der gesamte Warenkob über das Strukturelment "Objekdaten ausgeben" als HTML-Struktur abgebildet. Darin werden die Platzhalter verwendet, die auf der aktuellen Seite über die Objekdaten zur Verfügung stehen.

Die Seite warenkorb.php ist vom Typ "default" und enthält daher keine Informationen über den Shop, somit auch keine Informationen über die Artikel, welche der Kunde in den Warenkorb gelegt hat. Wie diese Informationen trotzdem zur Verfügung stehen, wird nachfolgend erläutert.

Dazu wird das Strukturelement "Objekdaten manipulieren" eingesetzt. Hier werden über die neue globale Klasse wMyShop.php die Daten aus dem Warenkorb ausgelesen, weiterverarbeitet und temporär, also nur auf der aktuellen Seite, in die Objektdaten eingepflegt. Die Objekdaten werden also erweitert bzw. überlagert, stehen aber nicht im Quelltext.

Welche Objekdaten Ihnen in der Seite zur Verfügung stehen, können Sie sich, als Administrator angemeldet, über den Requestparameter debugObjectdata=1 anzeigen lassen.

Auszug warenkorb.php - "Objekdaten manipulieren"
Auszug warenkorb.php - "Objekdaten manipulieren"
Auszug warenkorb.php - "Ausgabe des Warenkorbs"
Auszug warenkorb.php - "Ausgabe des Warenkorbs"

Die Kundendaten in der kundendaten.php werden bei Neuladen der Seite aus der Session übernommen. Dadurch kann der Kunde seine angegebenen Daten während des Bestellvorgangs nochmals überarbeiten.

Wird die Bestellung abgeschickt, werden die Kundendaten (die sich nicht auf die Paypal-Bezahlung beziehen) sowie der gesamte Warenkorb gelöscht.

Die Zahlungsoptionen wurden in die Konfiguration ausgelagert. Dort kann das Selectfeld der Seite kundendaten.php ergänzt werden. Die Zahlungsoptionen sind beliebig erweiterbar. Systemseitig werden folgende Werte unterstützt:

  • cod
    per Nachnahme
  • invoice
    per Rechnung
  • onCollection
    per Abholung
  • paypal
    per Paypal
  • prepayment
    per Vorkasse

Neben dem Selectfeld, werden die Zahlungsmöglichkeiten in der E-Mail der Konfiguration gesetzt.

Der Filter dazu wurde stark vereinfacht:

[!--extIfPayment_paypal--]Der Kunde hat die Bezahlung per Paypal gewählt[!--extIfPayment_paypal--]
[!--extIfPayment_prepayment--]Der Kunde hat die Bezahlung per Vorkasse gewählt[!--extIfPayment_prepayment--]
[!--extIfPayment_cod--]Der Kunde hat die Bezahlung per Nachnahme gewählt[!--extIfPayment_cod--]
[!--extIfPayment_invoice--]Der Kunde wünscht die Lieferung auf Rechnung[!--extIfPayment_invoice--]
[!--extIfPayment_onCollection--]Zahlung bei Abholung.[!--extIfPayment_onCollection--]

Die Daten innerhalb des Platzhaltes [!--extIfPayment_[Zahlungsmöglichkeit]--] werden entfernt, sollte die Zahlungsmöglichkeit mit der ausgewählten nicht übereinstimmen.

Möchten Sie einen weiteren Wert hinzufügen, können Sie gerne über das Supportformular mit dem Support Kontakt aufnehmen.

Bitte beachten Sie, dass die bestellung.php auf dem neusten Stand ist.

Sie können anstelle der bestehenden Bezahlmöglichkeiten auch das Zahlsystem Stripe  einbinden. Stripe bietet als Anbieter zahlreiche Möglichkeiten an. Im Folgenden wurde Stripe-Checkout verwendet. 

Die Anpassung ist in der Bestellseite (bestellung.php) einzufügen. Über Javascript Bibliotheken und PHP-Apis wird eine Stripe-Session erstellt über die der Käufer die Bezahlung abwickeln kann. Anschließend leitet die Session auf die Shop-Domain weiter. Je nach Rückgabestatus wird die die Bestellung abgeschickt. 

Anpassen der Shop-Konfiguration

Damit der Käufer bei der Eingabe seiner Kundendaten (kundendaten.php) "stripe" oder ggf. Zahlen via Kreditkarte als Zahlart auswählen kann, ergänzen Sie bitte die abgebildete Konfiguration des Mini-Shops.

Konfiguration ergänzen

Einbinden von Stripe 

Für den Verbindungsaufbau zu Stripe benötigen Sie:

Bitte beachten Sie, dass Sie beim Herunterladen der Api für Stripe-Checkout für das Backend PHP auswählen.

Wir empfehlen, die Script-Dateien wie auch die Stripe-Api im Layout-Verzeichnis unter /[IHR-LAYOUT-PROJEKT]/wGlobal/scripts/php/stripe zu speichern.  

Anpassen bestellung.php

Zunächst einmal muss nach Klick auf den "Zahlungspflichtig bestellen" - Button das Formular abgeschickt werden, so dass die Eingaben des Kunden validiert werden und in den Kundendaten gespeichert werden können. Anschließend wird dann die Stripe-Session erstellt. 

Formular-Event

Dazu müssen Sie das Formular (Nach dem Absenden auszuführendes Skript) ergänzen.

formular
Quelltextbeispiel
formular
Auszug aus Formular
Quelltextbeispiel

Auszug Formularevent

if($customerData['payment'] == 'stripe'){
wResponse::redirect('/[Ihr-Projekt]/shop/bestellung.php#startStripeCheckout');
wMyShop::setCustomerData['message'] = $mailData;
exit;
}

Javascript zum Erstellen der Session

Wir empfehlen das "Javascript-Quelltextelement "über den "Bedingten Container für Objektdaten" einzubinden.

Bitte beachten Sie, dass Sie das Quelltextelement entsprechend "Konfiguration JS" einstellen.

Das Quelltextbeispiel, können Sie aus dem Javascript-Quelltext kopieren. Bitte beachten Sie dabei, dass die Platzhalter [PUBLIC-KEY] und [SCRIPT-PATH], etc ersetzt werden.

bestellung.php
Konfiguration JS
Quelltextbeispiel
bestellung.php
Anpassung
Konfiguration JS
Konfiguration JS
Quelltextbeispiel

Erstellen der Stripe-Session

/*
* Damit Sie auf das Stripe-Objekt zugreifen können,
* müssen Sie die https://js.stripe.com/v3/ einbinden (s. Screen)
* Diese Syntax wird nur ausgeführt wenn #startStripeCheckout in der URL enthalten ist
*/

var publicKey = '[PUBLIC-KEY]'; /*public-Key, entnehmen Sie aus den Einstellungen Ihres Stripe-Kontos*/
var scriptPath = '[SCRIPT-PATH]'; /*Pfad zu dem PHP-Script, das die Stripe-Session erstellt*/

if(typeof wEditor == 'undefined' && /#startStripeCheckout/.test(location.hash)){

/* Der EventListener stellt sicher, dass die Syntax erst ausgeführt wird,
wenn das Stripe-Objekt geladen ist
*/
document.addEventListener('DOMContentLoaded', function waitUntilContentLoaded(){
if(!
window.Stripe){
return
setTimeout(waitUntilContentLoaded, 100);
}
var
stripe = Stripe(publicKey);

/* Erstellen der Session über button-Element await fetch */
buttonStripe = document.createElement("button");
buttonStripe.addEventListener('click', async function(e){
e.preventDefault();
e.stopPropagation();
const
session = await fetch(scriptPath, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
}),
}).
then(r => r.json());
stripe.redirectToCheckout({sessionId : session.id });
});
buttonStripe.click();

},
false);
}

Der Javascript-Code wird erst ausgeführt, wenn das Formular abgeschickt wurde. Die Anpassungen in dem Formularscript bewirken ein Redirect auf: bestellung.php#startStripeCheckout. 

Erst jetzt wird die Session gestartet. Dabei verlässt der Browser die Domain. Nach der Session wird der Seitenbesucher entsprechend der Angaben in der create_session.php, zurückgeleitet. 

PHP Script zum Erstellen der Session (create_session.php)

Via PHP und dem privaten Stripe-Key wird die Session erstellt.
Als result_url definieren Sie die Seite, auf die der Seitenbesucher nach der Session weitergeleitet werden soll.

In diesem Beispiel ist es die bestellung.php, kombiniert mit passendem Request-Parameter.

Bitte prüfen Sie die Syntax des Quelltextbeispiels auf Anpassungen seitens Stripe. Wir empfehlen immer die aktuelle Syntax zu verwenden. 

create_session.php (Stand 09.2022)

include_once($_SERVER['DOCUMENT_ROOT'].'/weblication/grid.php');
include_once(
$_SERVER['DOCUMENT_ROOT'].'/[IHR-LAYOUT-PROJEKT]/wGlobal/scripts/php/stripe/[STRIPE-API]/init.php');
include_once(
$_SERVER['DOCUMENT_ROOT'].'/[IHR-LAYOUT-PROJEKT]/wGlobal/scripts/php/wMyShop.php');
$shopConfData = wMyShop::prepareShopData('/[IHR-PROJECT]/shop/variables/default.wVariables.php');
$customerData = wMyShop::prepareCustomerData();
//$cartData = wMyShop::prepareCartData();

// Einstellungen
$privateKey = $shopConfData['stripe_private_key'];

$stripe = new \Stripe\StripeClient(
$privateKey
);

$stripe_session = $stripe->checkout->sessions->create([
'success_url' => 'https://www.domain.dd/[IHR-PROJEkT]/shop/bestellung.php?status=succeeded&stripe_sid={CHECKOUT_SESSION_ID}',
'cancel_url' => 'https://www.domain.dd/[IHR-PROJEkT]/shop/bestellung.php?status=cancelled#paymentError',
'line_items' => [
[
'price_data' => [
'currency' => $shopConfData['currency'],
'unit_amount' => $customerData['totalToPay'] * 100,
'product_data' => ['name' => "Ihre Bestellung"],
],
'quantity' => 1,
],
],
'customer_email' => $customerData['email'],
'mode' => 'payment',
'payment_method_types' => ['card']
]);

echo
json_encode($stripe_session);

Bitte beachten Sie, dass in keinem Fall der private-key veröffentlicht werden darf. 

PHP Script nach Beenden der Session (session_checkout.php)

Schließt der Kunde die Bezahlung ab, wird die Shop-Oberfläche wieder aktiv. Die URLs die beim Erstellen der Session definiert wurden, werden aufgerufen (success_url, cancel_url).
In Ziel-Seite das session_checkout-Script eingebunden werden. 

Als Beispiel können Sie komfortabel über die bestellung.php die HTTP-Requestparameter auslesen und das Formular weiterverarbeiten. 


Quelltextbeispiel
bestellung.php
Quelltextbeispiel

session_checkout.php

include_once($_SERVER['DOCUMENT_ROOT'].'/weblication/grid.php');
include_once(
$_SERVER['DOCUMENT_ROOT'].'/[IHR-LAYOUT-PROJEKT]/wGlobal/scripts/php/stripe/[STRIPE-API]/init.php');
include_once(
$_SERVER['DOCUMENT_ROOT'].'/[IHR-LAYOUT-PROJEKT]/wGlobal/scripts/php/wMyShop.php');
$shopConfData = wMyShop::prepareShopData('/[IHR-PROJECT]/shop/variables/default.wVariables.php');

$privateKey = [PRIVATE-KEY]; /*private-key ist aus Ihren Konteneinstellungen ersichtlich */

if($_GET['stripe_sid']) {
\
Stripe\Stripe::setApiKey($privateKey);
$stripeSession = \Stripe\Checkout\Session::retrieve($_GET['stripe_sid']);

if(
$stripeSession->payment_status == "paid" && $_SESSION['customerData']) {

/*Falls das Script zurückkommt und die Bezahlung erfolgt ist, können Sie das Formular abschicken.*/
/*Initalisieren Sie davor die Kundendaten (message, gtc, gtd)*/

}
}

Bitte beachten Sie, dass in keinem Fall der private-key veröffentlicht werden darf. 

bestellung.php
Vorschlag Abfangen session_checkout

In diesem Beispiel wird der Übersichtlichkeit auf weitere Bedingte Container verzichtet. Eine Abfrage der Objektdaten ist jedoch ratsam.

Die Syntax zum Erstellen der Stripe-Anbindung muss in der Regel angepasst werden. Bitte achten Sie darauf, dass aktuelle Skripte (entsprechend Veröffentlichung durch Stripe) zum Einsatz kommen. Weblication übernimmt keine Gewähr für die Sicherheit und Stabilität der Anbindung. 

Sie können anstelle der bestehenden Bezahlmöglichkeiten auch das Zahlsystem PaypalCheckout einbinden. Paypal bietet als Anbieter zahlreiche Möglichkeiten an. Im Folgenden wurde PaypalCheckout verwendet. 

Die Anpassung ist in der Bestellseite (bestellung.php) einzufügen. Über Javascript Bibliotheken wird eine Paypal-Session erstellt über die der Käufer die Bezahlung abwickeln kann. Anschließend leitet die Session auf die Shop-Domain zurück. Je nach Rückgabestatus wird die Bestellung abgeschickt. 

Anpassen der Shop-Konfiguration

Damit der Käufer bei der Eingabe seiner Kundendaten (kundendaten.php) "paypalCheckout" oder ggf. PayPal auswählen kann, ergänzen Sie bitte die abgebildete Konfiguration des Mini-Shops.

Konfiguration ergänzen

Falls noch vorhanden empfehlen wir Ihnen die rot markierten Werte aus der Konfiguration zu löschen. Die ursprüngliche paypal-Bezahlmöglichkeit entspricht nicht den Abwicklungen über PayPal Checkout.

Einbinden von Paypal

Für den Verbindungsaufbau zu PayPal Checkout benötigen Sie:

Auf Ihrem eingeloggten Paypal-Account ist es auch möglich die aktuelle Syntax für die PayPal Checkout Buttons zu kopieren.
Es ist in jedem Fall ratsam diese immer direkt auf der Seite zu holen.

Anpassen der bestellung.php

Der PayPal Code kann über einen bedingten Container ganz komfortabel in die Seite eingefügt werden. Da die Validierung der Formulareingaben allerdings nicht verhindert werden darf, muss die JS-Syntax noch ergänzt bzw/angepasst werden. PayPal erstellt die Session in einem Popup-Fenster. Im folgenden Besipiel wird nach erfolgreicher Bezahlung das Formular abgeschickt, so dass auch die Bestelldaten beim Shop-Betreiber wie beim Besteller ankommen.

Alle Informationen die an PayPal geschickt werden können durch individuelle Anpassungen ergänzt werden. Auch die Weiterverarbeitung verschiedener Fälle ist durch individuelle Anpassungen möglich.

Javascript PayPal Checkout

Wir empfehlen das "Javascript-Quelltextelement" über den "Bedingten Container für Objektdaten" einzubinden.

Ein Quelltextbeispiel, können Sie aus dem Register "Quelltextbeispiel" entnehmen. 

Da externe Anwendungen, in der Regel bestimmten Bedingungen unterliegen, ist das Anpassen des Scriptes durchaus wahrscheinlich.

Sollten Sie Fragen zu der Schnittstelle haben, unterstützen wir Sie gerne im Rahmen einer Projektdienstleistung.

Durch den Einsatz von "Objektdaten als HTML ausgeben" können Sie in dem Javascript-Code Objektplatzhalter verwenden. Zum Erstellen einer purchase_unit müssen verschiedene Werte wie currency oder totalValue übergeben werden. Der Käufer bekommt diese dann in der PayPal Checkout Session angezeigt.

Die Konfiguration der Buttons entnehmen Sie dem Register "PayPal Session Lib"

bestellung.php
Quelltextbeispiel
PayPal Session Lib
bestellung.php
Anpassung
Quelltextbeispiel

Erstellen der PayPal Checkout Session

<!-- Die nachfolgende Syntax basiert auf der PaypalCheckout - Syntax,
* die
jeder Paypal-Händler aus der Oberfläche entnehmen kann.
*
Bitte beachten Sie, dass die Syntax in der Regel angepasst werden muss.
*
*
Über ein PaypalDeveloper-Konto, das jedem Paypal-Nutzer zur Verfügung steht,
*
können Sie ganz konfortabel die Zahlungsmöglichkeiten simulieren.
-->

<!--
HTML Paypal-Button -->
<
div id="smart-button-container" style="">
<
div style="text-align: center;">
<
div id="paypal-button-container"></div>
</
div>
</
div>

<!--
Einbinden des externen Paypal-Scriptes
* client-id: Händler-Id, können Sie aus den Einstellungen Ihres Paypal-Accounts entnehmen
* disable-funding: aktiviert bzw. deaktiviert weitere Buttons die angeboten werden
* buyer-country: Land des Käufers
* currency: Währung
-->

<
script src="https://www.paypal.com/sdk/js?client-id=[!--ihreClientID--]&components=buttons&disable-funding=paylater,giropay,card,sepa,sofort&currency=[!--currency--]" data-sdk-integration-source="button-factory"></script>
<
script>

if(
typeof wEditor == 'undefined'){

/* Der EventListener stellt sicher, dass die Syntax erst ausgeführt wird,
wenn das Stripe-Objekt geladen ist
*/
document.addEventListener('DOMContentLoaded', function waitUntilContentLoaded(){
if(!
window.jQuery){
return
setTimeout(waitUntilContentLoaded, 100);
}

/*Blendet den Zahlungspflichtig bestellen Button aus*/
jQuery('#order button').addClass('invisible');

/*Funktion legt den PayPal-Button an */
function initPayPalButton() {

paypal.Buttons({
style: {
shape: 'rect',
color: 'gold',
layout: 'vertical',
label: 'paypal',

},
/*
* @Created by Scholl Communciations AG
* Bevor Paypal aufgerufen wird, muss zunächst das Bestell-Formular validiert werden.
* Bitte beachten Sie, dass das für das Formular die ID auf "order" gesetzt ist.
*/
onClick: function(e){
var
createOrder=true;
var
currForm = jQuery('#order');
currForm.find('input, select, textarea').each(function(){
wglValidateElementInline(jQuery(this), {'clientside' : currForm.attr('action').indexOf('/weblication/grid5/tmpHTTP/wForm-') == -1, 'async' : false});
});
if(
currForm.attr('data-hasinputsinvalid') == '1') createOrder = false;
return
createOrder;
},

/* Beschreibung der Order-Informationen
* Die Bestellung wird als purchase_unit versendet.
* Sie können hier weitere Bestelldaten einfügen.
* Für eine Liste von Produkten können Sie die Platzhalter verwenden.
*/
createOrder: function(data, actions) {
return
actions.order.create({
purchase_units: [{
"amount":{
"currency_code":"[!--currency--]",
"value":[!--totalValue--],
}
}]
});
},

/* Nach erfolgreicher Bezahlung wird das Bestellformular abgeschickt. */
onApprove: function(data, actions) {
return
actions.order.capture().then(function(orderData) {
jQuery('.cart').closest('form').submit();
});
},

onError: function(err) {
}
}).
render('#paypal-button-container');
}
initPayPalButton();
},
false);
}
</
script>

Der Aufruf von paypal kann sich abhängig von den Händlerkonten unterscheiden. Wir empfehlen demnach den kontoabhängigen Quelltext des PaypalButtons aus der Paypal-Entwicklerumgebung zu beziehen, diese mit unserer Syntax zu vergleichen und ggf. zu ergänzen. Insbesondere geht es dabei um das Event onClick und onApprove.

PayPal Session Lib

In dem Quelltextbeispiel wird die Library eingebunden. Dabei werden für die Darstellung der Buttons verschiedne Requestparamter verwendet:

  • client-id  - Händler Id
    Diese Id wird in einem Händleraccount generiert und steht dort zur Verfügung.
    Ist die client-id sb oder test so wird man bei Click auf den Button an die paypal-sandbox weitergeleitet. Lesen Sie mehr dazu weiter unten unter "Testaccount für PayPal Checkout"
  • components
  • disable-funding -
    buttons die nicht zur verfügung gestellt werden (auslesbar über paypal-object)
  • currency - Währung des Shops

Auszug aus dem Register "Quelltextbeispiel"

https://www.paypal.com/sdk/js
?client-id=sb
&components=buttons
&disable-funding=paylater,giropay,card,sepa,sofort
&currency=[!--currency--]

Der Aufruf von paypal kann sich abhängig von den Händlerkonten unterscheiden. Wir empfehlen demnach den kontoabhängigen Quelltext des PaypalButtons aus der Paypal-Entwicklerumgebung zu beziehen, diese mit unserer Syntax zu vergleichen und ggf. zu ergänzen.

Erstellen eines Testaccounts

Über Ihren PayPal-Developer Account haben Sie die Möglichkeit einen "Test" Händler Account und einen "Test" Käufer Account anzulegen. In der Testphase empfiehlt es sich diese einzusetzen. Um nur die Käufer zu testen genügt es, die client-id auf sb oder test zu setzen. PayPal Checkout öffnet dann die Accountmaske auf paypal.sandbox.com. Hier können Sie sich dann nur mit Ihren Test-Accounts einloggen. NICHT mit Ihrem Original-Account.

Möchten Sie prüfen ob die Zahlungen auch bei dem Händler ankommen, geben Sie dem Requestparamter die client-Id des "Test"-Händlers an.
Loggen Sie sich zunächst auf Ihrem Paypal-Account ein und rufen Sie anschließend https://developer.paypal.com auf. Klicken Sie dann rechts oben auf "Go to Dashboard". Unter Sandbox - Accounts finden Sie die vorbereiteten Test-Konten. Sie können ganz rechts in der Liste die Konten öffnen und notwendige Informationen auslesen.

Auszug aus PayPal-Developer
Auszug aus PayPal-Developer

Weitere Informationen dazu unter:

https://developer.paypal.com/home

Die Syntax zum Erstellen der PayPal Checkout-Anbindung muss in der Regel angepasst werden. Bitte achten Sie darauf, dass aktuelle Skripte (entsprechend Veröffentlichung durch PayPal) zum Einsatz kommen. Da es sich um eine externe Anbindung handelt übernimmt Weblication keine Gewähr für die Sicherheit und Stabilität der Anbindung. 

Sollten die Zahlungsmöglichkeiten sprachabhängig abgebildet werden, ergänzen Sie in der Shop-Textdatei (/[IHR-INHALTS-PROJEKT]/wGlobal/content/text/shop.wTexts.php) den gewünschten Textbaustein:

<text key="shop_payment_[payment_value]">[Ihre Übersetzung]</text>

Beispiel:

<text key="shop_payment_invoice">per invoice</text>

Konfiguration

In der Konfiguration des Shops kann die Einstellung "Berücksichtigung des Lagerbestandes" auf "Ja" gesetzt werden. Sollte diese Einstellung in Ihrer Konfiguration noch nicht vorhanden sein, so können Sie diese manuell ergänzen:

<variable description="Lagerbestand berücksichtigen" key="consider_stock" type="char.yesno" inputStyle="width:auto">no</variable>

Bitte beachten Sie in diesem Fall, daß das Mini-Shop Weblic® auf neusten Stand ist und daß Sie die Maildaten entsprechend um die neuen Platzhalter für die Zahlungsmöglichkeiten ergänzen müssen. 

Funktionsweise

Wurde die Funktion aktiviert, so wird beim Bestellvorgang geprüft, ob die ausgewählten Produkte ausreichend auf Lager sind.

Der Kunde bekommt eine Fehlermeldung, sollte die angegebene Anzahl den im Produkt hinterlegten Lagerbestand übersteigen. Schließt der Kunde den Bestellvorgang ab, wird die angegebene Bestandsmenge des Produktes bzw. der Variante entsprechend heruntergerechnet.

Damit die Anzeige vollständig unterstützt wird, muss die Text-Datei (/[IHR-INHALTS-PROJEKT]/wGlobal/content/text/shop.wTexts.php) folgende Einträge enthalten:

<text key="shop_in_stock">auf Lager</text>
<text key="shop_not_in_stock">nicht auf Lager</text>
<text key="shop_stock_input_validation_failed">Achtung, Ihre Auswahl übersteigt den tatsächlichen Lagerbestand.</text>
<text key="shop_variants_input_validation_required_failed">Bitte wählen Sie eine Variante aus.</text>

Lagerbestand für Produkt deaktivieren

Da nicht alle Produkte (z.B. Gutscheine) zwingend einen Lagerbestand haben, ist es möglich, für jedes Produkt separat in der Bearbeitung die Berücksichtigung des Lagerbestandes zu deaktivieren.

Bitte beachten Sie, das bei zeitgleichen Zugriffen durch die Shop-Besucher, der angezeigte Lagerbestand der mit dem im Produkt eingetragenen variieren kann.

In der Konfiguration des Shops können mit der Einstellung "Weitere Mehrwersteuersätze in %" beliebig viele Mehrwertsteuersätze ergänzt werden.
Sollte diese Einstellung in Ihrer Konfiguration noch nicht vorhanden sein, können Sie diese manuell ergänzen:

<info>Weitere Mehrwersteuersätze in % </info>
<variable description="Mehrwertsteuer-Werte" key="additional_vat_values" type="char.default" inputStyle="">10|8</variable>
<variable description="Mehrwertsteuer-Texte" key="additional_vat_texts" type="char.default" inputStyle="">10%|8%</variable>

Bitte beachten Sie in diesem Fall, daß das Mini-Shop Weblic® auf neusten Stand ist.

Sollten die Lieferzeiten sprachabhängig abgebildet werden, so genügt es, dies in der Shop-Textdatei (/[IHR-INHALTS-PROJEKT]/wGlobal/content/text/shop.wTexts.php) wie folgt zu ergänzen:

<text key="shop_deliveryTime_[deliveryTime_value]">[Ihre Übersetzung]</text>

Beispiel:

<text key="shop_deliveryTime_5-10">5-10 days</text>

Konfiguration

In der Konfiguration des Shops kann die Einstellung "Kleinunternehmer" auf "Ja" gesetzt werden. Sollte diese Einstellung in Ihrer Konfiguration noch nicht vorhanden sein, können Sie diese manuell ergänzen:

<variable description="Kleinunternehmer" key="small_business" type="char.yesno" inputStyle="width:auto">yes</variable>

Bitte beachten Sie in diesem Fall, daß das Mini-Shop Weblic® auf neusten Stand ist.

Funktionsweise

Kleinunternehmer dürfen in Deutschland keine Mehrwertsteuer ausweisen. In diesem Fall werden alle Informationen bezüglich der MwSt bzw. einer anderen Steuer ausgeblendet. Der Warenkorb sowie das Produkt erhalten einen entsprechenden Hinweis, soweit die Text-Datei (s. u.) diese enthält.

Damit die Anzeige vollständig unterstützt wird, muss die Text-Datei (/[IHR-INHALTS-PROJEKT]/wGlobal/content/text/shop.wTexts.php) folgende Einträge enthalten:

<text key="shop_small_business_noVat_notice">Im Sinne der Kleinunternehmerregelung nach §19 UStG enthält der ausgewiesene Betrag keine Umsatzsteuer.</text>
<text key="shop_small_business_noVat">ohne MwSt. (§19 UStG), </text>

Die Lieferzeiten im Standard wurden um den Wert aufAnfrage ergänzt.
Im Allgemeinen können die Lieferzeiten simpel durch individuelle Angaben ergänzt werden. Dazu müssen Sie die Konfiguration um den entsprechenden Value und die zugehörige Caption ergänzen.

Die Lieferzeiten sind in den Objektdaten über den Platzhalter [!--stockInfo.disableOutputEscaping()--] auslesbar. Dieser Platzhalter wird zusammengebaut aus den Informationen in der shop.wTexts.php Datei und dem ausgewählten Wert.  

Um für die Lieferzeit auf Anfrage einen Link anzugeben, ergänzen Sie die shop.wTexts.php einfach durch shop_deliveryTime_aufAnfrage und den jeweiligen Text.

verfügbar seit Dezember 2022

Auszug aus Konfiguration
shop.wTexts.php
Auszug aus Konfiguration
Shop Lieferzeiten
shop.wTexts.php
shop_wTexts_deliveryTime

In der E-Mail soll in der Regel kein Link aufgeführt werden. Hier können Sie durch den Platzhalter shop_deliveryTime_mailStr_aufAnfrage für Mails eine andere Angabe einfügen.

Die Konfiguration "Bestellung erst nach Bezahlung absenden" (paypal_submitAfterPayment) wurde so angepasst, dass nach Absenden der Bestellung diese auf jeden Fall an den Händler wie auch den Kunden gesendet wird. Der Kunde wird bei aktivierter Funktion auf Paypal weitergeleitet und kann den Bezahlvorgang direkt einleiten. Erst wenn der Kunde die Zahlung abgeschlossen hat und er auf den Minishop zurückgeleitet wird (bezahlung-ok.php) wird die aktuelle Session mit den Bestelldaten und den Kundendaten gelöscht.

In der Konfiguration wurde der Text für entsprechend angepasst. Dieser lautet nun "Kunde nach Bestellung auf Paypal weiterleiten".

Dezember 2022

Paypal kann während der Entwicklung in einem Testmodus ausgeführt werden. Die Konfiguration wurde um die Einstellung "Testmodus über Sandbox" ergänzt. Ist das aktiviert, wird PayPal über die https://sandbox.paypal.com aufgerufen. Um diese Funktion nutzen zu können, bedarf es eines Testhändler- bzw. auch Testkunden Konto, das über ein Paypal-Konto generiert werden kann.

https://developer.paypal.com/ 

verfügbar seit Dezember 2022

Der Warenkorb kann innerhalb der Produktliste angezeigt werden. Über die Listenvariante "über Objektwizard  - 20100" werden die in dem Projekt verfügbaren Objekt-Varianten zur Auswahl angeboten.

Der aktuelle Shop liefert 3 Listenvarianten

  • Listenvariante: Standard
    Auflistung von Produkten

  • Listenvariante: mit Warenkorb
    Der Warenkorb wird direkt in die Liste geladen. Das wird nur bei wenigen Listeneinträgen empfohlen.

  • Listenvariante: Warenkorb nachladbar
    Der Warenkorb des Produktes wird per Klick in die Liste geladen.

Die Warenkorbdaten werden durch die Funktion wMyShop.php::prepareCartData() zurückgegeben.

Für individuelle Anpassungen, wie beispielsweise die Angabe von Versandkosten, die vom Gewicht abhängen, kann der Rückgabewert der oben genannten Funktion mithilfe von wMyProject::callbackShopPrepareCartData angepasst werden.

Im folgenden Beispiel wird angenommen, dass die Produkte um das Gewicht (weight) als zusätzliche Information ergänzt und gepflegt wurden.

verfügbar seit Oktober 2023

Beispiel: wMyProject::callbackShopPrepareCartData($cartData)

//*********************************************************************************/
/**
* @method Array callbackShopPrepareCart(Array $cartData)
*
* @description Callback Funktion, um die Daten die Warenkorbdaten zu manipulieren
*
* @param Array cartData - Aktuelle Warenkorbdaten
*
* @return Array
*
*/
//*********************************************************************************/

public static function callbackShopPrepareCartData($cartData){

/*Ermitteln des Bestellgewichtes, abhängig von den Gewichtsdaten der bestellten Produkte*/

$cartArticles = $cartData['cartEntries'] ?? array();
$weight = 0;

foreach (
$cartArticles as $article) {
$weight += $article['weight'] ?? 0;
}

/*Ermitteln der Versandkosten abhängig vom Bestellgewicht */

$shippingCosts = $cartData['shippingCostsDefault'] ?? 5.00;

if(
$weight > 2000 && $weight < 5000){
$shippingCosts = 10.00;
}
else if(
$weight > 5000){
$shippingCosts = 15.00;
}

/*Überschreiben der Warenkorb-Daten, damit die Platzhalter in der Seite richtig ersetzt werden*/

$cartData['shippingCostsDefault'] = $shippingCosts;
$cartData['deliveryCosts'] = number_format($shippingCosts, 2, wMyShop::getShopData('decimal_mark'), wMyShop::getShopData('thousandsSeparator')).' '.wMyShop::getShopData('currency');
$cartData['total_value'] = $cartData['totalWithoutShipping_value'] + $cartData['shippingCostsDefault'];
$cartData['total'] = number_format(round($cartData['total_value'], 2), 2, wMyShop::getShopData('decimal_mark'), wMyShop::getShopData('thousandsSeparator')).' '.wMyShop::getShopData('currency');
return
$cartData;

}

Die Produktdaten werden durch die Funktion wMyShop.php::prepareProductData() zurückgegeben.

Für individuelle Anpassungen, wie beispielsweise das Festlegen eines maximalen Bestellwertes für den Shopbesucher, kann der Rückgabewert der oben genannten Funktion mithilfe von wMyProject::callbackShopPrepareProductData angepasst werden.

Im folgenden Beispiel wird angenommen, dass die Pflegereferenz der Produkte um das Pflegefeld 'orderMax' ergänzt wurde. Wurde hier kein Wert angegeben, so wird für die maximale Bestellsumme der aktuelle Lagerbestand angenommen.  In der Konfiguration des Shops wurde die Berücksichtigung des Lagerbestandes aktiviert.

verfügbar seit November 2023

Beispiel: wMyProject::callbackShopPrepareProductData($productData)

//*********************************************************************************/
/**
* @method Array callbackShopPrepareProductData(Array $productData)
*
* @description Callback Funktion, um die Produktdaten zu manipulieren
*
* @param Array productData - Aktuelle Produktdaten
*
* @return Array
*
*/
//*********************************************************************************/

public static function callbackShopPrepareProductData($productData){

/*Maximale Bestellzahl für ein Produkt festlegen
Dazu genügt es den data-pattern-Wert des Inputfeldes des Produktes zu verändern
In diesem Beispiel ist der Bestellwert in den Objektdaten unter orderMax gepflegt
*/

foreach($productData['variants'] as $key => $value){
/*Zusammenbau des InputStrings*/
$input = '<input id="variant_'.$value['id'].'" '
.(!empty($value['checked']) && $value['checked'] ? 'checked="checked"' : '')
.
' type="radio" name="variant" checked="checked" style="" value="'.$value['id'].'"'
.($value['consider_stock'] === 'yes' ? 'data-errormsg="Sie haben die maximale Bestellzahl überschritten"
data-pattern="'
.($value['orderMax'] != '' ? 'maxvalue('.$value['orderMax'].')' : ($value['stock'] != '' ? 'maxvalue('.$value['stock'].')' : '')).'"' : '').'></input>';
/*Überlagern des bestehenden Strings*/
$productData['variants'][$key]['formInputVariant'] = $input;
}

/*Rückgabe der überlagerten Daten*/
return $productData;

}