On Apr 19, 2013, at 3:32 PM, tamouse mailing lists <tamouse.lists@xxxxxxxxx> wrote: >> >> page1.php is sending out to credit card company - getting processed - then coming back to the *same page1.php* with the XML data listed below... > > Please expand what you mean by "sending out" and "coming back" - is > this a REST or SOAP API call? In that case, the response body is > likely to be the XML. > >> >> - so I'm not going to some other page to get it - it is coming to me to the same page I am on.......... >> >> so - after the XML result comes in - I need to assign the php to the XML somehow... > > How do you recognize the "XML result com(ing) in" ? > Hi tamouse, with my untrained eye - it appears that this is what is 'sending out' $data = sendXMLviaCurl($xmlRequest,$gatewayURL); and this might be what is 'responding back' on the same page $gwResponse = @new SimpleXMLElement((string)$data); you can see these lines towards the bottom at - // Process Step Three... --- the page code is long - so i cut out some extra lines - but this is ======================= all page code - with edits... <?php // API Setup Parameters $gatewayURL = 'https://secure.webxxx.com/api/test'; $APIKey = 'xxxxxxx'; // If there is no POST data or a token-id, print the initial shopping cart form to get ready for Step One. if (empty($_POST['DO_STEP_1'])&& empty($_GET['token-id'])) { print ' <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">'; print ' <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <title>Collect non-sensitive Customer Info </title> </head> <body> <p><h2>Step One: Collect non-sensitive payment information.<br /></h2></p> <h3> Customer Information</h3> <h4> Billing Details</h4> <form action="" method="post"> <table> <tr><td>Company</td><td><input type="text" name="billing-address-company" value="Acme, Inc."></td></tr> --- more <tr><td><h4><br /> Shipping Details</h4> --more <tr><td colspan="2"> </td> <tr><td colspan="2" align=center>Total Amount $12.00 </td></tr> <tr><td colspan="2" align=center><input type="submit" value="Submit Step One"><input type="hidden" name ="DO_STEP_1" value="true"></td></tr> </table> </form> </body> </html> '; }else if (!empty($_POST['DO_STEP_1'])) { // Initiate Step One: Now that we've collected the non-sensitive payment information, we can combine other order information and build the XML format. $xmlRequest = new DOMDocument('1.0','UTF-8'); $xmlRequest->formatOutput = true; $xmlSale = $xmlRequest->createElement('sale'); // Amount, authentication, and Redirect-URL are typically the bare mininum. appendXmlNode($xmlSale,'api-key',$APIKey); appendXmlNode($xmlSale,'redirect-url',$_SERVER['HTTP_REFERER']); appendXmlNode($xmlSale, 'amount', '12.00'); appendXmlNode($xmlSale, 'ip-address', $_SERVER["REMOTE_ADDR"]); //appendXmlNode($xmlSale, 'processor-id' , 'processora'); appendXmlNode($xmlSale, 'currency', 'USD'); //appendXmlNode($xmlSale, 'dup-seconds' , '2'); // Some additonal fields may have been previously decided by user appendXmlNode($xmlSale, 'order-id', '1234'); appendXmlNode($xmlSale, 'order-description', 'Small Order'); appendXmlNode($xmlSale, 'merchant-defined-field-1' , 'Red'); appendXmlNode($xmlSale, 'merchant-defined-field-2', 'Medium'); appendXmlNode($xmlSale, 'tax-amount' , '2.00'); appendXmlNode($xmlSale, 'shipping-amount' , '0.00'); /*if(!empty($_POST['customer-vault-id'])) { appendXmlNode($xmlSale, 'customer-vault-id' , $_POST['customer-vault-id']); }else { $xmlAdd = $xmlRequest->createElement('add-customer'); appendXmlNode($xmlAdd, 'customer-vault-id' ,411); $xmlSale->appendChild($xmlAdd); }*/ // Set the Billing & Shipping from what was collected on initial shopping cart form $xmlBillingAddress = $xmlRequest->createElement('billing'); appendXmlNode($xmlBillingAddress,'first-name', $_POST['billing-address-first-name']); //-more //billing-address-email appendXmlNode($xmlBillingAddress,'country', $_POST['billing-address-country']); appendXmlNode($xmlBillingAddress,'email', $_POST['billing-address-email']); //more $xmlSale->appendChild($xmlBillingAddress); $xmlShippingAddress = $xmlRequest->createElement('shipping'); appendXmlNode($xmlShippingAddress,'first-name', $_POST['shipping-address-first-name']); appendXmlNode($xmlShippingAddress,'last-name', $_POST['shipping-address-last-name']); // more appendXmlNode($xmlShippingAddress,'fax', $_POST['shipping-address-fax']); $xmlSale->appendChild($xmlShippingAddress); // Products already chosen by user $xmlProduct = $xmlRequest->createElement('product'); appendXmlNode($xmlProduct,'product-code' , 'SKU-123456'); // more appendXmlNode($xmlProduct,'alternate-tax-id' , '12345'); $xmlSale->appendChild($xmlProduct); $xmlProduct = $xmlRequest->createElement('product'); appendXmlNode($xmlProduct,'product-code' , 'SKU-123456'); appendXmlNode($xmlProduct,'description' , 'test 2 product description'); //more appendXmlNode($xmlProduct,'alternate-tax-id' , '12345'); $xmlSale->appendChild($xmlProduct); $xmlRequest->appendChild($xmlSale); // Process Step One: Submit all transaction details to the Payment Gateway except the customer's sensitive payment information. // The Payment Gateway will return a variable form-url. $data = sendXMLviaCurl($xmlRequest,$gatewayURL); // Parse Step One's XML response $gwResponse = @new SimpleXMLElement($data); if ((string)$gwResponse->result ==1 ) { // The form url for used in Step Two below $formURL = $gwResponse->{'form-url'}; } else { throw New Exception(print " Error, received " . $data); } // Initiate Step Two: Create an HTML form that collects the customer's sensitive payment information // and use the form-url that the Payment Gateway returns as the submit action in that form. print ' <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">'; print ' <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <title>Collect sensitive Customer Info </title> </head> <body>'; // Uncomment the line below if you would like to print Step One's response // print '<pre>' . (htmlentities($data)) . '</pre>'; print ' <p><h2>Step Two:<br /></h2></p> <form action="'.$formURL. '" method="POST"> <h3> Payment Information</h3> <table> <tr><td>Credit Card Number</td><td><INPUT type ="text" name="billing-cc-number" value="1111xxx"> </td></tr> <tr><td>Expiration Date</td><td><INPUT type ="text" name="billing-cc-exp" value="0118"> </td></tr> <tr><td>CVV</td><td><INPUT type ="text" name="cvv" > </td></tr> <tr><Td colspan="2" align=center><INPUT type ="submit" value="Submit Step Two"></td> </tr> </table> </form> </body> </html> '; } elseif (!empty($_GET['token-id'])) { // Step Three: Once the browser has been redirected, we can obtain the token-id and complete // the transaction through another XML HTTPS POST including the token-id which abstracts the // sensitive payment information that was previously collected by the Payment Gateway. $tokenId = $_GET['token-id']; $xmlRequest = new DOMDocument('1.0','UTF-8'); $xmlRequest->formatOutput = true; $xmlCompleteTransaction = $xmlRequest->createElement('complete-action'); appendXmlNode($xmlCompleteTransaction,'api-key',$APIKey); appendXmlNode($xmlCompleteTransaction,'token-id',$tokenId); $xmlRequest->appendChild($xmlCompleteTransaction); // Process Step Three $data = sendXMLviaCurl($xmlRequest,$gatewayURL); $gwResponse = @new SimpleXMLElement((string)$data); print ' <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">'; print ' <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <title>Step Three - Complete Transaciton</title> </head> <body>'; print " <p><h2>Step Three: Script automatically completes the transaction <br /></h2></p>"; if ((string)$gwResponse->result == 1 ) { print " <p><h3> Transaction was Approved, XML response was:</h3></p>\n"; print '<pre>' . (htmlentities($data)) . '</pre>'; } elseif((string)$gwResponse->result == 2) { print " <p><h3> Transaction was Declined.</h3>\n"; print " Decline Description : " . (string)$gwResponse->{'result-text'} ." </p>"; print " <p><h3>XML response was:</h3></p>\n"; print '<pre>' . (htmlentities($data)) . '</pre>'; } else { print " <p><h3> Transaction caused an Error.</h3>\n"; print " Error Description: " . (string)$gwResponse->{'result-text'} ." </p>"; print " <p><h3>XML response was:</h3></p>\n"; print '<pre>' . (htmlentities($data)) . '</pre>'; } print "</body></html>"; } else { print "ERROR IN SCRIPT<BR>"; } function sendXMLviaCurl($xmlRequest,$gatewayURL) { // helper function demonstrating how to send the xml with curl $ch = curl_init(); // Initialize curl handle curl_setopt($ch, CURLOPT_URL, $gatewayURL); // Set POST URL $headers = array(); $headers[] = "Content-type: text/xml"; curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); // Add http headers to let it know we're sending XML $xmlString = $xmlRequest->saveXML(); curl_setopt($ch, CURLOPT_FAILONERROR, 1); // Fail on errors curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); // Allow redirects curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // Return into a variable curl_setopt($ch, CURLOPT_PORT, 443); // Set the port number curl_setopt($ch, CURLOPT_TIMEOUT, 15); // Times out after 15s curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $xmlString); // Add XML directly in POST curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2); // This should be unset in production use. With it on, it forces the ssl cert to be valid // before sending info. curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); if (!($data = curl_exec($ch))) { print "curl error =>" .curl_error($ch) ."\n"; throw New Exception(" CURL ERROR :" . curl_error($ch)); } curl_close($ch); return $data; } // Helper function to make building xml dom easier function appendXmlNode($parentNode,$name, $value) { $tempNode = new DOMElement($name,$value); $parentNode->appendChild($tempNode); } ?> -- Thanks, Dave - DealTek dealtek@xxxxxxxxx [db-3]