<?php
ob_start();
//Secret key is from Coldslither merchant account on Sandbox
 $secret = 'sLW4fgYYFVtfBJwGDI{XYISlp5myHX6LJ45aFTip';
 $encpaymentdata = $_POST['encpaymentdata']; 
 $enckey = $_POST['enckey'];
 $flow = $_POST['path'];
 $apikey = $_POST['key'];
 $callid = $_POST['callid'];
 $unencrypted = decryptPayload($secret, $enckey, $encpaymentdata );
 //var_dump(json_decode($unencrypted, true));
 $newobj = json_decode($unencrypted);
  //Get Card Details
  $cardbrand = $newobj->paymentInstrument->paymentType->cardBrand;
  $lastfour = $newobj->paymentInstrument->lastFourDigits;
  $expiration = $newobj->paymentInstrument->expirationDate->month . "/". $newobj->paymentInstrument->expirationDate->year;
  $payinfo = '('.$cardbrand. ")". " ****". $lastfour." Exp: ".$expiration;
  //$payinfo = '('.$cardbrand. ")". " ****". $lastfour. "<br/>". $expiration;
  //Get PAN if v.init dataLevel is FULL (otherwise no PAN will be returned)
  if(isset($newobj->paymentInstrument->accountNumber)){
  $pan = $newobj->paymentInstrument->accountNumber; 
  }


  //echo $unencrypted;
 //Email
  $email = $newobj->userData->userEmail;
  
  //Billing information
  $billname = $newobj->paymentInstrument->billingAddress->personName;
  $billline1 = $newobj->paymentInstrument->billingAddress->line1;
  $billcity = $newobj->paymentInstrument->billingAddress->city;
  $billstate = $newobj->paymentInstrument->billingAddress->stateProvinceCode;
  $billcountry = $newobj->paymentInstrument->billingAddress->countryCode;
  $billzipcode = $newobj->paymentInstrument->billingAddress->postalCode;
  $billphone = $newobj->paymentInstrument->billingAddress->phone;
  $billaddress = $billname. "<br/>" . $billline1. "<br/>";
  
  if(isset($newobj->paymentInstrument->billingAddress->line2))
  {
	$billline2 = $newobj->paymentInstrument->billingAddress->line2;
	$billaddress = $billaddress.$billline2."<br/>";
  }
  if(isset($newobj->paymentInstrument->billingAddress->line3))
  {
	$billline3 = $newobj->paymentInstrument->billingAddress->line3;
	$billaddress = $billaddress.$billline3."<br/>";
  }
  $billaddress = $billaddress . $billcity . " ". $billstate . " ". $billzipcode ."<br/>". "E: ". $email. "<br/>". "P: " .$billphone;
  
 //Get Shipping address
 if (isset($newobj->shippingAddress)){
 $shipname = $newobj->shippingAddress->personName;
  $shipline1 = $newobj->shippingAddress->line1;
  $shipcity = $newobj->shippingAddress->city;
  $shipstate = $newobj->shippingAddress->stateProvinceCode;
  $shipcountry = $newobj->shippingAddress->countryCode;
  $shipzipcode = $newobj->shippingAddress->postalCode;
  $shipphone = $newobj->shippingAddress->phone;
  
  $shipaddress = $shipname. "<br/>" . $shipline1. "<br/>";
   
  if(isset($newobj->shippingAddress->line2))
  {
	$shipline2 = $newobj->shippingAddress->line2;
	$shipaddress = $shipaddress.$shipline2."<br/>";
  }
  if(isset($newobj->shippingAddress->line3))
  {
	$shipline3 = $newobj->shippingAddress->line3;
	$shipaddress = $shipaddress.$shipline3."<br/>";
  }
 
  
  $shipaddress = $shipaddress. $shipcity . " ". $shipstate . " ". $shipzipcode . "<br/>". "P: " .$shipphone;
  }
  else{
	 $shipaddress = "Store";
  }
  
  //Get Card Art
  if(isset($newobj->paymentInstrument->cardArts->cardArt[0]->baseImageFileName)){
  $cardart = $newobj->paymentInstrument->cardArts->cardArt[0]->baseImageFileName; 
  }

