<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic Re: Working php hash verification in Integration and Testing</title>
    <link>https://community.developer.cybersource.com/t5/Integration-and-Testing/Working-php-hash-verification/m-p/65854#M39466</link>
    <description>&lt;a href="https://community.developer.cybersource.com/t5/user/viewprofilepage/user-id/28091"&gt;@xero&lt;/a&gt;,&lt;BR /&gt;&lt;BR /&gt;For the fingerprint you use a different string than what is on the upgrade link. That link is for the new API and not DPM/SIM. The second php example I posted on this thread has the string for the fingerprint for those methods. I haven’t tested it but it should work. Another user has the same string and has posted that their fingerprint is working. And for your other question, as I understand it at some later date both MD5 values will be axed in favor of sha512</description>
    <pubDate>Thu, 17 Jan 2019 19:39:15 GMT</pubDate>
    <dc:creator>Renaissance</dc:creator>
    <dc:date>2019-01-17T19:39:15Z</dc:date>
    <item>
      <title>Working php hash verification</title>
      <link>https://community.developer.cybersource.com/t5/Integration-and-Testing/Working-php-hash-verification/m-p/65774#M39390</link>
      <description>&lt;P&gt;**If you find this helpful please kudo this post. This has consumed a huge chunk of my day and you will help me build credibility for when I enroll in the authorize.net certified developer program. **&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Here is 100% tested, working php hash verification code for the php SDK. I believe this will also work with SIM/AIM, etc.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;You need the following to have an apples to apples setup with what I used:&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;1: The most recent php SDK package from GitHub. I downloaded this today and installed. I believe it is a few days old.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;2: If you have not generated a signature key from your production or sandbox merchant interface to use for testing, do so. You won’t get the hash in the response without it. Generate it and copy it for use in this script.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;3: An API call script for some payment transaction that returns the hash. With the SDK I am getting this for voidTransaction, refundTransaction, capture, etc. I believe that any payment function that directly charges or affects a transaction will contain this. The Accept Hosted form API call obviously does not.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;For requirement 1, the SIM/DPM, etc. users do not have this, if my understanding is correct. You should be able to use this as well, only substituting my method for extracting the transHashSha2 value from the response with however you accomplish this using your integration. You may also have to use different parameters in your delimited string, I would try this method first, but I have seen other developers posting attempts with more fields in the string than login, transId, and amount, and there is probably a good reason for this.&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Here is the code (p.s. do not follow the hyperlink to the C# byte array description and try to implement a php equivalent to the C# byte array script. This makes things 100X harder than they have to be, as I know well at this point. Without further delay…..)&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;PRE&gt;$login = "copy and paste your merchant login id here";
$signatureKey ="copy and paste your signature key here";
$signatureKey = hex2bin($signatureKey);
$amount = $amount;

//$response stands for the response object returned by your API call
//e.g.  $response = refundTransaction($refTransId,$amount,$lastFour);

$transId = $response-&amp;gt;getTransactionResponse()-&amp;gt;getTransId();
$string = '^'.$login.'^'.$transId.'^'.$amount.'^';


$hash = $response-&amp;gt;getTransactionResponse()-&amp;gt;getTransHashSha2();
$digest = strtoupper(HASH_HMAC('sha512',$string,$signatureKey));

if(hash_equals ($digest,$hash)){

    //This if statement is the verification piece 
    //Put whatever you want your app to do with the transaction here
    //to test you can do something like echo "Hash verification validated";
    //or try this:
    //$dump = print_r($string,true);
    //$fp = file_put_contents( 'transhash.log', $dump );
    //and if your directory populates with a file named transhash.log you know 
    //verification succeeded
    

}&lt;/PRE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Wed, 16 Jan 2019 05:13:57 GMT</pubDate>
      <guid>https://community.developer.cybersource.com/t5/Integration-and-Testing/Working-php-hash-verification/m-p/65774#M39390</guid>
      <dc:creator>Renaissance</dc:creator>
      <dc:date>2019-01-16T05:13:57Z</dc:date>
    </item>
    <item>
      <title>Re: Working php hash verification</title>
      <link>https://community.developer.cybersource.com/t5/Integration-and-Testing/Working-php-hash-verification/m-p/65781#M39397</link>
      <description>&lt;P&gt;One question -&amp;nbsp;&lt;/P&gt;&lt;P&gt;I am also going to update md5 to sha512.&lt;BR /&gt;Currently, in my application I use (save at my end)-&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;API Login ID -&amp;nbsp;&lt;/P&gt;&lt;P&gt;Transaction Key -&amp;nbsp;&lt;BR /&gt;MD5 -&amp;nbsp;&lt;BR /&gt;&lt;BR /&gt;For sha512 -&amp;nbsp;&lt;BR /&gt;&lt;BR /&gt;do I need transaction key or not? What will be the procedure to follow?&lt;/P&gt;&lt;P&gt;Thanks&lt;/P&gt;</description>
      <pubDate>Wed, 16 Jan 2019 09:04:31 GMT</pubDate>
      <guid>https://community.developer.cybersource.com/t5/Integration-and-Testing/Working-php-hash-verification/m-p/65781#M39397</guid>
      <dc:creator>Vikas_chauhan</dc:creator>
      <dc:date>2019-01-16T09:04:31Z</dc:date>
    </item>
    <item>
      <title>Re: Working php hash verification</title>
      <link>https://community.developer.cybersource.com/t5/Integration-and-Testing/Working-php-hash-verification/m-p/65784#M39399</link>
      <description>&lt;P&gt;Renaissance, that's a good start at the problem!&amp;nbsp; However, some questions remain.&lt;BR /&gt;&lt;BR /&gt;ISSUE #1&lt;BR /&gt;========&lt;BR /&gt;Authorize.Net's "Transaction Hash Upgrade Guide" (hereinafter, the Guide) makes no mention whatsoever of the fact that for MD5, Authorize.Net required TWO different methods for creating $string...&lt;BR /&gt;1) Generally, e.g. for SIM, one would use $string = $md5SecretText . $login . $transId . $amount;&lt;BR /&gt;2) However, for silent post / recurring billing, $string = $md5SecretText . $transId . $amount;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;One could then obtain md5($string) and use one's favorite built-in PHP string comparison function to test if one's calculated md5 hash matches the x_md5_hash string allegedly sent from Authorize.Net.&amp;nbsp; The calculated md5 hashes (whether it's the one calculated by the merchant or the one sent by Authorize.net) both appear to be lower case hexadecimal strings.&lt;BR /&gt;&lt;BR /&gt;For SHA512, I would guess that your post, in which you used&lt;BR /&gt;$string = '^'.$login.'^'.$transId.'^'.$amount.'^';&lt;BR /&gt;would cover case #1 above when transitioning to SHA512.&amp;nbsp; But I don't think you've tested it for case #2 (recurring billing).&amp;nbsp; Does it also work for case #2?&amp;nbsp; If so, Authorize.net should announce and confirm that they've changed more than just MD5 to SHA512 by requiring that $login be included in $string when verifying recurring billings.&lt;BR /&gt;&lt;BR /&gt;ISSUE #2&lt;BR /&gt;========&lt;BR /&gt;Meanwhile, Authorize.net uses still another method for generating $string for fingerprints...&lt;BR /&gt;3) $string = $login . '^' . $sequence . '^' . $timeStamp . '^' . $amount . '^';&lt;BR /&gt;With SHA512, that stays the same when generating the $string for fingerprints.&lt;BR /&gt;And previously, with MD5, one could then generate the SIM fingerprint...&lt;BR /&gt;$fingerprint = HASH_HMAC('md5',$string,$transactionKey);&lt;BR /&gt;Now, with SHA512...&lt;BR /&gt;$fingerprint = HASH_HMAC('sha512',$string,$signatureKey);&lt;BR /&gt;It might look like simply changing "md5" to "sha512" and "$transactionKey" to "$signatureKey", but there's another difference...&lt;BR /&gt;And as we've been told, the "$signatureKey = hex2bin($signatureKey);" line of code is needed for SHA512, but a comparable line of code is not needed for the MD5 version.&lt;BR /&gt;&lt;BR /&gt;Your solution does not include the changes required to upgrade the fingerprints from MD5 to SHA512.&amp;nbsp; I'm not sure that you intended to include that.&amp;nbsp; There is a post on upgrading fingerprints at &lt;A href="https://support.authorize.net/s/article/Do-I-need-to-upgrade-my-transaction-fingerprint-from-HMAC-MD5-to-HMAC-SHA512-and-how" target="_blank"&gt;https://support.authorize.net/s/article/Do-I-need-to-upgrade-my-transaction-fingerprint-from-HMAC-MD5-to-HMAC-SHA512-and-how&lt;/A&gt;&lt;BR /&gt;&lt;BR /&gt;ISSUE #3&lt;BR /&gt;========&lt;BR /&gt;Apparently Authorize.Net has not updated their documentation to disclose where the SHA512 hash is positioned within the character delimited transaction response string.&amp;nbsp; For example, if the MD5 hash is being returned in the 38th element of the character delimited response, what is the position of the SHA512 hash?&lt;/P&gt;</description>
      <pubDate>Wed, 16 Jan 2019 10:32:28 GMT</pubDate>
      <guid>https://community.developer.cybersource.com/t5/Integration-and-Testing/Working-php-hash-verification/m-p/65784#M39399</guid>
      <dc:creator>karenb</dc:creator>
      <dc:date>2019-01-16T10:32:28Z</dc:date>
    </item>
    <item>
      <title>Re: Working php hash verification</title>
      <link>https://community.developer.cybersource.com/t5/Integration-and-Testing/Working-php-hash-verification/m-p/65785#M39400</link>
      <description>&lt;P&gt;Still more issues...&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;ISSUE #4&lt;/P&gt;&lt;P&gt;=======&lt;/P&gt;&lt;P&gt;After the Signature Key has been created, the SHA512 hash is supposed to be sent to the merchant (along with the legacy MD5 hash for the time being) for each transaction.&amp;nbsp; And that's normally true.&amp;nbsp; However, it's not true for recurring billings.&amp;nbsp; For example, when a recurring billing was declined, Authorize.Net included only the MD5 hash.&amp;nbsp; The SHA512 hash element from Authorize.Net was empty.&amp;nbsp; Authorize.Net needs to correct its system to include the SHA512 hash with recurring billings.&lt;/P&gt;</description>
      <pubDate>Wed, 16 Jan 2019 10:55:09 GMT</pubDate>
      <guid>https://community.developer.cybersource.com/t5/Integration-and-Testing/Working-php-hash-verification/m-p/65785#M39400</guid>
      <dc:creator>karenb</dc:creator>
      <dc:date>2019-01-16T10:55:09Z</dc:date>
    </item>
    <item>
      <title>Re: Working php hash verification</title>
      <link>https://community.developer.cybersource.com/t5/Integration-and-Testing/Working-php-hash-verification/m-p/65791#M39406</link>
      <description>&lt;P&gt;Do you have the hash being sent in the transaction? Before I would pull the&amp;nbsp;&lt;STRONG&gt;x_MD5_Hash &lt;/STRONG&gt;parameter from the response, hash&amp;nbsp;the string on my end and compare.&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Now I'm pulling&amp;nbsp;&lt;STRONG&gt;transHashSha2&lt;/STRONG&gt; parameter from the response but it says null. Is this the same parameter you are pulling from the request or is it something else? Their API is crap in explaining this.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;I already generated my Signature Key.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Edit: I found the parameter that I need to pull from the response. It is:&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;&lt;STRONG&gt;&lt;FONT size="7"&gt;x_SHA2_Hash&lt;/FONT&gt;&lt;/STRONG&gt;&lt;BR /&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;FONT size="3"&gt;Which is NO WHERE in their API or their schema. I had to query the parameters in the response myself. Why? Why? Why?&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;&lt;U&gt;&lt;STRONG&gt;&lt;FONT size="7"&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/U&gt;&lt;/SPAN&gt;&lt;/P&gt;</description>
      <pubDate>Wed, 16 Jan 2019 16:21:58 GMT</pubDate>
      <guid>https://community.developer.cybersource.com/t5/Integration-and-Testing/Working-php-hash-verification/m-p/65791#M39406</guid>
      <dc:creator>lightwave365</dc:creator>
      <dc:date>2019-01-16T16:21:58Z</dc:date>
    </item>
    <item>
      <title>Re: Working php hash verification</title>
      <link>https://community.developer.cybersource.com/t5/Integration-and-Testing/Working-php-hash-verification/m-p/65792#M39407</link>
      <description>&lt;P&gt;I am using following format for HASH_HMAC using sha512&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;$string = '^'.$login.'^'.$transId.'^'.$amount.'^';&lt;/P&gt;&lt;P&gt;I am getting&amp;nbsp;&lt;STRONG&gt;x_MD5_Hash&amp;nbsp;&lt;/STRONG&gt;but it is not generating the equal hash value;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Please help me out&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Wed, 16 Jan 2019 16:17:40 GMT</pubDate>
      <guid>https://community.developer.cybersource.com/t5/Integration-and-Testing/Working-php-hash-verification/m-p/65792#M39407</guid>
      <dc:creator>Vikas_chauhan</dc:creator>
      <dc:date>2019-01-16T16:17:40Z</dc:date>
    </item>
    <item>
      <title>Re: Working php hash verification</title>
      <link>https://community.developer.cybersource.com/t5/Integration-and-Testing/Working-php-hash-verification/m-p/65793#M39408</link>
      <description>&lt;P&gt;I found the parameter that I need to pull from the response. It is:&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;&lt;STRONG&gt;&lt;FONT size="7"&gt;x_SHA2_Hash&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;FONT size="3"&gt;My values don't match either but at least I have a damn value to compare against now.&lt;/FONT&gt;&lt;/P&gt;</description>
      <pubDate>Wed, 16 Jan 2019 16:23:15 GMT</pubDate>
      <guid>https://community.developer.cybersource.com/t5/Integration-and-Testing/Working-php-hash-verification/m-p/65793#M39408</guid>
      <dc:creator>lightwave365</dc:creator>
      <dc:date>2019-01-16T16:23:15Z</dc:date>
    </item>
    <item>
      <title>Re: Working php hash verification</title>
      <link>https://community.developer.cybersource.com/t5/Integration-and-Testing/Working-php-hash-verification/m-p/65799#M39414</link>
      <description>Karen,&lt;BR /&gt;&lt;BR /&gt;One at a time. The updating fingerprints is done simply by generating the signature key. Auth.net hashes the using the signature key on their end and you hash using it on your end. I just got up and am about to go get breakfast, when I’ll get there I’ll address more concerns.&lt;BR /&gt;&lt;BR /&gt;And the link you posted explains why so many others were using different arguments in their hash function. For recurring billing, are you referring to the initial transaction that is created? I would imagine so.</description>
      <pubDate>Wed, 16 Jan 2019 16:58:42 GMT</pubDate>
      <guid>https://community.developer.cybersource.com/t5/Integration-and-Testing/Working-php-hash-verification/m-p/65799#M39414</guid>
      <dc:creator>Renaissance</dc:creator>
      <dc:date>2019-01-16T16:58:42Z</dc:date>
    </item>
    <item>
      <title>Re: Working php hash verification</title>
      <link>https://community.developer.cybersource.com/t5/Integration-and-Testing/Working-php-hash-verification/m-p/65800#M39415</link>
      <description>So again the trend is that everyone posting about this is using deprecated methods.&lt;BR /&gt;&lt;BR /&gt;Per the link from Karen, the fingerprint is generated like this-&lt;BR /&gt;&lt;BR /&gt;The construction of the HMAC-SHA512 hash is similar to the HMAC-MD5 hash. In particular, the input to be hashed is built from these values, in order, and separated by carets ("^"):&lt;BR /&gt;The API Login ID (x_login);&lt;BR /&gt;The unique merchant-generated sequence number (x_fp_sequence);&lt;BR /&gt;The transaction's timestamp in UNIX Epoch time, i.e. how many seconds have passed since Midnight UTC on January 1, 1970 (x_fp_timestamp);&lt;BR /&gt;The transaction amount (x_amount);&lt;BR /&gt;The currency code (x_currency_code), which should be blank if no currency code is submitted.&lt;BR /&gt;For example, if we presume an API Login ID of "authnettest", a sequence number of "789", a timestamp of "67897654," an amount of "10.50", and no currency code, the hash input would look like this:&lt;BR /&gt;authnettest^789^67897654^10.50^&lt;BR /&gt;&lt;BR /&gt;If a currency code of "USD" were submitted, the hash input would look like this:&lt;BR /&gt;&lt;BR /&gt;authnettest^789^67897654^10.50^USD&lt;BR /&gt;&lt;BR /&gt;You would then hash this input with the HMAC-SHA512 algorithm, using the binary-encoded Signature Key as the HMAC key.&lt;BR /&gt;&lt;BR /&gt;The resulting hash should be submitted to us as x_fp_hash, just as you do with the HMAC-MD5 hash. We will know which hashing algorithm you used, by the size of the value for x_fp_hash&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;So you sumbit your hash under x_fp_hash in your request it appears.&lt;BR /&gt;&lt;BR /&gt;RE: MD5 hash, the whole point of this is that you don’t use the MD5 value. Use the value lightwave posted.&lt;BR /&gt;&lt;BR /&gt;My pancakes just got here.. I’ll put some more info up while I’m waiting on my check if I have time. It looks like the SIM, etc method has some quirks. Stay tuned for tomorrow’s breakfast or tonight’s dinner. I’ll look at the link provided by Karen and see what the docs about the deprecated methods say and see if I can help you out.&lt;BR /&gt;&lt;BR /&gt;</description>
      <pubDate>Wed, 16 Jan 2019 17:42:08 GMT</pubDate>
      <guid>https://community.developer.cybersource.com/t5/Integration-and-Testing/Working-php-hash-verification/m-p/65800#M39415</guid>
      <dc:creator>Renaissance</dc:creator>
      <dc:date>2019-01-16T17:42:08Z</dc:date>
    </item>
    <item>
      <title>Re: Working php hash verification</title>
      <link>https://community.developer.cybersource.com/t5/Integration-and-Testing/Working-php-hash-verification/m-p/65802#M39417</link>
      <description>&lt;P&gt;If someone will stack w/ generating verification of "&lt;SPAN&gt;x_SHA2_Hash"&lt;/SPAN&gt;&amp;nbsp;on "x_relay_url"...&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;According to this PDF:&amp;nbsp;&lt;A href="https://www.authorize.net/content/dam/authorize/documents/SIM_guide.pdf" target="_blank"&gt;https://www.authorize.net/content/dam/authorize/documents/SIM_guide.pdf&lt;/A&gt; page 73, working code will be like this&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;PRE&gt;&amp;lt;?php

$signatureKey = '128-bit-length-key-generated-in-account';

$requiredHash = $_POST['x_SHA2_Hash'];

$hashData = implode('^', [
    $_POST['x_trans_id'],
    $_POST['x_test_request'],
    $_POST['x_response_code'],
    $_POST['x_auth_code'],
    $_POST['x_cvv2_resp_code'],
    $_POST['x_cavv_response'],
    $_POST['x_avs_code'],
    $_POST['x_method'],
    $_POST['x_account_number'],
    $_POST['x_amount'],
    $_POST['x_company'],
    $_POST['x_first_name'],
    $_POST['x_last_name'],
    $_POST['x_address'],
    $_POST['x_city'],
    $_POST['x_state'],
    $_POST['x_zip'],
    $_POST['x_country'],
    $_POST['x_phone'],
    $_POST['x_fax'],
    $_POST['x_email'],
    $_POST['x_ship_to_company'],
    $_POST['x_ship_to_first_name'],
    $_POST['x_ship_to_last_name'],
    $_POST['x_ship_to_address'],
    $_POST['x_ship_to_city'],
    $_POST['x_ship_to_state'],
    $_POST['x_ship_to_zip'],
    $_POST['x_ship_to_country'],
    $_POST['x_invoice_num'],
]);

$hash = hash_hmac('sha512', $hashData, pack('H*', $signatureKey)); // If you running on &amp;gt;=PHP5.4 you can use "hex2bin" function instead of "pack" 
$hash = strtoupper($hash);

if (method_exists('hash_equals')) {
    $equals = hash_equals($requiredHash, $hash)
} else {
   $equals = $requiredHash === $hash;
}

var_dump($equals);&lt;/PRE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;P.S. Dear authorize.net...Burn in hell with such updates and docs.&lt;/P&gt;&lt;P&gt;P.P.S Nice idea give ability to write comment and then on submit require to sign up&lt;/P&gt;</description>
      <pubDate>Wed, 16 Jan 2019 18:12:41 GMT</pubDate>
      <guid>https://community.developer.cybersource.com/t5/Integration-and-Testing/Working-php-hash-verification/m-p/65802#M39417</guid>
      <dc:creator>pudhgdfhgdf</dc:creator>
      <dc:date>2019-01-16T18:12:41Z</dc:date>
    </item>
    <item>
      <title>Re: Working php hash verification</title>
      <link>https://community.developer.cybersource.com/t5/Integration-and-Testing/Working-php-hash-verification/m-p/65803#M39418</link>
      <description>&lt;P&gt;Lightwave365, in answer to your question, "Do you have the hash being sent in the transaction?"&amp;nbsp; Authorize.Net is sending both x_MD5_Hash and x_SHA2_Hash as non-null values EXCEPT when a recurring billing is declined and then only x_MD5_Hash is non-null and x_SHA2_Hash is null, which appears to be a defect in Authorize.Net's system.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Renaissance, in regard to "The updating fingerprints is done simply by generating the signature key," the update requires that the transaction key no longer be used, that a binary version of the signature key be used instead, and to use the alternate hash (SHA512 instead of MD5).&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Wed, 16 Jan 2019 18:17:54 GMT</pubDate>
      <guid>https://community.developer.cybersource.com/t5/Integration-and-Testing/Working-php-hash-verification/m-p/65803#M39418</guid>
      <dc:creator>karenb</dc:creator>
      <dc:date>2019-01-16T18:17:54Z</dc:date>
    </item>
    <item>
      <title>Re: Working php hash verification</title>
      <link>https://community.developer.cybersource.com/t5/Integration-and-Testing/Working-php-hash-verification/m-p/65808#M39423</link>
      <description>&lt;P&gt;Have you tested this with a sandbox account? Where the transaction id is returned as 0? I have essentially the same code, but my hash values do not match what authorize.net is returning.&lt;/P&gt;</description>
      <pubDate>Wed, 16 Jan 2019 19:34:07 GMT</pubDate>
      <guid>https://community.developer.cybersource.com/t5/Integration-and-Testing/Working-php-hash-verification/m-p/65808#M39423</guid>
      <dc:creator>Alicia05</dc:creator>
      <dc:date>2019-01-16T19:34:07Z</dc:date>
    </item>
    <item>
      <title>Re: Working php hash verification</title>
      <link>https://community.developer.cybersource.com/t5/Integration-and-Testing/Working-php-hash-verification/m-p/65822#M39436</link>
      <description>Yes,&lt;BR /&gt;&lt;BR /&gt;I do all my testing on a sandbox. You shouldn’t be getting a transaction id of 0. You have a separate issue. Sandbox transactions will give you a transaction id.&lt;BR /&gt;&lt;BR /&gt;What integration method are you using? If you’re using SIM or other deprecated methods then that may be the case. On my sandbox I have tested Accept Hosted transactions (which use webhooks to communicate responses), as well as manual API calls using the SDK for capturing, charging, refunding, voiding transactions, etc.. Each of those will generate a transaction id.&lt;BR /&gt;&lt;BR /&gt;If you’re using the deprecated methods the exact script will not work in any case. Your string is different. I’ve got some code that should work or at the very least get people much closer for those methods. Will post that in a little.</description>
      <pubDate>Wed, 16 Jan 2019 22:46:25 GMT</pubDate>
      <guid>https://community.developer.cybersource.com/t5/Integration-and-Testing/Working-php-hash-verification/m-p/65822#M39436</guid>
      <dc:creator>Renaissance</dc:creator>
      <dc:date>2019-01-16T22:46:25Z</dc:date>
    </item>
    <item>
      <title>Re: Working php hash verification</title>
      <link>https://community.developer.cybersource.com/t5/Integration-and-Testing/Working-php-hash-verification/m-p/65823#M39437</link>
      <description>&lt;P&gt;Here we go. First, a little housecleaning:&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;OL&gt;&lt;LI&gt;For the past week or 2, this forum has been hopping with developers in panic mode, seemingly under the impression that they have been seized upon, out of pitch darkness and without notice, by a new and mysterious signature signing method that has a million quirks to be worked out and doesn’t work, and also isn’t documented anywhere. About 95% are posting about SIM/DPM. This is a sort of new thing for the 5% on API based integrations, but for the remainder, when I looked this up the process for how to do this has been in place and recommended since at least September of 2017 in the below document.&lt;/LI&gt;&lt;/OL&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;A href="&amp;nbsp;&amp;nbsp;https://www.authorize.net/content/dam/authorize/documents/SIM_guide.pdf" target="_self"&gt;&amp;nbsp;&amp;nbsp;https://www.authorize.net/content/dam/authorize/documents/SIM_guide.pdf&lt;/A&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; It is advisable to review your documentation on a more regular basis than once&lt;/P&gt;&lt;P&gt;every few years in my books. And when your docs say “we use recommend and use abc security method. xyz method is also supported but we don’t recommend it”, that’s a good heads up that down the road xyz method is going to be axed. The way technology works is it is always changing. What is secure today won’t be as secure 1 year from now, and eventually it won’t be secure at all. When new methods are introduced it’s not for no purpose at all. It’s not fun and not life’s main attraction, but it kind of comes with the territory.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;2. I now realize why so many people with those methods are posting. This is required to submit your transactions, and seems to function the same way the token functions for Accept Hosted. The token is far easier than this. People are posting that they cannot upgrade to the API based integrations now, but this may be a good reminder to do that when you can. You may otherwise continually find yourself having to do things the hard way or not being able to do things at all that those using the current integration methods do easily.&lt;/P&gt;&lt;P&gt;Now that that’s out of the way, let me see if I can help my good friends here.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;a href="https://community.developer.cybersource.com/t5/user/viewprofilepage/user-id/1860"&gt;@karenb&lt;/a&gt;&amp;nbsp;the signature key is totally different than the transaction key, in case you’re not clear on that. You have 3 API credentials, the login id, transaction key, and signature key. Everything you’ve ever done likely requires the first 2, but to this point you may have never had to use the SK. So in the code below you will generate a signature key to use.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;For recurring billing, I looked at the webpage on that and it says to use webhooks.&amp;nbsp; Am I correct that all recurring billing transactions are manually submitted?&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;a href="https://community.developer.cybersource.com/t5/user/viewprofilepage/user-id/23072"&gt;@Vikas_chauhan&lt;/a&gt;&amp;nbsp;see the code below. Looks like the transaction key plays no role in your product either.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Here is the code for SIM/DPM. I haven’t tested it at all, but I believe it should work or get you almost completely there.&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;PRE&gt;date_default_timezone_set('UTC');
//^may not be necessary depending on your configuration

$login = "copy and paste your login here";
$signatureKey = "copy and paste your signature key here";
$signatureKey = hex2bin($signatureKey);

$amount = $amount;
//this assumes you have previously assigned the transaction 
//amount to a variable called $amount in your script

$sequence = "make up a number and paste it here."; 
//save whatever number you use for validation on your end.
//example in your docs uses 3 digit numbers

$timeStamp = strtotime("now");

$currency = "USD";
//looks like that you only use this 
//if you specify currency type in your form request
//you can use another value if you do things in a different currency

//use one of the two strings below. 

$string = "^$login^$sequence^$timeStamp^$amount^";
//the above seems to be what you use if you don't submit
//x_currency_code in your request

$string2 = "^$login^$sequence^$timeStamp^$amount^$currency";
//looks like you use this if you specify currency

$digest = strtoupper(HASH_HMAC('sha512',$string,$signatureKey));
//Looks like this value is submitted in your request under "x_fp_hash" 
//Look in the SIM/DPM developer guide on for what "x_" to to use for $sequence, etc.
//page 29. Test this without the strtoupper fuction as well 

//All of the above are what is submitted in your request. You can 
//use the first code I posted to validate the response in SIM/DPM
//you would retrieve the value lightwave posted x_sha2_hash instead
//of what I posted and you change your $string input to match this 
//(the string and value from my orignal post are for php API based integrations)&lt;/PRE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Wed, 16 Jan 2019 23:56:27 GMT</pubDate>
      <guid>https://community.developer.cybersource.com/t5/Integration-and-Testing/Working-php-hash-verification/m-p/65823#M39437</guid>
      <dc:creator>Renaissance</dc:creator>
      <dc:date>2019-01-16T23:56:27Z</dc:date>
    </item>
    <item>
      <title>Re: Working php hash verification</title>
      <link>https://community.developer.cybersource.com/t5/Integration-and-Testing/Working-php-hash-verification/m-p/65824#M39438</link>
      <description>&lt;P&gt;^edit to the above. Looks like your verification procress requires a hash of 5 or more values from the request.&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;So what I posted will create your signature to send with the transaction, and then you will verify based on the values and instructions on page 73 of the guide I linked. I won't lose any sleep over not having to perform these acrobatics with my integration. There may be no choir to preach to on this thread, but accept hosted and the recent API based solutions are so much easier than this.&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Thu, 17 Jan 2019 00:21:27 GMT</pubDate>
      <guid>https://community.developer.cybersource.com/t5/Integration-and-Testing/Working-php-hash-verification/m-p/65824#M39438</guid>
      <dc:creator>Renaissance</dc:creator>
      <dc:date>2019-01-17T00:21:27Z</dc:date>
    </item>
    <item>
      <title>Re: Working php hash verification</title>
      <link>https://community.developer.cybersource.com/t5/Integration-and-Testing/Working-php-hash-verification/m-p/65828#M39442</link>
      <description>&lt;a href="https://community.developer.cybersource.com/t5/user/viewprofilepage/user-id/1860"&gt;@karenb&lt;/a&gt;,&lt;BR /&gt;&lt;BR /&gt;To answer your question about recurring billing a little more, those use webhooks. For that string you would use your signature key as the key, without any modification. You would hash the webhooks payload that hits your endpoint in place of “$string” in the code I posted, and you would use a header that is sent along with the payload called X-Anet in place of $hash in my code.&lt;BR /&gt;&lt;BR /&gt;Regarding silent post, I am not sure that I would be relying on that for anything at this point. I’m not the one to say, but it looks like that has vanished totally from the website. Another user was posting about that. And I am almost certain that I recall reading something about it being marked for upcoming deprecation when I started my first project in mid 2017. So that product may now be so unsupported and disregarded that you can’t safely rely on it.&lt;BR /&gt;&lt;BR /&gt;Clients are like the rest of us in that they don’t like to spend money, but with things like this it is unavoidable. The lesson I am learning as a new developer watching this fiasco unfold is that I need to stay on top of the documentation as much as possible, and when new features come out advise my clients that they should go ahead and have them implemented, at least for security related measures.&lt;BR /&gt;&lt;BR /&gt;If I were any one of the developers on here who are supporting customers with deprecated products I would be making the case to move to the current products like Accept Hosted. If I had several of them I’d offer some kind of “upgrade your API” special that had a time window, and it would be economical for both sides because you’d be doing something very similar on each site. It may take some time to come up with the code, but on each one there would be more and more that is reusable for the next ones, “spreading the overhead” in a digital sense.&lt;BR /&gt;&lt;BR /&gt;I know not much about hashing, encryption, etc. but I know enough to know that MD5 is useless at this point. If you have a site that has MD5 hashed passwords and someone gets ahold of your database, those passwords might as well be plain text in most cases.&lt;BR /&gt;&lt;BR /&gt;And be prepared for the day when sha512 is obsolete, and 2048 bit RSA encryption, etc. it may be 2 years from now or 10 or 20, but these types of changes will be recurring. It’s an arms race between the computing power of technology and the strength of the encryption/hashing techniques and it will likely go on for longer than I have to live.</description>
      <pubDate>Thu, 17 Jan 2019 04:46:13 GMT</pubDate>
      <guid>https://community.developer.cybersource.com/t5/Integration-and-Testing/Working-php-hash-verification/m-p/65828#M39442</guid>
      <dc:creator>Renaissance</dc:creator>
      <dc:date>2019-01-17T04:46:13Z</dc:date>
    </item>
    <item>
      <title>Re: Working php hash verification</title>
      <link>https://community.developer.cybersource.com/t5/Integration-and-Testing/Working-php-hash-verification/m-p/65830#M39444</link>
      <description>&lt;P&gt;Renaissance, as far as I can tell, there has yet been no end of life announcement from Authorize.Net regarding Silent Post, Automatic Recurring Billing or SIM.&amp;nbsp; The use of webhooks as an alternative is merely "suggested" by Authorize.Net, not required at this time.&amp;nbsp; Silent Post still works today as it has in the past, and should continue to function after the hash upgrade as well, until some future as yet unannounced date when its end of life arrives.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Regarding "Am I correct that all recurring billing transactions are manually submitted?", yes and no.&amp;nbsp; Subscriptions can be entered manually, but the recurring billings that flow from the subscription occur automatically.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Regarding "when I looked this up the process for how to do this has been in place and recommended since at least September of 2017 in the below document," that's not accurate.&amp;nbsp; Authorize.Net's recently published Transaction Hash Upgrade Guide does not agree with that SIM guide.&amp;nbsp; For example, the September 2017 SIM Guide says "A hash will always incorporate at least 31 caret (^) characters, even if only 5 fields are provided" while the Transaction Hash Upgrade Guide says that a hash can incorporate as few as 4 caret (^) characters.&lt;/P&gt;</description>
      <pubDate>Thu, 17 Jan 2019 07:17:09 GMT</pubDate>
      <guid>https://community.developer.cybersource.com/t5/Integration-and-Testing/Working-php-hash-verification/m-p/65830#M39444</guid>
      <dc:creator>karenb</dc:creator>
      <dc:date>2019-01-17T07:17:09Z</dc:date>
    </item>
    <item>
      <title>Re: Working php hash verification</title>
      <link>https://community.developer.cybersource.com/t5/Integration-and-Testing/Working-php-hash-verification/m-p/65831#M39445</link>
      <description>&lt;a href="https://community.developer.cybersource.com/t5/user/viewprofilepage/user-id/1860"&gt;@karenb&lt;/a&gt;, I had to read that one twice. It got me as well. The difference is that you use one thing for your fingerprint to validate the transaction on submission and another to validate the receipt.&lt;BR /&gt;&lt;BR /&gt;From what it looks like to me, you use the string of 4 values for the fingerprint to verify, and the string with 5+ values + 31 carets to validate ok your end. In my view the validation on your end probably isn’t as important. That’s what got me about the whole thing. I make api calls for all the backend stuff, and it seems like the chances of the response coming from someone other than authorize is pretty remote. For webhooks it is different because anyone that wants to can send stuff to my endpoint anytime they want. But I would still do it. For silent post I would say it is important, and you’re right. There is no end of life stated although it has been marked deprecated for a very long time. I searched in the support center and there is no mention of silent post having sha512, so to continue to use that product you would have yet another hash to keep up with. Looks like you’d keep MD5 for that, use one sha512 hash for your SIM fingerprint, and sha512 hash for your verification, and yet a third sha512 hash for webhooks and recurring billing. You say that you get a hash in the response, I don’t know if you mean the silent post response or the manual API call response, but when I look at the reference there is no mention of a hash in the response. The pattern I have noticed in looking at the existing api documentation is that every response that is documented as having the MD5 “transHash” will also now contain the sha512 hash, and those that don’t mention transHash will not. My guess is that if you’re using one of the older methods to do ARB and not using webhooks the you’ll be using the non-null hash you mentioned earlier, although at this point I cannot remember which it was (if I guess I’ve got an 1 in 15 chance of getting it right at this point, right ?).&lt;BR /&gt;&lt;BR /&gt;If I remember right you are the business owner and not the developer from your earlier post. It may be well worth it to talk to your developer about upgrading your integration as soon as is practical at all. After researching this process today it is like tying yourself in a knot while walking on a tightrope compared to the process I use with my stuff. I got thrown off by the link to the C# function and it cost me about 3 or 4 hours of time, but once I abandoned that it was about 10 minutes to get it working. It was also about 10 minutes to get the webhooks verification working. I do no such acrobatics in the Hosted form call. I’ve touted the products I use to the point that I think I can probably let up now, but to me it seems well worth it. The immediate issue I see with the verification on your end with SIM is that if all of those values aren’t submitted in the request, you’re going to have to account for that on your server side. So it is possible that you will have a different hash string for different customers. One may have 10 values and one may have 7, or 5, etc. That’s just a first glance look and might be wrong. People will be finding out shortly I am sure.</description>
      <pubDate>Thu, 17 Jan 2019 08:01:44 GMT</pubDate>
      <guid>https://community.developer.cybersource.com/t5/Integration-and-Testing/Working-php-hash-verification/m-p/65831#M39445</guid>
      <dc:creator>Renaissance</dc:creator>
      <dc:date>2019-01-17T08:01:44Z</dc:date>
    </item>
    <item>
      <title>Re: Working php hash verification</title>
      <link>https://community.developer.cybersource.com/t5/Integration-and-Testing/Working-php-hash-verification/m-p/65832#M39446</link>
      <description>&lt;P&gt;&lt;a href="https://community.developer.cybersource.com/t5/user/viewprofilepage/user-id/28143"&gt;@pudhgdfhgdf&lt;/a&gt;Thank you for the relay snippet, it's almost there, but not working as is. The $hashData variable must be enclosed in carets as well, not just imploded.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;The following code works for me on sandbox (PHP 7):&lt;/P&gt;&lt;PRE&gt;$signatureKey = 'YOUR-SIGNATURE-KEY-128-CHARS';
$fields = [
    $_POST['x_trans_id'] ?? '',
    $_POST['x_test_request'] ?? '',
    $_POST['x_response_code'] ?? '',
    $_POST['x_auth_code'] ?? '',
    $_POST['x_cvv2_resp_code'] ?? '',
    $_POST['x_cavv_response'] ?? '',
    $_POST['x_avs_code'] ?? '',
    $_POST['x_method'] ?? '',
    $_POST['x_account_number'] ?? '',
    $_POST['x_amount'] ?? '',
    $_POST['x_company'] ?? '',
    $_POST['x_first_name'] ?? '',
    $_POST['x_last_name'] ?? '',
    $_POST['x_address'] ?? '',
    $_POST['x_city'] ?? '',
    $_POST['x_state'] ?? '',
    $_POST['x_zip'] ?? '',
    $_POST['x_country'] ?? '',
    $_POST['x_phone'] ?? '',
    $_POST['x_fax'] ?? '',
    $_POST['x_email'] ?? '',
    $_POST['x_ship_to_company'] ?? '',
    $_POST['x_ship_to_first_name'] ?? '',
    $_POST['x_ship_to_last_name'] ?? '',
    $_POST['x_ship_to_address'] ?? '',
    $_POST['x_ship_to_city'] ?? '',
    $_POST['x_ship_to_state'] ?? '',
    $_POST['x_ship_to_zip'] ?? '',
    $_POST['x_ship_to_country'] ?? '',
    $_POST['x_invoice_num'] ?? '',
];

$hash = strtoupper(
    hash_hmac(
        'sha512',
        '^' . implode('^', $fields) . '^',
        hex2bin($signatureKey)
    )
);

var_dump(hash_equals($hash, $_POST['x_SHA2_Hash'] ?? ''));&lt;/PRE&gt;</description>
      <pubDate>Thu, 17 Jan 2019 10:07:46 GMT</pubDate>
      <guid>https://community.developer.cybersource.com/t5/Integration-and-Testing/Working-php-hash-verification/m-p/65832#M39446</guid>
      <dc:creator>keksa</dc:creator>
      <dc:date>2019-01-17T10:07:46Z</dc:date>
    </item>
    <item>
      <title>Re: Working php hash verification</title>
      <link>https://community.developer.cybersource.com/t5/Integration-and-Testing/Working-php-hash-verification/m-p/65833#M39447</link>
      <description>&lt;P&gt;Renaissance, you say "The difference is that you use one thing for your fingerprint to validate the transaction on submission and another to validate the receipt," but I'm not sure to what you're referring, as my most recent post was not discussing fingerprints, only the verification after information is received from Authorize.Net.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;You say you "searched in the support center and there is no mention of silent post having sha512, so to continue to use that product you would have yet another hash to keep up with," but for me, the evidence does not fully support that conclusion.&amp;nbsp; For example, the Transaction Hash Upgrade Guide clearly applies to MD5 transaction hashes, and it is a fact that Authorize.Net is sending a MD5 transaction hash to the Silent Post program, and there is nothing in the Transaction Hash Upgrade Guide saying that the upgrade does not apply to all MD5 transaction hashes including that provided to the Silent Post program.&amp;nbsp; But it's possible, because Authorize.Net is not strong on its documentation, to put it mildly.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;You say "I don’t know if you mean the silent post response or the manual API call response," but there is no "manual API call" involved and thus no "manual API call response".&amp;nbsp; That someone might manually enter subscriptions into the Merchant interface does not activate the Silent Post program.&amp;nbsp; The Silent Post program is only activated after a payment transaction has been processed.&amp;nbsp; And that too needs verification like every other payment transaction.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;You say "when I look at the reference there is no mention of a hash in the response," but perhaps you are not looking at the correct response reference, which is the response to the (automatic) payment transaction, not responses to creating and managing subscriptions.&amp;nbsp; It's a payment transaction response, almost identical to the payment transaction response sent after a customer manually makes a payment.&amp;nbsp; But the hash is calculated differently for Silent Post than for a customer's manual payment.&amp;nbsp; For a customer's manual payment, the string used to calculate the MD5 hash includes the &lt;SPAN class="test-id__field-value slds-form-element__static slds-grow  is-read-only"&gt;API Login ID, but for a Silent Post, it does not.&lt;BR /&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;SPAN class="test-id__field-value slds-form-element__static slds-grow  is-read-only"&gt;In regard to "My guess is that if you’re using one of the older methods to do ARB and not using webhooks," yes, I've been talking about the Silent Post method for handling the transaction responses for recurring billing, not webhooks.&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;SPAN class="test-id__field-value slds-form-element__static slds-grow  is-read-only"&gt;In regard to "if all of those values aren’t submitted in the request," that raises the other issue... the Transaction Hash Upgrade Guide and SIM Guide are inconsistent with one another.&amp;nbsp; The former claims a string of just 4 or 5 carets is correct while the latter insists there must be a minimum of 32 carets in the string.&lt;/SPAN&gt;&lt;/P&gt;</description>
      <pubDate>Thu, 17 Jan 2019 10:48:05 GMT</pubDate>
      <guid>https://community.developer.cybersource.com/t5/Integration-and-Testing/Working-php-hash-verification/m-p/65833#M39447</guid>
      <dc:creator>karenb</dc:creator>
      <dc:date>2019-01-17T10:48:05Z</dc:date>
    </item>
  </channel>
</rss>

