createSubscription

L'opération createSubscription permet de réaliser des paiements récurrents (abonnements).

Elle nécessite l'utilisation d'un alias déjà existant et valide.

Cet alias peut être créé via :

  • l'opération createToken,

    ou

  • par formulaire (voir Guide d'implémentation API Formulaire)

Trois fichiers sont requis pour créer un alias :

  • le fichier pour les fonctions "function.php".

  • le fichier pour la définition des objets "v5.php".

  • un fichier pour l'opération createSubscription :
    <?php
    include_once 'v5.php'; 	// Fichier comportant la définition des différentes objets 
    include_once 'function.php';// Fichier comportant l'ensemble des fonctions utiles (génération de l'uuid, etc...)
    
    
    //Intialisation des variables
    $shopId = "12345678";
    $key = "1234567891234567";	
    $mode = "TEST";
    $wsdl =  "https://secure.payzen.eu/vads-ws/v5?wsdl";
    
    //Exemple d'Initialisation d'un client SOAP avec gestion du SNI 
    		/*
    		$client = new soapClient($wsdl,	
    		$options = array('trace'=>1, 'exceptions'=> 0, 			
    					'encoding' => 'UTF-8','soapaction' => '',
    					'uri' => 'http://v5.ws.vads.lyra.com/',	            
    					'cache_wsdl' => WSDL_CACHE_NONE, 
    					//Proxy parameters
    					'proxy_host' => 'my.proxy.host',
    					'proxy_port' => 3128,
    					'stream_context' => stream_context_create (array('ssl' => array(                               
    								'SNI_enabled' => true,
    								'SNI_server_name' => 'secure.payzen.eu')))
    					));
    		*/	
    
    //Exemple d'Initialisation d'un client SOAP sans proxy		
    		$client = new soapClient($wsdl, $options = array(
    					'trace'=>1, 
    					'exceptions'=> 0, 			
    					'encoding' => 'UTF-8',
    					'soapaction' => '')
    				);		
    
    //Génération du header
    			$requestId = gen_uuid ();
    			$timestamp = gmdate ( "Y-m-d\TH:i:s\Z" );			
    			$authToken = base64_encode(hash_hmac('sha256',$requestId.$timestamp, $key, true));			
    			setHeaders ($shopId, $requestId, $timestamp, $mode, $authToken, $key, $client);
    		
    //Génération du body
    	
    	$commonRequest = new commonRequest;
    			$commonRequest->submissionDate = new DateTime('now',new DateTimeZone('UTC'));
    	
    	$orderRequest = new orderRequest;
    			$orderRequest->orderId = "myFirstSubscription";
    
    	$subscriptionRequest = new subscriptionRequest;
    			$subscriptionRequest->effectDate = "2016-07-10T18:00:00Z";	
    			$subscriptionRequest->amount = "30000";
    			$subscriptionRequest->currency = "978953756986840952356";
    			$subscriptionRequest->initialAmount = "1000";
    			$subscriptionRequest->initialAmountNumber = "1";
    			$subscriptionRequest->rrule = "RRULE:FREQ=MONTHLY;COUNT=12;BYMONTHDAY=10";
    			
    	$cardRequest = new cardRequest;
    			$cardRequest->paymentToken = "MyToken";
    			
    //Appel de l'opération createSubscription		
      try {		
    		$createSubscriptionRequest = new createSubscription;
    			$createSubscriptionRequest->commonRequest = $commonRequest;
    			$createSubscriptionRequest->orderRequest = $orderRequest;
    			$createSubscriptionRequest->cardRequest = $cardRequest; 
    			$createSubscriptionRequest->subscriptionRequest = $subscriptionRequest;
    	
    		$createSubscriptionRequest->commonRequest->submissionDate = $createSubscriptionRequest->commonRequest->submissionDate->format(dateTime::W3C);	
    		
    		$createSubscriptionResponse = $client->createSubscription($createSubscriptionRequest);
    	} catch (SoapFault $fault) {
    		
    //Gestion des exceptions
    	
    	trigger_error("SOAP Fault: (faultcode: {$fault->faultcode}, faultstring: {$fault->faultstring})", E_USER_ERROR);
    				 }
    	
    		/* Affichage des logs XML à remplacer par une écriture dans un fichier de log.	
    		 *
    		 * ATTENTION VOUS NE DEVEZ PAS ENREGISTRER LES NUMEROS DE CARTE DANS VOS LOGS
    		 */
    			echo "<hr> [Request Header] <br/>", htmlspecialchars($client->__getLastRequestHeaders()), "<br/>";
    			echo "<hr> [Request] <br/>", htmlspecialchars($client->__getLastRequest()), "<br/>";	
    			echo "<hr> [Response Header]<br/>", htmlspecialchars($client->__getLastResponseHeaders()), "<br/>";
    			echo "<hr> [Response]<br/>", htmlspecialchars($client->__getLastResponse()), "<br/>";
    			echo '<hr>';			
    			echo "<hr> [Response SOAP Headers]<br/>";
    
    ///Analyse de la réponse
    	//Récupération du SOAP Header de la réponse afin de stocker les en-têtes dans un tableau (ici $responseHeader)	
    	   $dom = new DOMDocument;
            $dom->loadXML($client->__getLastResponse(), LIBXML_NOWARNING);
            $path = new DOMXPath($dom);
            $headers = $path->query('//*[local-name()="Header"]/*');			
    	   $responseHeader = array();				
    	   foreach($headers as $headerItem) {			
    			$responseHeader[$headerItem->nodeName] = $headerItem->nodeValue;				
    		}	
    	
    	//Calcul du jeton d'authentification de la réponse				
    		$authTokenResponse = base64_encode(hash_hmac('sha256',$responseHeader['timestamp'].$responseHeader['requestId'], $key, true));			
    		if ($authTokenResponse !== $responseHeader['authToken']){			
    			//Erreur de calcul ou tentative de fraude			
    				echo 'Erreur interne rencontrée';
    		}
    		else{
    			
    			//Analyse de la réponse
    			if ($createSubscriptionResponse->createSubscriptionResult->commonResponse->responseCode != "0"){
    				//process error				
    				}
    				else{
    				
    				//Process terminé avec succès					
    					//Test de la présence du transactionStatusLabel:
    					if (isset ($createSubscriptionResponse->createSubscriptionResult->commonResponse->transactionStatusLabel)){
    					//La carte est non enrôlée ou 3DS Désactivé											
    						
    							// Le paiement est accepté	
    								// Le code ci-dessous doit être modifié pour intégrer les mises à jour de base de données etc..
    								
    								switch ($createPaymentResponse->createPaymentResult->commonResponse->transactionStatusLabel){							
    								case "AUTHORISED":
    									echo "paiement accepté";
    								break;
    								case "WAITING_AUTHORISATION":
    									echo "paiement accepté";
    								break;
    								case "AUTHORISED_TO_VALIDATE":
    									echo "paiement accepté";
    								break;
    								case "WAITING_AUTHORISATION_TO_VALIDATE":
    									echo "paiement accepté";
    								break;							
    							// Le paiement est refusé							
    									default:
    										echo "paiement refusé";
    									break;									
    								}						
    					}
    					
    				}
    			}
    ?>