//This is for session data gear. This needs to change and iterate differently for capturing new items.

  //userdata
  foreach ($newobj->userData as $key=>$value) {
  if (empty($sd_userdata)){
  $sd_userdata = "userData.".$key.": <b>". $value."</b><br/>";
  }
  else{
  $sd_userdata = $sd_userdata."userData.".$key.": <b>". $value."</b><br/>";
   }}
   
   // Shipping (if collectShipping is not set to FALSE in v.init)
   if(isset($newobj->shippingAddress)){
   foreach ($newobj->shippingAddress as $key=>$value) {
   if (empty($sd_shippingaddress)){
  $sd_shippingaddress = "shippingAddress.".$key.": <b>". $value."</b><br/>";
  }
  else{
	if ($value == "true"){
	  $value = "true";
  }
  if ($value == "false"){
	  $value = "false";
  }

  $sd_shippingaddress = $sd_shippingaddress."shippingAddress.".$key.": <b>". $value."</b><br/>";
 } 
}
  //Partial Shipping 
  foreach ($newobj->partialShippingAddress as $key=>$value) {
  if (empty($sd_partialshipping)){
  $sd_partialshipping= "partialShippingAddress.".$key.": <b>". $value."</b><br/>";
  }
  else{
  $sd_partialshipping = $sd_partialshipping."partialShippingAddress.".$key.": <b>". $value."</b><br/>";
   } }
}
    //billing
   foreach ($newobj->paymentInstrument->billingAddress as $key=>$value) {
   if (empty($sd_billingaddress)){
  $sd_billingaddress= "paymentInstrument.billingAddress.".$key.": <b>". $value."</b><br/>";
  }
  else{
  $sd_billingaddress = $sd_billingaddress."paymentInstrument.billingAddress.".$key.": <b>". $value."</b><br/>";
   } }
   
   $sd_notnest = 'creationTimeStamp: <b>'.$newobj->creationTimeStamp. '</b><br/>'.
   'paymentInstrument.id: <b>'.$newobj->paymentInstrument->id. '</b><br/>'.
   'paymentInstrument.lastFourDigits: <b>'.$newobj->paymentInstrument->lastFourDigits. '</b><br/>'.
   'paymentInstrument.binSixDigits: <b>'.$newobj->paymentInstrument->binSixDigits. '</b><br/>'.
   'paymentInstrument.accountNumber: <b>'.$newobj->paymentInstrument->accountNumber. '</b><br/>'.
   'paymentInstrument.verificationStatus: <b>'.$newobj->paymentInstrument->verificationStatus. '</b><br/>'.
   'paymentInstrument.issuerBid: <b>'.$newobj->paymentInstrument->issuerBid. '</b><br/>'.
   'paymentInstrument.nameOnCard: <b>'.$newobj->paymentInstrument->nameOnCard. '</b><br/>'.	
   'paymentInstrument.cardFirstName: <b>'.$newobj->paymentInstrument->cardFirstName. '</b><br/>'.
   'paymentInstrument.cardLastName: <b>'.$newobj->paymentInstrument->cardLastName. '</b><br/>'.
   'paymentInstrument.nickName: <b>'.$newobj->paymentInstrument->nickName. '</b><br/>'.
   'paymentInstrument.expired: <b>false</b><br/>';
	//'paymentInstrument.expired:'.$newobj->paymentInstrument->expired. '<br/>';

    //billing paymenttype
   foreach ($newobj->paymentInstrument->paymentType as $key=>$value) {
   if (empty($sd_paymentType)){
  $sd_paymentType= "paymentInstrument.paymentType.".$key.": <b>". $value."</b><br/>";
  }
  else{
  $sd_paymentType = $sd_paymentType."paymentInstrument.paymentType.".$key.": <b>". $value."</b><br/>";
   } }

//billing expiration
   foreach ($newobj->paymentInstrument->expirationDate as $key=>$value) {
   if (empty($sd_expirationdate)){
  $sd_expirationdate= "paymentInstrument.expirationDate.".$key.": <b>". $value."</b><br/>";
  }
  else{
  $sd_expirationdate = $sd_expirationdate."paymentInstrument.expirationDate.".$key.": <b>". $value."</b><br/>";
   } }
   
   //Card Art 
   foreach ($newobj->paymentInstrument->cardArts->cardArt[0] as $key=>$value) {
   if (empty($sd_cardart)){
  $sd_cardart= "cardArt.".$key.": <b>". $value."</b><br/>";
  }
  else{
  $sd_cardart = $sd_cardart."cardArt.".$key.": <b>". $value."</b><br/>";
   } }
   
      //Risk Data 
   foreach ($newobj->riskData as $key=>$value) {
   if (empty($sd_riskdata)){
  $sd_riskdata= "riskData.".$key.": <b>". $value."</b><br/>";
  }
  else{
  $sd_riskdata = $sd_riskdata."riskData.".$key.": <b>". $value."</b><br/>";
   } }
   /*
   //3DS data
    foreach ($newobj->threeDS as $key=>$value) {
   if (empty($sd_threeds)){
  $sd_threeds= "threeDS.".$key.": <b>". $value."</b><br/>";
  }
  else{
  $sd_threeds = $sd_threeds."threeDS.".$key.": <b>". $value."</b><br/>";
   } }
   */

   
