<?php

	/**
	 * Erlaubt die Abwicklung einer Zahlung über den Sparkassen Händler Service
	 * @author Daschmi
	 */
	class wpsg_mod_shs extends wpsg_mod_basic 
	{
		
		var $lizenz = 2;
		var $id = 11;
		var $version = "9.9.9";
		var $api_version = "1.8";
				
		var $hilfeURL = 'http://wpshopgermany.de/?p=3099';
				
		/**
		 * Costructor
		 */
		public function __construct()
		{
				
			parent::__construct();
				
			$this->name = __('InternetKasse', 'wpsg');
			$this->group = __('Zahlungsarten', 'wpsg');
			$this->desc = __('Ermöglicht die Zahlungsabwicklung über die Sparkassen-Internetkasse.', 'wpsg');
		
		} // public function __construct()
		
		public function install()
		{
		
			$this->shop->checkDefault('wpsg_mod_shs_bezeichnung_creditcard', $this->name.' ('.__('Kreditkarte', 'wpsg').')', false, true);
			$this->shop->checkDefault('wpsg_mod_shs_aktiv_creditcard', '1');
			$this->shop->checkDefault('wpsg_mod_shs_hint_creditcard', __('Wählen Sie diese Zahlungsart, um die Zahlung über die Sparkassen Internet Kasse durchzuführen. (Kreditkarte)', 'wpsg'));
			
			$this->shop->checkDefault('wpsg_mod_shs_bezeichnung_maestro', $this->name.' ('.__('Geldkarte', 'wpsg').')', false, true);
			$this->shop->checkDefault('wpsg_mod_shs_aktiv_maestro', '0');
			$this->shop->checkDefault('wpsg_mod_shs_hint_maestro', __('Wählen Sie diese Zahlungsart, um die Zahlung über die Sparkassen Internet Kasse durchzuführen. (Geldkarte)', 'wpsg'));
			
			$this->shop->checkDefault('wpsg_mod_shs_bezeichnung_directdebit', $this->name.' ('.__('Lastschrift', 'wpsg').')', false, true);
			$this->shop->checkDefault('wpsg_mod_shs_aktiv_directdebit', '0');
			$this->shop->checkDefault('wpsg_mod_shs_hint_directdebit', __('Wählen Sie diese Zahlungsart, um die Zahlung über die Sparkassen Internet Kasse durchzuführen. (Lastschrift)', 'wpsg'));
			$this->shop->checkDefault('wpsg_mod_shs_transactiontype', 'authorization');			
						
			$this->shop->checkDefault('wpsg_mod_shs_gebuehr', '0');
			$this->shop->checkDefault('wpsg_mod_shs_mwst', '0');
			$this->shop->checkDefault('wpsg_mod_shs_mwstland', '0');			
			$this->shop->checkDefault('wpsg_mod_shs_paymentmethod', 'creditcard');			
			$this->shop->checkDefault('wpsg_mod_shs_autostart', '0');
			$this->shop->checkDefault('wpsg_mod_shs_autoend', '1');
			
			$this->shop->checkDefault('wpsg_mod_shs_apiurl', 'https://system.sparkassen-internetkasse.de/web-api/SSLPayment.po');
						 				
		} // public function install()
		
		public function init() 
		{
			
			if ($this->shop->get_option('wpsg_mod_shs_sandbox') == '1')
			{
				
				//$this->url = "https://testsystem.sparkassen-internetkasse.de/vbv/mpi_legacy";
				$this->url = preg_replace('/^https\:\/\//', 'https://test', $this->shop->get_option('wpsg_mod_shs_apiurl'));
				
			}
			else		
			{	
					
				//$this->url = "https://system.sparkassen-internetkasse.de/vbv/mpi_legacy";
				$this->url = $this->shop->get_option('wpsg_mod_shs_apiurl');
				
			}
			
		} // public function init()
		
		public function settings_edit()
		{
			
			$basket_link = get_permalink($this->shop->get_option('wpsg_page_basket'));
			
			if (strpos($basket_link, "?") > 0)
			{
				$basket_link .= "&wpsg_plugin=wpsg_mod_shs&confirm=pp";
			}
			else
			{
				$basket_link .= "?wpsg_plugin=wpsg_mod_shs&confirm=pp";
			}
			
			$this->shop->view['wpsg_mod_notify_url'] = $basket_link;

			$pages = get_pages();
				
			$arPages = array(
				'-1' => __('Neu anlegen und zuordnen', 'wpsg')
			);
				
			foreach ($pages as $k => $v)
			{
				$arPages[$v->ID] = $v->post_title.' (ID:'.$v->ID.')';
			}
				
			$this->shop->view['pages'] = $arPages;
			$this->shop->view['api_version'] = $this->api_version;
			
			$this->shop->render(WPSG_PATH_VIEW.'/mods/mod_shs/settings_edit.phtml');
			
		} // public function settings_edit()
		
		public function settings_save()
		{
			
			$this->shop->update_option('wpsg_mod_shs_bezeichnung_creditcard', $_REQUEST['wpsg_mod_shs_bezeichnung_creditcard']);
			$this->shop->update_option('wpsg_mod_shs_aktiv_creditcard', $_REQUEST['wpsg_mod_shs_aktiv_creditcard']); 
			$this->shop->update_option('wpsg_mod_shs_hint_creditcard', $_REQUEST['wpsg_mod_shs_hint_creditcard']);
			
			$this->shop->update_option('wpsg_mod_shs_bezeichnung_maestro', $_REQUEST['wpsg_mod_shs_bezeichnung_maestro']);
			$this->shop->update_option('wpsg_mod_shs_aktiv_maestro', $_REQUEST['wpsg_mod_shs_aktiv_maestro']);
			$this->shop->update_option('wpsg_mod_shs_hint_maestro', $_REQUEST['wpsg_mod_shs_hint_maestro']);
			
			$this->shop->update_option('wpsg_mod_shs_bezeichnung_directdebit', $_REQUEST['wpsg_mod_shs_bezeichnung_directdebit']);
			$this->shop->update_option('wpsg_mod_shs_aktiv_directdebit', $_REQUEST['wpsg_mod_shs_aktiv_directdebit']);
			$this->shop->update_option('wpsg_mod_shs_hint_directdebit', $_REQUEST['wpsg_mod_shs_hint_directdebit']);
			
			$this->shop->update_option('wpsg_mod_shs_mwst', $_REQUEST['wpsg_mod_shs_mwst']);
			$this->shop->update_option('wpsg_mod_shs_gebuehr', $_REQUEST['wpsg_mod_shs_gebuehr']);
			$this->shop->update_option('wpsg_mod_shs_mwstland', $_REQUEST['wpsg_mod_shs_mwstland']);			
			$this->shop->update_option('wpsg_mod_shs_autostart', $_REQUEST['wpsg_mod_shs_autostart']);
			$this->shop->update_option('wpsg_mod_shs_autoend', $_REQUEST['wpsg_mod_shs_autoend']);			
			
			$this->shop->update_option('wpsg_mod_shs_mobileversion', $_REQUEST['wpsg_mod_shs_mobileversion']);
			$this->shop->update_option('wpsg_mod_shs_creditcard_cardholder', $_REQUEST['wpsg_mod_shs_creditcard_cardholder']);
			$this->shop->update_option('wpsg_mod_shs_creditcard_optionalcardholder', $_REQUEST['wpsg_mod_shs_creditcard_optionalcardholder']);
			$this->shop->update_option('wpsg_mod_shs_creditcard_sslifvisaenrolledu', $_REQUEST['wpsg_mod_shs_creditcard_sslifvisaenrolledu']);
			$this->shop->update_option('wpsg_mod_shs_directdebit_accountholder', $_REQUEST['wpsg_mod_shs_directdebit_accountholder']);
			$this->shop->update_option('wpsg_mod_shs_directdebit_optionalaccountholder', $_REQUEST['wpsg_mod_shs_directdebit_optionalaccountholder']);
			$this->shop->update_option('wpsg_mod_shs_directdebit_checklist', $_REQUEST['wpsg_mod_shs_directdebit_checklist']);
			$this->shop->update_option('wpsg_mod_shs_transactiontype', $_REQUEST['wpsg_mod_shs_transactiontype']);
			
			$this->shop->update_option('wpsg_mod_shs_sandbox', $_REQUEST['wpsg_mod_shs_sandbox']);					
			$this->shop->update_option('wpsg_mod_shs_sslmerchant', $_REQUEST['wpsg_mod_shs_sslmerchant']);
			$this->shop->update_option('wpsg_mod_shs_sslpw', $_REQUEST['wpsg_mod_shs_sslpw']);			
									
			$this->shop->update_option('wpsg_mod_shs_apiurl', $_REQUEST['wpsg_mod_shs_apiurl']);
						
			$this->shop->createPage(__('Erfolgreiche Zahlung (Sparkassen Internetkasse)', 'wpsg'), 'wpsg_page_mod_shs_success', $_REQUEST['wpsg_page_mod_shs_success']);
			$this->shop->createPage(__('Fehlgeschlagene Zahlung (Sparkassen Internetkasse)', 'wpsg'), 'wpsg_page_mod_shs_error', $_REQUEST['wpsg_page_mod_shs_error']);
							
		} // public function settings_save()
		
		public function addPayment(&$arPayment)
		{
						
			$mwst_value = $this->getTaxValue($this->shop->get_option('wpsg_mod_shs_mwst'), $this->shop->getDefaultCountry());
			
			$nSHS = 0;
			if ($this->shop->get_option('wpsg_mod_shs_aktiv_creditcard') == '1') $nSHS ++;
			if ($this->shop->get_option('wpsg_mod_shs_aktiv_maestro') == '1') $nSHS ++;
			if ($this->shop->get_option('wpsg_mod_shs_aktiv_directdebit') == '1') $nSHS ++;
			
			if (is_admin() || $this->shop->get_option('wpsg_mod_shs_aktiv_creditcard') == '1')
			{
			
				$arPayment[$this->id.'_1'] = array(
					'id' => $this->id.'_1',
					'name' => __($this->shop->get_option('wpsg_mod_shs_bezeichnung_creditcard'), 'wpsg'),
					'preis' => $this->shop->get_option('wpsg_mod_shs_gebuehr'),
					'mwst' => $this->shop->get_option('wpsg_mod_shs_mwst'),
					'mwst_value' => $mwst_value,
					'mwst_null' => $this->shop->get_option('wpsg_mod_shs_mwstland'),
					'hint' => __($this->shop->get_option('wpsg_mod_shs_hint_creditcard')),
					'logo' => (($nSHS == 1)?$this->shop->getRessourceURL('mods/mod_shs/gfx/internetkasse-logo.png'):$this->shop->getRessourceURL('mods/mod_shs/gfx/internetkasse-logo_creditcard.png'))
				);
			
			}
			
			if (is_admin() || $this->shop->get_option('wpsg_mod_shs_aktiv_maestro') == '1')
			{
					
				$arPayment[$this->id.'_2'] = array(
					'id' => $this->id.'_2',
					'name' => __($this->shop->get_option('wpsg_mod_shs_bezeichnung_maestro'), 'wpsg'),
					'preis' => $this->shop->get_option('wpsg_mod_shs_gebuehr'),
					'mwst' => $this->shop->get_option('wpsg_mod_shs_mwst'),
					'mwst_value' => $mwst_value,
					'mwst_null' => $this->shop->get_option('wpsg_mod_shs_mwstland'),
					'hint' => __($this->shop->get_option('wpsg_mod_shs_hint_maestro')),
					'logo' => (($nSHS == 1)?$this->shop->getRessourceURL('mods/mod_shs/gfx/internetkasse-logo.png'):$this->shop->getRessourceURL('mods/mod_shs/gfx/internetkasse-logo_maestro.png'))
				);
					
			}

			if (is_admin() || $this->shop->get_option('wpsg_mod_shs_aktiv_directdebit') == '1')
			{
					
				$arPayment[$this->id.'_3'] = array(
					'id' => $this->id.'_3',
					'name' => __($this->shop->get_option('wpsg_mod_shs_bezeichnung_directdebit'), 'wpsg'),
					'preis' => $this->shop->get_option('wpsg_mod_shs_gebuehr'),
					'mwst' => $this->shop->get_option('wpsg_mod_shs_mwst'),
					'mwst_value' => $mwst_value,
					'mwst_null' => $this->shop->get_option('wpsg_mod_shs_mwstland'),
					'hint' => __($this->shop->get_option('wpsg_mod_shs_hint_directdebit')),
					'logo' => (($nSHS == 1)?$this->shop->getRessourceURL('mods/mod_shs/gfx/internetkasse-logo.png'):$this->shop->getRessourceURL('mods/mod_shs/gfx/internetkasse-logo_directdebit.png')),
					'logo_100x25' => $this->shop->getRessourceURL('mods/mod_shs/gfx/logo_100x25.png')
				);
					
			}
			
			if (isset($_REQUEST['wpsg_checkout2']))
			{
			
				$arBasket = $this->shop->basket->toArray();
			
				if ($this->shop->get_option('wpsg_preisangaben') == WPSG_NETTO || $arBasket['noMwSt'])
				{
			
					$payment_netto = $this->getPreis($this->shop->get_option('wpsg_mod_shs_gebuehr'), $arBasket['sum']['preis']);
					$payment_brutto = wpsg_calculatePreis($payment_netto, WPSG_BRUTTO, $mwst_value);
			
				}
				else
				{
			
					$payment_brutto = $this->getPreis($this->shop->get_option('wpsg_mod_shs_gebuehr'), $arBasket['sum']['preis']);
					$payment_netto = wpsg_calculatePreis($payment_brutto, WPSG_NETTO, $mwst_value);
			
				}
			
				// Entsprechenden Preis anzeigen
				if (method_exists($this->shop, 'getFrontendTaxview'))
				{
				
					if ($this->shop->getFrontendTaxview() == WPSG_NETTO)
					{
							
						if ($this->shop->get_option('wpsg_mod_shs_aktiv_creditcard') == '1') $arPayment[$this->id.'_1']['price'] = $payment_netto;
						if ($this->shop->get_option('wpsg_mod_shs_aktiv_maestro') == '1') $arPayment[$this->id.'_2']['price'] = $payment_netto;
						if ($this->shop->get_option('wpsg_mod_shs_aktiv_directdebit') == '1') $arPayment[$this->id.'_3']['price'] = $payment_netto;
							
					}
					else
					{
							
						if ($this->shop->get_option('wpsg_mod_shs_aktiv_creditcard') == '1') $arPayment[$this->id.'_1']['price'] = $payment_brutto;
						if ($this->shop->get_option('wpsg_mod_shs_aktiv_maestro') == '1') $arPayment[$this->id.'_2']['price'] = $payment_brutto;
						if ($this->shop->get_option('wpsg_mod_shs_aktiv_directdebit') == '1') $arPayment[$this->id.'_3']['price'] = $payment_brutto;
							
					}
					
				}
				else
				{
					 
					if ($this->shop->get_option('wpsg_preisangaben_frontend') == WPSG_NETTO)
					{
							
						if ($this->shop->get_option('wpsg_mod_shs_aktiv_creditcard') == '1') $arPayment[$this->id.'_1']['price'] = $payment_netto;
						if ($this->shop->get_option('wpsg_mod_shs_aktiv_maestro') == '1') $arPayment[$this->id.'_2']['price'] = $payment_netto;
						if ($this->shop->get_option('wpsg_mod_shs_aktiv_directdebit') == '1') $arPayment[$this->id.'_3']['price'] = $payment_netto;
							
					}
					else
					{
							
						if ($this->shop->get_option('wpsg_mod_shs_aktiv_creditcard') == '1') $arPayment[$this->id.'_1']['price'] = $payment_brutto;
						if ($this->shop->get_option('wpsg_mod_shs_aktiv_maestro') == '1') $arPayment[$this->id.'_2']['price'] = $payment_brutto;
						if ($this->shop->get_option('wpsg_mod_shs_aktiv_directdebit') == '1') $arPayment[$this->id.'_3']['price'] = $payment_brutto;
							
					}
					
				}
			
			}
			
		} // public function addPayment(&$arPayment)
		
		public function calcPayment(&$arBasket)
		{
				
			if (preg_match('/^'.$this->id.'_\d$/', $arBasket['checkout']['payment']))
			{
		
				$payment_price = $this->getPreis($this->shop->get_option('wpsg_mod_shs_gebuehr'), $arBasket['sum']['preis']);
		
				if ($this->shop->get_option('wpsg_mod_shs_mwstland') == '1' && $arBasket['noMwSt'])
				{
						
					// Keine MwSt. berechnen !
					$arBasket['sum']['preis_payment'] = $payment_price;
					$arBasket['sum']['preis_payment_brutto'] = $payment_price;
					$arBasket['sum']['preis_payment_netto'] = $payment_price;
						
					$arBasket['payment']['mwst'] = 0;
					$this->shop->arPayment[$arBasket['checkout']['payment']]['mwst_value'] = 0;
						
					$arBasket['payment']['tax_rata'] = false;
					
				}
				else
				{
						
					// MwSt berechnen (Angaben im Backend sind immer Brutto)
					$this->setPaymentKosten($arBasket, $payment_price, $this->shop->get_option('wpsg_mod_shs_mwst'));
		
				}
		
			}
				
		} // public function calcPayment(&$arBasket)
		
		public function order_done(&$order_id, &$done_view)
		{
		
			// Bestellungen mit 0 geben nix aus
			if ($done_view['basket']['sum']['preis_gesamt_brutto'] <= 0) return;
				
			if (preg_match('/^'.$this->id.'_\d$/', $this->shop->view['basket']['checkout']['payment']))
			{
				 	
				$this->shop->view['payLink'] = $this->getPayLink($order_id);
				
				echo $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_shs/order_done.phtml', false);
		
			}
		
		} // public function order_done(&$order_id)
		
		public function wp_loaded() 
		{
				
			if ($_REQUEST['wpsg_plugin'] == 'wpsg_mod_shs' && $_REQUEST['confirm'] == 'pp')
			{
				
				if (preg_match('/\d+-\d+/', $_REQUEST['orderid']))
				{
					
					$order_id_request = $_REQUEST['orderid'];
					
					$arOrderID = explode('-', $_REQUEST['orderid']);
					$_REQUEST['orderid'] = $arOrderID[1]; 
									
				}
				
				if ($_REQUEST['orderid'] <= 0) die(__('URL Erreichbar, aber orderid zum bilden des Hashs nicht übergeben! URL sollte erst nach Zahlung mit den Daten angefragt werden. Rückgabe ist dann die Zielurl. Ohne orderid ist auch keine interne Zuordnung der Bestellung möglich, deswegen hier Abbruch.', 'wpsg'));
				
				$arParam = array(
					'account' => wpsg_getStr($_REQUEST['account']),
					'aid' => wpsg_getStr($_REQUEST['aid']),
					'amount' => wpsg_getStr($_REQUEST['amount']),
					'bankcode' => wpsg_getStr($_REQUEST['bankcode']),
					'basketid' => wpsg_getStr($_REQUEST['basketid']),
					'bic' => wpsg_getStr($_REQUEST['bic']),
					'creditc' => wpsg_getStr($_REQUEST['creditc']),
					'currency' => wpsg_getStr($_REQUEST['currency']),
					'deliverycountry' => wpsg_getStr($_REQUEST['deliverycountry']),
					'directPosErrorCode' => wpsg_getStr($_REQUEST['directPosErrorCode']),
					'directPosErrorMessage' => wpsg_getStr($_REQUEST['directPosErrorMessage']),
					'expdat' => wpsg_getStr($_REQUEST['expdat']),					
					'iban' => wpsg_getStr($_REQUEST['iban']),					
					'ipcheckresult' => wpsg_getStr($_REQUEST['ipcheckresult']),					
					'orderid' => wpsg_getStr($order_id_request),					
					'ppan' => wpsg_getStr($_REQUEST['ppan']),
					'rc' => wpsg_getStr($_REQUEST['rc']),
					'rc_avsamex' => wpsg_getStr($_REQUEST['rc_avsamex']),
					'rc_score' => wpsg_getStr($_REQUEST['rc_score']),
					'retrefnum' => wpsg_getStr($_REQUEST['retrefnum']),
					'sessionid' => wpsg_getStr($_REQUEST['sessionid']),
					'trefnum' => wpsg_getStr($_REQUEST['trefnum']),					
					'txn_card' => wpsg_getStr($_REQUEST['txn_card']),
					'version' => wpsg_getStr($_REQUEST['version'])
				);
				 
				ksort($arParam);
				
				// Hash bilden
				$mac = $this->hmac($this->shop->get_option('wpsg_mod_shs_sslpw'), implode('', $arParam));
								
				if ($mac != $_REQUEST['mac'])
				{
					
					// Hash stimmt nicht überein !					
					$this->db->ImportQuery(WPSG_TBL_OL, array(
						"title" => __("Sparkassenkasse HASH Fehler", "wpsg"),
						"cdate" => "NOW()",
						"o_id" => wpsg_q($_REQUEST['orderid']),
						"mailtext" => wpsg_q(print_r($_REQUEST, 1))
					));
					
				}
				else
				{
					
					if ($_REQUEST['directPosErrorCode'] === '0')
					{

						$this->db->ImportQuery(WPSG_TBL_OL, array(
							"title" => wpsg_translate(__("Sparkassenkasse Zahlungseingang: #1#", "wpsg"), wpsg_ff(wpsg_tf($_REQUEST['amount']), $this->shop->get_option('wpsg_currency'))),
							"cdate" => "NOW()",
							"o_id" => wpsg_q($_REQUEST['orderid']),
							"mailtext" => wpsg_q(print_r($_REQUEST, 1))
						));
						
						if ($this->shop->setPayMent($_REQUEST['orderid'], wpsg_tf($_REQUEST['amount'])))
						{
								
							$this->shop->setOrderStatus($_REQUEST['orderid'], 100, true);
								
						}						
												
						if ($this->shop->get_option('wpsg_mod_shs_autoend') == '1')
							$strBack = "redirecturls=".get_permalink($this->shop->get_option('wpsg_page_mod_shs_success'));
						else
							$strBack = "rurls=".get_permalink($this->shop->get_option('wpsg_page_mod_shs_success'));
						
					}	
					else 
					{
						
						// Fehlercode gesendet
						$this->db->ImportQuery(WPSG_TBL_OL, array(
							"title" => wpsg_translate(__("Sparkassenkasse Fehler: #1#", "wpsg"), $_REQUEST['directPosErrorMessage']),
							"cdate" => "NOW()",
							"o_id" => wpsg_q($_REQUEST['orderid']),
							"mailtext" => wpsg_q(print_r($_REQUEST, 1))
						));
						
						if ($this->shop->get_option('wpsg_mod_shs_autoend') == '1')
							$strBack = "redirecturlf=".get_permalink($this->shop->get_option('wpsg_page_mod_shs_error'));
						else
							$strBack = "rurlf=".get_permalink($this->shop->get_option('wpsg_page_mod_shs_error'));
						
					}	
 
					die($strBack);
					
				}

				die();
				
			}
			
		} // public function wp_loaded() 
		
		public function mail_payment()
		{
		
			if (!preg_match('/^'.$this->id.'_\d$/', $this->shop->view['basket']['checkout']['payment'])) return;
				
			if ($this->shop->htmlMail === true)
			{
				
				echo '<a href="'.$this->shop->getDoneURL($this->shop->view['o_id']).'">'.__('Zahlungslink', 'wpsg').'</a>'.__(', um die Zahlung durchzuführen', 'wpsg');
				
			}
			else
			{
			
				echo wpsg_pad_right(__('Zahlungslink', 'wpsg').':', 35).$this->shop->getDoneURL($this->shop->view['o_id']);
				
			}
				
		} // public function mail_payment()
				
		/* Modulfunktionen */
		
		/**
		 * Gibt den Link für die Bezahlung anhand der BestellID zurück
		 */
		public function getPayLink($order_id)
		{ 
			
			$order_data = $this->shop->cache->loadOrder($order_id);
			$customer_data = $this->shop->cache->loadKunden($order_data['k_id']);
		
			// Damit das abtrennen der Straße/Hausnummer fehlerfreier funktioniert
			$customer_data['strasse'] = trim($customer_data['strasse']);
			
			$arBasket = $this->shop->basket->toArray();
			
			$arParam = array();
			
			// acceptcountries / Optional; Liste der erlaubten Ausgabeländer bei Kreditkartenzahlung. Zweibuchstabige, durch Komma voneinander getrennte Länderkürzel nach dem aktuell gültigen Standard ISO 3166 (s. http://www.iso.org/iso/en/prods-services/ iso3166ma/02iso-3166-code-lists/list-en1.html). Ohne diesen Parameter gilt keine Einschränkung hinsichtlich des Ausgabelandes.
			
			// additionalnote / Überschreibt die Händlerbezeichnung auf der Kreditkartenabrechnung des Kunden. Kann z.B. verwendet werden, wenn ein Händler unter mehreren Namen Waren anbietet, um dem Kunden die Zuordnung der Zahlung zu einem Einkauf zu erleichtern. Kann nur bei entsprechender Konfiguration Ihres Zugangs verwendet werden.
					
			// amount / Pflichtfeld; Betrag mit Dezimalkomma
			$arParam['amount'] = number_format(round(wpsg_tf($arBasket['sum']['preis_gesamt_brutto']), 2), 2, ',', '');

			// autocapture / Optional; nur bei Reservierung: Zeitraum - in Stunden - zwischen Reservierung und automatischer Buchung. Ohne diesen Parameter erfolgt keine automatische Buchung. Erlaubt sind Werte von 0-168 Stunden für Kreditkartenzahlungen und von 0-720 Stunden für Lastschriften.
			
			// basketid / Optional; Kennung des bestellten Warenkorbs oder Artikels, kann auf dem Kontoauszug bzw. der Kreditkartenabrechnung von Käufer und Händler angezeigt werden, s. Abschnitt „Warenkorbnummer“, S. 48
			$arParam['basketid'] = $order_data['onr'];
			
			// command / Pflichtfeld; Requestdefinition
			$arParam['command'] = 'sslform';
			
			// countryrejectmessage / Optional, nur zusammen mit acceptcountries oder rejectcountries. Fehlermeldung, falls eine Kreditkarte aufgrund Ihres Ausgabelandes abgewiesen wurde. Fehlt der Parameter, wird die Standard-Fehlermeldung für diesen Fehler verwendet.

			// cssurl / Optional. URL des Cascading Stylesheet, mit dem das Formular angezeigt wird. Ohne diesen Parameter wird die in der Händleroberfläche konfigurierte URL verwendet.
									
			// currency / Pflichtfeld; Währungscode gemäß ISO 4217. Für Lastschriften immer EUR.
			$arParam['currency'] = 'EUR';
				
			// customer_addr_city / Optional; Stadt der Adresse des Kunden. Für Adressverifizierung bei Zahlungen mit American Express Kreditkarte.
			$arParam['customer_addr_city'] = $customer_data['ort'];
			
			// customer_addr_number / Optional; Hausnummer der Adresse des Kunden. Für Adressverifizierung bei Zahlungen mit American Express Kreditkarte.
			$arParam['customer_addr_number'] = preg_replace('/(.*)\040+/', '', $customer_data['strasse']);
			
			// customer_addr_street / Optional; Straße der Adresse des Kunden. Für Adressverifizierung bei Zahlungen mit American Express Kreditkarte.
			$arParam['customer_addr_street'] = preg_replace('/\040+(.*)/', '', $customer_data['strasse']);
			
			// customer_addr_zip / Optional; Postleitzahl der Adresse des Kunden. Für Adressverifizierung bei Zahlungen mit American Express Kreditkarte.
			$arParam['customer_addr_zip'] = $customer_data['plz'];
			
			// date / Optional; aktuelles Datum und Uhrzeit im Format YYYYMMTT_HH:mm:ss
			$arParam['date'] = date('Ymd_H:i:s');
			
			// deliverycountry / Optional. Land der Lieferadresse. Zweibuchstabiges Länderkürzel nach ISO 3166.
			if ($order_data['shipping_land'] > 0)
				$arParam['deliverycountry'] = $this->db->fetchOne("SELECT `kuerzel` FROM `".WPSG_TBL_LAND."` WHERE `id` = '".wpsg_q($order_data['shipping_land'])."'");
			else
				$arParam['deliverycountry'] = $this->db->fetchOne("SELECT `kuerzel` FROM `".WPSG_TBL_LAND."` WHERE `id` = '".wpsg_q($customer_data['land'])."'");
			
			// deliverycountryaction / Optional. Gibt an, wie verfahren werden soll, wenn das in deliverycountry angegebene Land nicht mit dem Ausgabeland der Kreditkarte übereinstimmt.
			$arParam['deliverycountryaction'] = 'notify';
			
			// deliverycountryrejectmessage / Optional. Fehlermeldung, falls das Ausgabeland einer Kreditkarte nicht mit dem in deliverycountry übergebenen Land übereinstimmt und die Kreditkarte deshalb abgewiesen wird. Falls nicht angegeben, wird die Standard-Fehlermeldung des Systems für diesen Fehler verwendet.
			
			// locale / Optional. Sprache des anzuzeigenden Formulars. "de" - deutsch, "en" - englisch, "es" - spanisch, "fr" - französisch, "it" - italienisch, "pt" - portugiesisch, "nl" - niederländisch, "cs" - tschechisch, "sv" - schwedisch, "da" - dänsich. Falls nicht angegeben, wird das deutschsprachige Formular angezeigt. Für Spenden und Beiträge existieren zusätzliche "Locales" mit angepassten Texten: "spde" (Spende, deutsch), "spen" (Spende, englisch), "btde" (Beitrag, deutsch), "bten" (Beitrag, englisch).
						
			// merchantref / Optional, nur für Kreditkartenzahlungen. Transaktionsreferenz, die auf der Kreditkartenabrechnung des Händlers statt der Warenkorbnummer angezeigt wird.
			
			// notificationfailedurl / Optional. Wenn der Shop nicht über den Ausgang der Zahlung informiert werden kann, wird dem Kunden eine Ergebnisseite mit einem Link zu dieser URL angezeigt.
			
			// orderid / Pflichtfeld; Vorgangsnummer
			$arParam['orderid'] = time().'-'.$order_id;
			 
			// payment_options / Optional. Mögliche Werte: cardholder, optionalcardholder, sslifvisaenrolledu, generate_ppan, amexavs, accountholder, optionalaccountholder, checklist

			$arPaymentOption = array();
			if ($this->shop->get_option('wpsg_mod_shs_creditcard_cardholder') == '1' && $order_data['type_payment'] == $this->id.'_1') $arPaymentOption[] = 'cardholder';
			if ($this->shop->get_option('wpsg_mod_shs_creditcard_optionalcardholder') == '1' && $order_data['type_payment'] == $this->id.'_1') $arPaymentOption[] = 'optionalcardholder';
			if ($this->shop->get_option('wpsg_mod_shs_creditcard_sslifvisaenrolledu') == '1' && $order_data['type_payment'] == $this->id.'_1') $arPaymentOption[] = 'sslifvisaenrolledu';
			if ($this->shop->get_option('wpsg_mod_shs_directdebit_accountholder') == '1' && $order_data['type_payment'] == $this->id.'_3') $arPaymentOption[] = 'accountholder';
			if ($this->shop->get_option('wpsg_mod_shs_directdebit_optionalaccountholder') == '1' && $order_data['type_payment'] == $this->id.'_3') $arPaymentOption[] = 'optionalaccountholder';
			if ($this->shop->get_option('wpsg_mod_shs_directdebit_checklist') == '1' && $order_data['type_payment'] == $this->id.'_3') $arPaymentOption[] = 'checklist';
						
			if (wpsg_isSizedArray($arPaymentOption)) $arParam['payment_options'] = implode(',', $arPaymentOption);
			
			// paymentmethod / Pflichtfeld, Zahlungsart: "creditcard" (Kreditkarte), "maestro" oder "directdebit" (Lastschrift). Kreditkarten-Transaktionen werden als 3D-Secure-Zahlungen ausgeführt, wenn Ihr Zugang entsprechend konfiguriert ist, ansonsten erfolgt die Transaktionohne 3D-Secure.
			if ($order_data['type_payment'] == $this->id.'_1') $arParam['paymentmethod'] = 'creditcard';
			if ($order_data['type_payment'] == $this->id.'_2') $arParam['paymentmethod'] = 'maestro';
			if ($order_data['type_payment'] == $this->id.'_3') $arParam['paymentmethod'] = 'directdebit';
			
			// ppan / Optional, nur für Kreditkartenzahlungen zusammen mit payment_options=generate_ppan verwenden. Pseudokartennummer für eine Kreditkarte. Falls nicht angegeben, generiert Sparkassen-Internetkasse eine Pseudokartennummer und sendet Ihnen diese in der Shopbenachrichtigung.
			
			// rejectcountries / Optional; Liste nicht erlaubter Ausgabeländer bei Kreditkartenzahlung. Zweibuchstabige, durch Komma voneinander getrennte Länderkürzel nach ISO 3166. Ohne diesen Parameter gilt keine Einschränkung hinsichtlich des Ausgabelandes.
			
			// sessionid / Optional; Kennung der aktuellen Session im Onlineshop, wird für die Benachrichtigung des Shops verwendet
			$arParam['sessionid'] = session_id();

			// sslmerchant / Pflichtfeld; Händlerkennung
			$arParam['sslmerchant'] = $this->shop->get_option('wpsg_mod_shs_sslmerchant');
			
			// transactiontype / Optional, wenn nicht gesetzt: "preauthorization"; Transaktionsart. Entweder Reservieren ("preauthorization") oder Reservieren/Buchen ("authorization")
			if ($this->shop->get_option('wpsg_mod_shs_transactiontype') == '1') $arParam['transactiontype'] = 'authorization'; 
			else $arParam['transactiontype'] = 'preauthorization';
			
			// version / Pflichtfeld. Version des Formularservice. "1.5" für Standard-Webbrowser, "1.5m" um Formulare angezeigt zu bekommen, die für das Apple iPhone und andere Smartphones mit WebKit basiertem Webbrowser optimiert wurden.
			if ($this->shop->get_option('wpsg_mod_shs_mobileversion') == '1')
				$arParam['version'] = $this->api_version.'m';
			else
				$arParam['version'] = $this->api_version;

			if ($order_data['type_payment'] == $this->id.'_3')
			{
				
				// Lastschrift
				$arParam['mandateid'] = $order_data['id'];
				$arParam['mandatesigned'] = date('Ymd', strtotime($order_data['cdate']));
				
			}
			/*else if ($order_data['type_payment'] == $this->id.'_1')
			{
				
				// Kreditkarte
				$arParam = array(
					'amount' => $arParam['amount'],
					'command' => $arParam['command'],
					'currency' => $arParam['currency'],
					'orderid' => $arParam['orderid'],
					'paymentmethod' => $arParam['paymentmethod'],
					'sslmerchant' => $arParam['sslmerchant'],
					'version' => $this->api_version						
				); 
				
			}*/
			
			// mac / Pflichtfeld; Message Authentication Code, dient der Absicherung gegen Manipulationen der Zahlungsdaten, s. Abschnitt „MAC - Message Authentication Code“, S. 63
			/* Version 1.3 war es mal so:
			$arParam['mac'] = $this->hmac(
				$this->shop->get_option('wpsg_mod_shs_sslpw'),
					wpsg_getStr($arParam['acceptcountries']).wpsg_getStr($arParam['additionalnote']).wpsg_getStr($arParam['amount']).
					wpsg_getStr($arParam['autocapture']).wpsg_getStr($arParam['basketid']).wpsg_getStr($arParam['command']).
					wpsg_getStr($arParam['countryrejectmessage']).wpsg_getStr($arParam['cssurl']).wpsg_getStr($arParam['currency']).
					wpsg_getStr($arParam['customer_addr_city']).wpsg_getStr($arParam['customer_addr_number']).wpsg_getStr($arParam['customer_addr_street']).
					wpsg_getStr($arParam['customer_addr_zip']).wpsg_getStr($arParam['date']).wpsg_getStr($arParam['deliverycountry']).
					wpsg_getStr($arParam['deliverycountryaction']).wpsg_getStr($arParam['deliverycountryrejectmessage']).wpsg_getStr($arParam['locale']).
					wpsg_getStr($arParam['merchantref']).wpsg_getStr($arParam['notificationfailedurl']).wpsg_getStr($arParam['orderid']).
					wpsg_getStr($arParam['payment_options']).wpsg_getStr($arParam['paymentmethod']).wpsg_getStr($arParam['ppan']).
					wpsg_getStr($arParam['rejectcountries']).wpsg_getStr($arParam['sessionid']).wpsg_getStr($arParam['sslmerchant']).
					wpsg_getStr($arParam['transactiontype']).wpsg_getStr($arParam['version'])
			); 
			*/
			 
			// MAC bilden
			ksort($arParam);

			$arParam['mac'] = $this->hmac($this->shop->get_option('wpsg_mod_shs_sslpw'), implode('', $arParam));
			
			$url = $this->url.'?'.http_build_query($arParam, null, '&');
			
			return $url;
			
		} // public function getPayLink($order_id)
		
		/**
		 * Hilfsfunktion zur Bildung des HMAC mit SHA-1 
		 */
		function hmac($key, $data) 
		{
			
			$b = 64;
			$key = str_pad($key, $b, chr(0x00));
			$ipad = str_pad('', $b, chr(0x36));
			$opad = str_pad('', $b, chr(0x5c));
			$k_ipad = $key ^ $ipad;
			$k_opad = $key ^ $opad;
			
			return sha1($k_opad.pack("H*", sha1($k_ipad.$data)));
			
		} // function hmac($key, $data)
		
	} // class wpsg_mod_shs extends wpsg_mod_basic

?>