PHPDocumentation Index
Fetch the complete documentation index at: https://bancofcalifornia-preview.mintlify.app/llms.txt
Use this file to discover all available pages before exploring further.
<div id="3step_cvphp" class="current_content">
<pre><code class="language-php hljs" id="code_block_159">
<span class="hljs-comment">// API Setup Parameters</span>
$gatewayURL = <span class="hljs-string">'https://gateway.bancedge..com/api/v2/three-step'</span>;
$APIKey = <span class="hljs-string">'2F822Rw39fx762MaV7Yy86jXGTC7sCDy'</span>;
<span class="hljs-comment">// If there is no POST data or a token-id, print the initial Customer Information form to get ready for Step One.</span>
<span class="hljs-keyword">if</span> (<span class="hljs-keyword">empty</span>($_POST[<span class="hljs-string">'DO_STEP_1'</span>])&& <span class="hljs-keyword">empty</span>($_GET[<span class="hljs-string">'token-id'</span>])) {
<span class="hljs-keyword">print</span> <span class="hljs-string">' <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">'</span>;
<span class="hljs-keyword">print</span> <span class="hljs-string">'
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Collect non-sensitive Customer Vault Info </title>
</head>
<body>
<p><h2>Step One: Collect non-sensitive Customer Vault information.<br /></h2></p>
<h3> Customer Information</h3>
<h4> Billing Details</h4>
<form action="" method="post">
<table>
<tr><td>Customer Vault Id </td><td><input type="text" name="customer-vault-id" value=""></td></tr>
<tr><td>Company</td><td><input type="text" name="billing-address-company" value="Acme, Inc."></td></tr>
<tr><td>First Name </td><td><input type="text" name="billing-address-first-name" value="John"></td></tr>
<tr><td>Last Name </td><td><input type="text" name="billing-address-last-name" value="Smith"></td></tr>
<tr><td>Address </td><td><input type="text" name="billing-address-address1" value="1234 Main St."></td></tr>
<tr><td>City </td><td><input type="text" name="billing-address-city" value="Beverly Hills"></td></tr>
<tr><td>State/Province </td><td><input type="text" name="billing-address-state" value="CA"></td></tr>
<tr><td>Zip/Postal </td><td><input type="text" name="billing-address-zip" value="90210"></td></tr>
<tr><td>Country </td><td><input type="text" name="billing-address-country" value="US"></td></tr>
<tr><td>Phone Number </td><td><input type="text" name="billing-address-phone" value="555-555-5555"></td></tr>
<tr><td>Email Address </td><td><input type="text" name="billing-address-email" value="test@example.com"></td></tr>
<tr><td><h4><br /> Shipping Details</h4>
<tr><td>First Name </td><td><input type="text" name="shipping-address-first-name" value="Mary"></td></tr>
<tr><td>Last Name </td><td><input type="text" name="shipping-address-last-name" value="Smith"></td></tr>
<tr><td>Address </td><td><input type="text" name="shipping-address-address1" value="1234 Main St."></td></tr>
<tr><td>Suite</td><td><input type="text" name="shipping-address-address2" value="Unit #2"></td></tr>
<tr><td>City </td><td><input type="text" name="shipping-address-city" value="Beverly Hills"></td></tr>
<tr><td>State/Province </td><td><input type="text" name="shipping-address-state" value="CA"></td></tr>
<tr><td>Zip/Postal </td><td><input type="text" name="shipping-address-zip" value="90210"></td></tr>
<tr><td>Country</td><td><input type="text" name="shipping-address-country" value="US"></td></tr>
<tr><td colspan="2"> </td>
<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>
'</span>;
}<span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span> (!<span class="hljs-keyword">empty</span>($_POST[<span class="hljs-string">'DO_STEP_1'</span>])) {
<span class="hljs-comment">// Initiate Step One: Now that we've collected the non-sensitive customer information, we can combine other customer information and build the XML format.</span>
$xmlRequest = <span class="hljs-keyword">new</span> DOMDocument(<span class="hljs-string">'1.0'</span>,<span class="hljs-string">'UTF-8'</span>);
$xmlRequest->formatOutput = <span class="hljs-keyword">true</span>;
$xmlSale = $xmlRequest->createElement(<span class="hljs-string">'add-customer'</span>);
<span class="hljs-comment">// Authentication, Redirect-URL are typically the bare minimum.</span>
appendXmlNode($xmlRequest, $xmlSale,<span class="hljs-string">'api-key'</span>,$APIKey);
appendXmlNode($xmlRequest, $xmlSale,<span class="hljs-string">'redirect-url'</span>,$_SERVER[<span class="hljs-string">'HTTP_REFERER'</span>]);
<span class="hljs-comment">// Some additonal fields may have been previously decided by user</span>
appendXmlNode($xmlRequest, $xmlSale, <span class="hljs-string">'merchant-defined-field-1'</span> , <span class="hljs-string">'Red'</span>);
appendXmlNode($xmlRequest, $xmlSale, <span class="hljs-string">'merchant-defined-field-2'</span>, <span class="hljs-string">'Medium'</span>);
<span class="hljs-keyword">if</span>(!<span class="hljs-keyword">empty</span>($_POST[<span class="hljs-string">'customer-vault-id'</span>])) {
appendXmlNode($xmlRequest, $xmlSale, <span class="hljs-string">'customer-vault-id'</span> , $_POST[<span class="hljs-string">'customer-vault-id'</span>]);
}
<span class="hljs-comment">// Set the Billing & Shipping from what was collected on initial shopping cart form</span>
$xmlBillingAddress = $xmlRequest->createElement(<span class="hljs-string">'billing'</span>);
appendXmlNode($xmlRequest, $xmlBillingAddress,<span class="hljs-string">'first-name'</span>, $_POST[<span class="hljs-string">'billing-address-first-name'</span>]);
appendXmlNode($xmlRequest, $xmlBillingAddress,<span class="hljs-string">'last-name'</span>, $_POST[<span class="hljs-string">'billing-address-last-name'</span>]);
appendXmlNode($xmlRequest, $xmlBillingAddress,<span class="hljs-string">'address1'</span>, $_POST[<span class="hljs-string">'billing-address-address1'</span>]);
appendXmlNode($xmlRequest, $xmlBillingAddress,<span class="hljs-string">'city'</span>, $_POST[<span class="hljs-string">'billing-address-city'</span>]);
appendXmlNode($xmlRequest, $xmlBillingAddress,<span class="hljs-string">'state'</span>, $_POST[<span class="hljs-string">'billing-address-state'</span>]);
appendXmlNode($xmlRequest, $xmlBillingAddress,<span class="hljs-string">'postal'</span>, $_POST[<span class="hljs-string">'billing-address-zip'</span>]);
<span class="hljs-comment">//billing-address-email</span>
appendXmlNode($xmlRequest, $xmlBillingAddress,<span class="hljs-string">'country'</span>, $_POST[<span class="hljs-string">'billing-address-country'</span>]);
appendXmlNode($xmlRequest, $xmlBillingAddress,<span class="hljs-string">'email'</span>, $_POST[<span class="hljs-string">'billing-address-email'</span>]);
appendXmlNode($xmlRequest, $xmlBillingAddress,<span class="hljs-string">'phone'</span>, $_POST[<span class="hljs-string">'billing-address-phone'</span>]);
appendXmlNode($xmlRequest, $xmlBillingAddress,<span class="hljs-string">'company'</span>, $_POST[<span class="hljs-string">'billing-address-company'</span>]);
$xmlSale->appendChild($xmlBillingAddress);
$xmlShippingAddress = $xmlRequest->createElement(<span class="hljs-string">'shipping'</span>);
appendXmlNode($xmlRequest, $xmlShippingAddress,<span class="hljs-string">'first-name'</span>, $_POST[<span class="hljs-string">'shipping-address-first-name'</span>]);
appendXmlNode($xmlRequest, $xmlShippingAddress,<span class="hljs-string">'last-name'</span>, $_POST[<span class="hljs-string">'shipping-address-last-name'</span>]);
appendXmlNode($xmlRequest, $xmlShippingAddress,<span class="hljs-string">'address1'</span>, $_POST[<span class="hljs-string">'shipping-address-address1'</span>]);
appendXmlNode($xmlRequest, $xmlShippingAddress,<span class="hljs-string">'city'</span>, $_POST[<span class="hljs-string">'shipping-address-city'</span>]);
appendXmlNode($xmlRequest, $xmlShippingAddress,<span class="hljs-string">'state'</span>, $_POST[<span class="hljs-string">'shipping-address-state'</span>]);
appendXmlNode($xmlRequest, $xmlShippingAddress,<span class="hljs-string">'postal'</span>, $_POST[<span class="hljs-string">'shipping-address-zip'</span>]);
appendXmlNode($xmlRequest, $xmlShippingAddress,<span class="hljs-string">'country'</span>, $_POST[<span class="hljs-string">'shipping-address-country'</span>]);
appendXmlNode($xmlRequest, $xmlShippingAddress,<span class="hljs-string">'address2'</span>, $_POST[<span class="hljs-string">'shipping-address-address2'</span>]);
$xmlSale->appendChild($xmlShippingAddress);
$xmlRequest->appendChild($xmlSale);
<span class="hljs-comment">// Process Step One: Submit all customer details to the Payment Gateway except the customer's sensitive payment information.</span>
<span class="hljs-comment">// The Payment Gateway will return a variable form-url.</span>
$data = sendXMLviaCurl($xmlRequest,$gatewayURL);
<span class="hljs-comment">// Parse Step One's XML response</span>
$gwResponse = @<span class="hljs-keyword">new</span> SimpleXMLElement($data);
<span class="hljs-keyword">if</span> ((string)$gwResponse->result ==<span class="hljs-number">1</span> ) {
<span class="hljs-comment">// The form url for used in Step Two below</span>
$formURL = $gwResponse->{<span class="hljs-string">'form-url'</span>};
} <span class="hljs-keyword">else</span> {
<span class="hljs-keyword">throw</span> <span class="hljs-keyword">New</span> <span class="hljs-keyword">Exception</span>(<span class="hljs-keyword">print</span> <span class="hljs-string">" Error, received "</span> . $data);
}
<span class="hljs-comment">// Initiate Step Two: Create an HTML form that collects the customer's sensitive payment information</span>
<span class="hljs-comment">// and use the form-url that the Payment Gateway returns as the submit action in that form.</span>
<span class="hljs-keyword">print</span> <span class="hljs-string">' <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">'</span>;
<span class="hljs-keyword">print</span> <span class="hljs-string">'
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Collect sensitive Customer Info </title>
</head>
<body>'</span>;
<span class="hljs-comment">// Uncomment the line below if you would like to print Step One's response</span>
<span class="hljs-comment">// print '<pre>' . (htmlentities($data)) . '</pre>';</span>
<span class="hljs-keyword">print</span> <span class="hljs-string">'
<p><h2>Step Two: Collect sensitive payment information and POST directly to payment gateway<br /></h2></p>
<form action="'</span>.$formURL. <span class="hljs-string">'" method="POST">
<h3> Payment Information</h3>
<table>
<tr><td>Credit Card Number</td><td><INPUT type ="text" name="billing-cc-number" value="4111111111111111"> </td></tr>
<tr><td>Expiration Date</td><td><INPUT type ="text" name="billing-cc-exp" value="1014"> </td></tr>
<tr><Td colspan="2" align=center><INPUT type ="submit" value="Submit Step Two"></td> </tr>
</table>
</form>
</body>
</html>
'</span>;
<span class="hljs-comment">// <span class="hljs-doctag">NOTE:</span> CVV cannot be stored, per PCI Requirements</span>
} <span class="hljs-keyword">elseif</span> (!<span class="hljs-keyword">empty</span>($_GET[<span class="hljs-string">'token-id'</span>])) {
<span class="hljs-comment">// Step Three: Once the browser has been redirected, we can obtain the token-id and complete</span>
<span class="hljs-comment">// the Customer Vault Add through another XML HTTPS POST including the token-id which abstracts the</span>
<span class="hljs-comment">// sensitive payment information that was previously collected by the Payment Gateway.</span>
$tokenId = $_GET[<span class="hljs-string">'token-id'</span>];
$xmlRequest = <span class="hljs-keyword">new</span> DOMDocument(<span class="hljs-string">'1.0'</span>,<span class="hljs-string">'UTF-8'</span>);
$xmlRequest->formatOutput = <span class="hljs-keyword">true</span>;
$xmlCompleteTransaction = $xmlRequest->createElement(<span class="hljs-string">'complete-action'</span>);
appendXmlNode($xmlRequest, $xmlCompleteTransaction,<span class="hljs-string">'api-key'</span>,$APIKey);
appendXmlNode($xmlRequest, $xmlCompleteTransaction,<span class="hljs-string">'token-id'</span>,$tokenId);
$xmlRequest->appendChild($xmlCompleteTransaction);
<span class="hljs-comment">// Process Step Three</span>
$data = sendXMLviaCurl($xmlRequest,$gatewayURL);
$gwResponse = @<span class="hljs-keyword">new</span> SimpleXMLElement((string)$data);
<span class="hljs-keyword">print</span> <span class="hljs-string">' <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">'</span>;
<span class="hljs-keyword">print</span> <span class="hljs-string">'
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Step Three - Complete Add Customer </title>
</head>
<body>'</span>;
<span class="hljs-keyword">print</span> <span class="hljs-string">"
<p><h2>Step Three: Script automatically completes the process of adding the Customer Vault record <br /></h2></p>"</span>;
<span class="hljs-keyword">if</span> ((string)$gwResponse->result == <span class="hljs-number">1</span> ) {
<span class="hljs-keyword">print</span> <span class="hljs-string">" <p><h3> Customer Vault was Added, XML response was:</h3></p>\n"</span>;
<span class="hljs-keyword">print</span> <span class="hljs-string">'<pre>'</span> . (htmlentities($data)) . <span class="hljs-string">'</pre>'</span>;
} <span class="hljs-keyword">elseif</span>((string)$gwResponse->result == <span class="hljs-number">2</span>) {
<span class="hljs-keyword">print</span> <span class="hljs-string">" <p><h3> Customer Vault was Not Added</h3>\n"</span>;
<span class="hljs-keyword">print</span> <span class="hljs-string">" Reason : "</span> . (string)$gwResponse->{<span class="hljs-string">'result-text'</span>} .<span class="hljs-string">" </p>"</span>;
<span class="hljs-keyword">print</span> <span class="hljs-string">" <p><h3>XML response was:</h3></p>\n"</span>;
<span class="hljs-keyword">print</span> <span class="hljs-string">'<pre>'</span> . (htmlentities($data)) . <span class="hljs-string">'</pre>'</span>;
} <span class="hljs-keyword">else</span> {
<span class="hljs-keyword">print</span> <span class="hljs-string">" <p><h3> Customer Vault Add caused an Error.</h3>\n"</span>;
<span class="hljs-keyword">print</span> <span class="hljs-string">" Error Description: "</span> . (string)$gwResponse->{<span class="hljs-string">'result-text'</span>} .<span class="hljs-string">" </p>"</span>;
<span class="hljs-keyword">print</span> <span class="hljs-string">" <p><h3>XML response was:</h3></p>\n"</span>;
<span class="hljs-keyword">print</span> <span class="hljs-string">'<pre>'</span> . (htmlentities($data)) . <span class="hljs-string">'</pre>'</span>;
}
<span class="hljs-keyword">print</span> <span class="hljs-string">"</body></html>"</span>;
} <span class="hljs-keyword">else</span> {
<span class="hljs-keyword">print</span> <span class="hljs-string">"ERROR IN SCRIPT<BR>"</span>;
}
<span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">sendXMLviaCurl</span><span class="hljs-params">($xmlRequest,$gatewayURL)</span> </span>{
<span class="hljs-comment">// helper function demonstrating how to send the xml with curl</span>
$ch = curl_init(); <span class="hljs-comment">// Initialize curl handle</span>
curl_setopt($ch, CURLOPT_URL, $gatewayURL); <span class="hljs-comment">// Set POST URL</span>
$headers = <span class="hljs-keyword">array</span>();
$headers[] = <span class="hljs-string">"Content-type: text/xml"</span>;
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); <span class="hljs-comment">// Add http headers to let it know we're sending XML</span>
$xmlString = $xmlRequest->saveXML();
curl_setopt($ch, CURLOPT_FAILONERROR, <span class="hljs-number">1</span>); <span class="hljs-comment">// Fail on errors</span>
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, <span class="hljs-number">1</span>); <span class="hljs-comment">// Allow redirects</span>
curl_setopt($ch, CURLOPT_RETURNTRANSFER, <span class="hljs-number">1</span>); <span class="hljs-comment">// Return into a variable</span>
curl_setopt($ch, CURLOPT_PORT, <span class="hljs-number">443</span>); <span class="hljs-comment">// Set the port number</span>
curl_setopt($ch, CURLOPT_TIMEOUT, <span class="hljs-number">30</span>); <span class="hljs-comment">// Times out after 30s</span>
curl_setopt($ch, CURLOPT_POST, <span class="hljs-number">1</span>);
curl_setopt($ch, CURLOPT_POSTFIELDS, $xmlString); <span class="hljs-comment">// Add XML directly in POST</span>
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, <span class="hljs-number">2</span>);
<span class="hljs-comment">// This should be unset in production use. With it on, it forces the ssl cert to be valid</span>
<span class="hljs-comment">// before sending info.</span>
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, <span class="hljs-number">0</span>);
<span class="hljs-keyword">if</span> (!($data = curl_exec($ch))) {
<span class="hljs-keyword">print</span> <span class="hljs-string">"curl error =>"</span> .curl_error($ch) .<span class="hljs-string">"\n"</span>;
<span class="hljs-keyword">throw</span> <span class="hljs-keyword">New</span> <span class="hljs-keyword">Exception</span>(<span class="hljs-string">" CURL ERROR :"</span> . curl_error($ch));
}
curl_close($ch);
<span class="hljs-keyword">return</span> $data;
}
<span class="hljs-comment">// Helper function to make building xml dom easier</span>
<span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">appendXmlNode</span><span class="hljs-params">($domDocument, $parentNode, $name, $value)</span> </span>{
$childNode = $domDocument->createElement($name);
$childNodeValue = $domDocument->createTextNode($value);
$childNode->appendChild($childNodeValue);
$parentNode->appendChild($childNode);
}
</code>
</pre>
</div>