$sd_alldata = $sd_userdata. $sd_shippingaddress.$sd_notnest.$sd_billingaddress.$sd_paymentType.$sd_expirationdate.$sd_cardart.$sd_riskdata.$sd_threeds.$sd_partialshipping;
  $params = array('cardart' => $cardart, 'payinfo' => $payinfo, 'expiration' => $expiration, 'shipto' => $shipaddress, 'billto' => $billaddress, 'fulldetail' => $sd_alldata, 'pan' => $pan);
 if (isset($flow)) {
  /**
Proposal: use cURL to post Pay Data to DoDirectPaymentReceipt if flow = EC, v4 if PFP
  **/
  require_once '../../pp/php_nvp/CallerService.php';
  require_once '../../pp/php_nvp/gencc.php';
  session_start();
  /* Set an Invoice ID for the transaction as a luhn-10-compliant 16 digit number */
 $method = 'DoDirectPayment';
 $dsguid = completed_number("5150",16);
 $_SESSION['INVNUM'] = $dsguid;
 $paymentType = $_POST['paymentType'];
 $amount = $_POST['amt'];
 $currencyCode = $_POST['currencyCode'];
 $firstName = $newobj->paymentInstrument->cardFirstName;
 $lastName = $newobj->paymentInstrument->cardLastName;
 $creditCardType = $newobj->paymentInstrument->paymentType->cardBrand;
 $creditCardNumber = $pan;
 $expDateMonth = $newobj->paymentInstrument->expirationDate->month;
 $expDateYear = $newobj->paymentInstrument->expirationDate->year;
 $address1 = $billline1;
 $address2 = $billline2;
 $city = $billcity;
 $state = $billstate;
 $zip = $billzipcode;
 /* Create Update Pixel URL */
 $updatePixel = "https://sandbox.secure.checkout.visa.com/wallet-services-web/payment/updatepaymentinfo.gif?";
 $updatePixel .= "apikey=$apikey&callId=$callid&currencyCode=$currencyCode";
 $updatePixel .= "&eventType=Confirm&orderId=$dsguid&subtotal=$amount&total=$amount";
 if ($paymentType == 'Sale'){
  echo "<img src=\"$updatePixel\" />";
 }else{
  $_SESSION['updatePixel'] = $updatePixel;
  $_SESSION['flow'] = $flow;
 }
  /* Construct the request string that will be sent to PayPal.
  The variable $nvpstr contains all the variables and is a
  name value pair string with '&' as a delimiter */
$nvpStr="&PAYMENTACTION=$paymentType&AMT=$amount";
$nvpStr.="&CREDITCARDTYPE=$creditCardType&ACCT=$creditCardNumber&DESC=testing-the-description-field";
$nvpStr.="&EXPDATE=".$expDateMonth.$expDateYear;
$nvpStr.="&FIRSTNAME=$firstName&LASTNAME=$lastName&STREET=$address1&CITY=$city&STATE=$state";
$nvpStr.="&ZIP=$zip&COUNTRYCODE=US&CURRENCYCODE=$currencyCode";
$nvpStr.="&EMAIL=$email&CALLID=$callid&APIKEY=$apikey&INVNUM=$dsguid";
/* Make the API call to PayPal, using API signature.  The API response is stored in an associative array called $resArray.  Store the Response to SESSION for displaying any errors on APIError.php */
$resArray=hash_call($method,$nvpStr);
$_SESSION['reshash']=$resArray;
$_SESSION['nvpReqArray'] = $nvpReqArray;
//var_dump($resArray);

/**
Display the API response back to the browser.
If the response from PayPal was a success, display the response parameters.
This script really should not be used to display any data back to user.
Proposal: send $_SESSION['reshash']; to a review page.
**/
$ack = strtoupper($resArray["ACK"]);

  if ($ack == 'SUCCESS'){
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
    <title>PayPal NVP Web Samples Using PHP - DoDirectPayment Receipt</title>
    <link href="../../pp/php_nvp/sdk.css" rel="stylesheet" type="text/css" />
    <LINK REL="SHORTCUT ICON" HREF="../../pp/php_nvp/favicon.ico">
    <link rel="author" href="https://jchow.coldslither.com" title="Jason Chow" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0" />
</head>
<body>
<?php     

    //display entire response in browser
    echo "<div id=\"container\">";
    echo "<b class=\"rtop\">";
    echo "<b class=\"r1\"></b> <b class=\"r2\"></b> <b class=\"r3\"></b> <b class=\"r4\"></b></b>";
    echo "<h1>$method Results:</h1>";
    echo "<p><strong><img src=$cardart width=\"45\" />:</strong> $payinfo</p>";
    Foreach ($resArray as $key => $value){
            echo"<p>";
            echo"<strong>$key: </strong>";
            echo"$value";
            echo"</p>";
    }
    echo "<b class=\"rbottom\">";
    echo "<b class=\"r4\"></b><b class=\"r3\"></b><b class=\"r2\"></b><b class=\"r1\"></b></b>";
    echo "</div>";
    if ($paymentType == 'Authorization'){
      $method = 'DoCapture';
      $trxId = $resArray['TRANSACTIONID'];
      $completetype = 'NotComplete';
      echo "<br>";
    echo "<div id=\"container\">";
    echo "<b class=\"rtop\">";
    echo "<b class=\"r1\"></b> <b class=\"r2\"></b> <b class=\"r3\"></b> <b class=\"r4\"></b></b>";
    echo "<h1>$method</h1>";
      echo "<form action=\"../../pp/php_nvp/DoCapture.php\" method=\"post\">";
          echo "<label for=\"amt\" class=\"field\">$method Amount: </label>";

          echo "<input type=\"text\" name=\"amt\" class=\"required\" size=\"7\" value=\"$amount\"  />"; 

          echo "<br><label for=\"authid\" class=\"field\">$paymentType ID: </label>";

          echo "<input type=\"hidden\" name=\"method\" value=\"$method\" />";
          echo "<input type=\"hidden\" name=\"completetype\" value=\"$completetype\" />";
          echo "<input type=\"text\" name=\"authorizationid\" class=\"required\" value=\"$trxId\"  />";

      echo "<b class=\"rbottom\">";
    echo "<b class=\"r4\"></b><b class=\"r3\"></b><b class=\"r2\"></b><b class=\"r1\"></b></b>";
    echo "</div>";
    echo "<br>";
    echo "<div class=\"api\" style=\"text-align:center; margin:0 auto;\">";
    echo "<center>";
      echo "<input type=\"submit\" value=\"Submit\" class=\"formBtnOrange\" /></center></div>";
      echo "</form>";

      } 
} else  {
        
      /*Redirecting to APIError.php to display errors.  If the response was an error, display the errors received using APIError.php. */
      $location = "../../pp/php_nvp/APIError.php";
      header("Location: $location");
      }
      echo "<br>";
      echo "<div id=\"footer\">";
      echo "<a class=\"home\" id=\"CallsLink\" href=\"../../pp/php_nvp/index.html\">Home</a>";
      echo "</div>";
 }else{
  echo json_encode($params);
 }  
  

//Decryption code is below 
function decryptPayload($key, $wrappedKey, $payload) {   
 $unwrappedKey = decrypt($key, $wrappedKey);   
 return decrypt($unwrappedKey, $payload);  
 }   
 function decrypt($key, $data) {    
 $decodedData = base64_decode($data);    
 $hmac = substr($decodedData, 0, 32);  
 //echo strlen($hmac);
 $iv = substr($decodedData, 32, 16);  
 $data = substr($decodedData, 48); 
 if ($hmac != hmac($key, $iv . $data)) {    
	echo "HMAC validation"; 
 }    
 return openssl_decrypt($data, 'aes-256-cbc', hashKey($key), true, $iv); 
 }  
 function hashKey($data) {   
 $hasher = hash_init('sha256');    
 hash_update($hasher, $data);    
 return hash_final($hasher, true); 
 }   
 function hmac($key, $data) {    
 return hash_hmac('sha256', $data, $key, true);  
 }   
 
 ?>
