On March 4th, 2017 new Enhanced Customer Profile Reporting, was announced with declaration:
The GetTransactionList, GetUnsettledTransactionList and GetTransactionDetails APIs will now return the customer profile and payment profile IDs used to create a transaction.
Documentation was updated, but this features seem not to be implemented. Also there are some other discrepancy in documentation and real API response.
Important: <profile/> field is not presented in <transaction/>.
More: <marketType/> field described in documentation as a digit from 0 to 2, which stands for eCommerce, MOTO or retail accordingly. But in response this field presented as a string value, e.g. <marketType>eCommerce<marketType/> instead of <marketType>0<marketType/>.
Here is a listing from the 'Try it' block (some data was masked as XXXX):
Request:
<getTransactionListRequest xmlns="AnetApi/xml/v1/schema/AnetApiSchema.xsd"> <merchantAuthentication> <name><![CDATA[XXXX]]></name> <transactionKey>XXXX</transactionKey> </merchantAuthentication> <clientId><![CDATA[sdk-php-1.9.3]]></clientId> <refId><![CDATA[ref_591d75e507fcb]]></refId> <batchId><![CDATA[7125336]]></batchId> <paging> <limit>1000</limit> <offset>1</offset> </paging> </getTransactionListRequest>
Response:
<?xml version="1.0" encoding="utf-8"?> <getTransactionListResponse xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="AnetApi/xml/v1/schema/AnetApiSchema.xsd"> <refId>ref_591d75e507fcb</refId> <messages> <resultCode>Ok</resultCode> <message> <code>I00001</code> <text>Successful.</text> </message> </messages> <transactions> <transaction> <transId>60023782165</transId> <submitTimeUTC>2017-05-16T13:03:10Z</submitTimeUTC> <submitTimeLocal>2017-05-16T06:03:10</submitTimeLocal> <transactionStatus>settledSuccessfully</transactionStatus> <invoiceNumber>XXXX</invoiceNumber> <firstName>XXXX</firstName> <lastName>XXXX</lastName> <accountType>XXXX</accountType> <accountNumber>XXXX</accountNumber> <settleAmount>100.00</settleAmount> <marketType>eCommerce</marketType><!-- 'eCommerce' instead of 0 --> <product>Card Not Present</product> <!-- <profile/> field is absent --> </transaction> <transaction> <transId>60023781849</transId> <submitTimeUTC>2017-05-16T12:55:15Z</submitTimeUTC> <submitTimeLocal>2017-05-16T05:55:15</submitTimeLocal> <transactionStatus>settledSuccessfully</transactionStatus> <invoiceNumber>XXXX</invoiceNumber> <firstName>XXXX</firstName> <lastName>XXXX</lastName> <accountType>XXXX</accountType> <accountNumber>XXXX</accountNumber> <settleAmount>100.00</settleAmount> <marketType>eCommerce</marketType><!-- 'eCommerce' instead of 0 --> <product>Card Not Present</product> <!-- <profile/> field is absent --> </transaction> <transaction> <transId>60023769115</transId> <submitTimeUTC>2017-05-16T08:39:57Z</submitTimeUTC> <submitTimeLocal>2017-05-16T01:39:57</submitTimeLocal> <transactionStatus>settledSuccessfully</transactionStatus> <invoiceNumber>XXXX</invoiceNumber> <firstName>XXXX</firstName> <lastName>XXXX</lastName> <accountType>XXXX</accountType> <accountNumber>XXXX</accountNumber> <settleAmount>33.33</settleAmount> <marketType>eCommerce</marketType><!-- 'eCommerce' instead of 0 --> <product>Card Not Present</product> <subscription> <id>4369712</id> <payNum>4</payNum> </subscription> <!-- <profile/> field is absent --> </transaction> <transaction> <transId>60023768796</transId> <submitTimeUTC>2017-05-16T08:39:50Z</submitTimeUTC> <submitTimeLocal>2017-05-16T01:39:50</submitTimeLocal> <transactionStatus>settledSuccessfully</transactionStatus> <firstName>XXXX</firstName> <lastName>XXXX</lastName> <accountType>XXXX</accountType> <accountNumber>XXXX</accountNumber> <settleAmount>5833.33</settleAmount> <marketType>eCommerce</marketType><!-- 'eCommerce' instead of 0 --> <product>Card Not Present</product> <subscription> <id>4347118</id> <payNum>5</payNum> </subscription> <!-- <profile/> field is absent --> </transaction> <transaction> <transId>60023707281</transId> <submitTimeUTC>2017-05-15T08:39:27Z</submitTimeUTC> <submitTimeLocal>2017-05-15T01:39:27</submitTimeLocal> <transactionStatus>settledSuccessfully</transactionStatus> <invoiceNumber>XXXX</invoiceNumber> <firstName>XXXX</firstName> <lastName>XXXX</lastName> <accountType>XXXX</accountType> <accountNumber>XXXX</accountNumber> <settleAmount>33.33</settleAmount> <marketType>eCommerce</marketType><!-- 'eCommerce' instead of 0 --> <product>Card Not Present</product> <subscription> <id>4388793</id> <payNum>3</payNum> </subscription> <!-- <profile/> field is absent --> </transaction> <transaction> <transId>60023706771</transId> <submitTimeUTC>2017-05-15T08:39:14Z</submitTimeUTC> <submitTimeLocal>2017-05-15T01:39:14</submitTimeLocal> <transactionStatus>settledSuccessfully</transactionStatus> <firstName>XXXX</firstName> <lastName>XXXX</lastName> <accountType>XXXX</accountType> <accountNumber>XXXX</accountNumber> <settleAmount>166.66</settleAmount> <marketType>eCommerce</marketType><!-- 'eCommerce' instead of 0 --> <product>Card Not Present</product> <subscription> <id>4346594</id> <payNum>5</payNum> </subscription> <!-- <profile/> field is absent --> </transaction> <transaction> <transId>60023674635</transId> <submitTimeUTC>2017-05-14T08:43:30Z</submitTimeUTC> <submitTimeLocal>2017-05-14T01:43:30</submitTimeLocal> <transactionStatus>settledSuccessfully</transactionStatus> <invoiceNumber>XXXX</invoiceNumber> <firstName>XXXX</firstName> <lastName>XXXX</lastName> <accountType>XXXX</accountType> <accountNumber>XXXX</accountNumber> <settleAmount>31.66</settleAmount> <marketType>eCommerce</marketType><!-- 'eCommerce' instead of 0 --> <product>Card Not Present</product> <subscription> <id>4367953</id> <payNum>4</payNum> </subscription> <!-- <profile/> field is absent --> </transaction> </transactions> <totalNumInResultSet>7</totalNumInResultSet> </getTransactionListResponse>
Important: <profile/> field is not presented in <transaction/>;
<type/> field is not presented in <customer/>.
More: <authAmount/> and <settleAmount/> were moved out from the <order/> tag;
<accountType/> renamed to <cardType/>;
<marketType/> field described in documentation as a digit from 0 to 2, which stands for eCommerce, MOTO or retail accordingly. But in response this field presented as a string value, e.g. <marketType>eCommerce<marketType/> instead of <marketType>0<marketType/>.
Here is a listing from the 'Try it' block (some data was masked as XXXX):
Request:
<getTransactionDetailsRequest xmlns="AnetApi/xml/v1/schema/AnetApiSchema.xsd"> <merchantAuthentication> <name><![CDATA[XXXX]]></name> <transactionKey>XXXX</transactionKey> </merchantAuthentication> <clientId><![CDATA[sdk-php-1.9.3]]></clientId> <refId><![CDATA[ref_591d6bf0d212a]]></refId> <transId><![CDATA[60023782165]]></transId> </getTransactionDetailsRequest>
Response:
<?xml version="1.0" encoding="utf-8"?> <getTransactionDetailsResponse xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="AnetApi/xml/v1/schema/AnetApiSchema.xsd"> <refId>ref_591d6bf0d212a</refId> <messages> <resultCode>Ok</resultCode> <message> <code>I00001</code> <text>Successful.</text> </message> </messages> <transaction> <transId>60023782165</transId> <submitTimeUTC>2017-05-16T13:03:10.773Z</submitTimeUTC> <submitTimeLocal>2017-05-16T06:03:10.773</submitTimeLocal> <transactionType>authCaptureTransaction</transactionType> <transactionStatus>settledSuccessfully</transactionStatus> <responseCode>1</responseCode> <responseReasonCode>1</responseReasonCode> <responseReasonDescription>Approval</responseReasonDescription> <authCode>XXXX</authCode> <AVSResponse>Y</AVSResponse> <cardCodeResponse>P</cardCodeResponse> <batch> <batchId>7125336</batchId> <settlementTimeUTC>2017-05-17T01:33:29.257Z</settlementTimeUTC> <settlementTimeLocal>2017-05-16T18:33:29.257</settlementTimeLocal> <settlementState>settledSuccessfully</settlementState> </batch> <order> <invoiceNumber>XXXX</invoiceNumber> <description>XXXX</description> <!-- <authAmount/> field is absent --> <!-- <settleAmount/> field is absent --> </order> <authAmount>100.00</authAmount><!-- was moved out from the <order/> --> <settleAmount>100.00</settleAmount><!-- was moved out from the <order/> --> <taxExempt>false</taxExempt> <payment> <creditCard> <cardNumber>XXXX</cardNumber> <expirationDate>XXXX</expirationDate> <cardType>XXXX</cardType><!-- should be <accountType/> --> </creditCard> </payment> <customer> <!-- <type/> field is absent --> <id>XXXX</id> <email>XXXX</email> </customer> <billTo> <firstName>XXXX</firstName> <lastName>XXXX</lastName> <address>XXXX</address> <city>XXXX</city> <state>XXXX</state> <zip>XXXX</zip> <country>XXXX</country> <phoneNumber>XXXX</phoneNumber> </billTo> <recurringBilling>false</recurringBilling> <customerIP>XXXX</customerIP> <product>Card Not Present</product> <marketType>eCommerce</marketType><!-- 'eCommerce' instead of 0 --> <!-- <profile/> field is absent --> </transaction> <clientId>sdk-php-1.9.3</clientId> <transrefId>ref_591af88d643b8</transrefId> </getTransactionDetailsResponse>
Solved! Go to Solution.
05-18-2017 05:11 AM
Thanks for the samples.
<createProfile>true</createProfile> is a shortcut to allow you to do two separate steps with one API call. It's creating a new transaction, then making a profile from an existing transaction (the existing transaction being the one it just did within this request).
The process of creating a profile from an existing transaction does not not associate that existing transaction to the profile that it creates. It's literally just creating a profile using the information that it has pulled out of that existing transaction. It's working as designed.
However, you're not the first one to assume that the transaction ID given would then be associated with the newly created profile. This same idea has already been posted onto our Ideas Forum where others can take a look, contribute feedback, and vote for new features.
Here's the specific idea post for that idea. That post links to an original thread with some workflow workarounds. I'd encourage you to look at that idea post and vote on it if you'd like to support that specific idea for improvement.
With regards to your previous documentation problems you've pointed out, we've got them fixed on our end, and are just waiting for them to get deployed to the production web site.
Thanks again!
05-22-2017 01:50 PM
Hi @kos,
First off, thanks! Thank you so much for the detailed information. There's definitely a couple of things in there that we can fix in the documentation right away.
With regards to the <profile> element not coming back in your responses, I'm not able to duplicate. If I charge a profile, then retrieve transaction details for that transaction, I get the <profile> element correctly.
<?xml version="1.0" encoding="utf-8"?> <getTransactionDetailsResponse xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="AnetApi/xml/v1/schema/AnetApiSchema.xsd"> <messages> <resultCode>Ok</resultCode> <message> <code>I00001</code> <text>Successful.</text> </message> </messages> <transaction> <transId>60023912678</transId> <submitTimeUTC>2017-05-18T17:36:34.35Z</submitTimeUTC> <submitTimeLocal>2017-05-18T11:36:34.35</submitTimeLocal> <transactionType>authOnlyTransaction</transactionType> <transactionStatus>authorizedPendingCapture</transactionStatus> <responseCode>1</responseCode> <responseReasonCode>1</responseReasonCode> <responseReasonDescription>Approval</responseReasonDescription> <authCode>YJOEIK</authCode> <AVSResponse>Y</AVSResponse> <cardCodeResponse>P</cardCodeResponse> <order> <invoiceNumber>INV-12345</invoiceNumber> <description>Product Description</description> <purchaseOrderNumber>456654</purchaseOrderNumber> </order> <authAmount>43.00</authAmount> <settleAmount>43.00</settleAmount> <tax> <amount>4.26</amount> <description>level2 tax</description> </tax> <shipping> <amount>4.26</amount> <description>level2 tax</description> </shipping> <duty> <amount>8.55</amount> <description>duty description</description> </duty> <lineItems> <lineItem> <itemId>1</itemId> <name>vase</name> <description>Cannes logo</description> <quantity>18.00000</quantity> <unitPrice>45.00</unitPrice> <taxable>false</taxable> </lineItem> </lineItems> <taxExempt>false</taxExempt> <payment> <creditCard> <cardNumber>XXXX0015</cardNumber> <expirationDate>XXXX</expirationDate> <cardType>MasterCard</cardType> </creditCard> </payment> <customer> <type>individual</type> <id>99999456654</id> </customer> <recurringBilling>false</recurringBilling> <customerIP>192.168.1.1</customerIP> <product>Card Not Present</product> <marketType>eCommerce</marketType> <profile> <customerProfileId>1811640796</customerProfileId> <customerPaymentProfileId>1806156096</customerPaymentProfileId> </profile> </transaction> <transrefId>123456</transrefId> </getTransactionDetailsResponse>
Can you give me more information on the transactions in your example? Were they charged using a "Charge a profile" request, or some other way? Any steps you can give me to duplicate?
05-18-2017 10:39 AM
Hi @Aaron,
Thank you for reply.
I have made some research and found out that transaction which was created for existed customer profile will have 'customerType' and 'profile' fields in response, but transaction with <createProfile>true</createProfile> will not link this transaction to the profile it creates.
Create Transaction for the new customer:
<?xml version="1.0" encoding="UTF-8"?> <createTransactionRequest xmlns="AnetApi/xml/v1/schema/AnetApiSchema.xsd"> <merchantAuthentication> <name><![CDATA[XXXX]]></name> <transactionKey>XXXX</transactionKey> </merchantAuthentication> <clientId><![CDATA[sdk-php-1.9.3]]></clientId> <refId><![CDATA[ref_591f15f4e5832]]></refId> <transactionRequest> <transactionType><![CDATA[authCaptureTransaction]]></transactionType> <amount>100</amount> <payment> <creditCard> <cardNumber>xxxx</cardNumber> <expirationDate>xxxx</expirationDate> <cardCode>xxxx</cardCode> </creditCard> </payment> <profile> <createProfile>true</createProfile> </profile> <order> <invoiceNumber><![CDATA[XXXX]]></invoiceNumber> <description><![CDATA[XXXX]]></description> </order> <customer> <type><![CDATA[individual]]></type> <id><![CDATA[79]]></id> <email><![CDATA[XXXX]]></email> </customer> <billTo> <firstName><![CDATA[XXXX]]></firstName> <lastName><![CDATA[XXXX]]></lastName> <address><![CDATA[XXXX]]></address> <city><![CDATA[XXXX]]></city> <state><![CDATA[XXXX]]></state> <zip><![CDATA[XXXX]]></zip> <country><![CDATA[XXXX]]></country> <phoneNumber><![CDATA[XXXX]]></phoneNumber> <email><![CDATA[XXXX]]></email> </billTo> </transactionRequest> </createTransactionRequest>
Response to the Get Transaction Details call:
<?xml version="1.0" encoding="utf-8"?> <getTransactionDetailsResponse xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="AnetApi/xml/v1/schema/AnetApiSchema.xsd"> <messages> <resultCode>Ok</resultCode> <message> <code>I00001</code> <text>Successful.</text> </message> </messages> <transaction> <transId>40004410028</transId> <submitTimeUTC>2017-05-19T15:57:43.09Z</submitTimeUTC> <submitTimeLocal>2017-05-19T08:57:43.09</submitTimeLocal> <transactionType>authCaptureTransaction</transactionType> <transactionStatus>capturedPendingSettlement</transactionStatus> <responseCode>1</responseCode> <responseReasonCode>1</responseReasonCode> <responseReasonDescription>Approval</responseReasonDescription> <authCode>5DW8PT</authCode> <AVSResponse>Y</AVSResponse> <cardCodeResponse>P</cardCodeResponse> <order> <invoiceNumber>XXXX</invoiceNumber> <description>XXXX</description> </order> <authAmount>100.00</authAmount> <settleAmount>100.00</settleAmount> <taxExempt>false</taxExempt> <payment> <creditCard> <cardNumber>XXXX</cardNumber> <expirationDate>XXXX</expirationDate> <cardType>XXXX</cardType> </creditCard> </payment> <customer> <!-- <type> field is absent --> <id>79</id> <email>XXXX</email> </customer> <billTo> <firstName>XXXX</firstName> <lastName>XXXX</lastName> <address>XXXX</address> <city>XXXX</city> <state>XXXX</state> <zip>XXXX</zip> <country>XXXX</country> <phoneNumber>XXXX</phoneNumber> </billTo> <recurringBilling>false</recurringBilling> <customerIP>XXXX</customerIP> <product>Card Not Present</product> <marketType>eCommerce</marketType> <!-- <profile/> field is absent --> </transaction> <clientId>sdk-php-1.9.3</clientId> <transrefId>ref_591f15f4e5832</transrefId> </getTransactionDetailsResponse>
Create new transaction for the customer which was made by the previous one:
<?xml version="1.0" encoding="UTF-8"?> <createTransactionRequest xmlns="AnetApi/xml/v1/schema/AnetApiSchema.xsd"> <merchantAuthentication> <name><![CDATA[XXXX]]></name> <transactionKey>XXXX</transactionKey> </merchantAuthentication> <clientId><![CDATA[sdk-php-1.9.3]]></clientId> <refId><![CDATA[ref_591f1bf7e719a]]></refId> <transactionRequest> <transactionType><![CDATA[authCaptureTransaction]]></transactionType> <amount>200</amount> <profile> <customerProfileId><![CDATA[1501068509]]></customerProfileId> <paymentProfile> <paymentProfileId><![CDATA[1500626396]]></paymentProfileId> </paymentProfile> </profile> <order> <invoiceNumber><![CDATA[XXXX]]></invoiceNumber> <description><![CDATA[XXXX]]></description> </order> </transactionRequest> </createTransactionRequest>
Response to the Get Transaction Details call:
<?xml version="1.0" encoding="utf-8"?> <getTransactionDetailsResponse xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="AnetApi/xml/v1/schema/AnetApiSchema.xsd"> <messages> <resultCode>Ok</resultCode> <message> <code>I00001</code> <text>Successful.</text> </message> </messages> <transaction> <transId>40004410427</transId> <submitTimeUTC>2017-05-19T16:23:20.723Z</submitTimeUTC> <submitTimeLocal>2017-05-19T09:23:20.723</submitTimeLocal> <transactionType>authCaptureTransaction</transactionType> <transactionStatus>capturedPendingSettlement</transactionStatus> <responseCode>1</responseCode> <responseReasonCode>1</responseReasonCode> <responseReasonDescription>Approval</responseReasonDescription> <authCode>SSJ6LR</authCode> <AVSResponse>Y</AVSResponse> <cardCodeResponse>P</cardCodeResponse> <order> <invoiceNumber>XXXX</invoiceNumber> <description>XXXX</description> </order> <authAmount>200.00</authAmount> <settleAmount>200.00</settleAmount> <taxExempt>false</taxExempt> <payment> <creditCard> <cardNumber>XXXX</cardNumber> <expirationDate>XXXX</expirationDate> <cardType>XXXX</cardType> </creditCard> </payment> <customer> <type>individual</type> <id>79</id> <email>XXXX</email> </customer> <billTo> <firstName>XXXX</firstName> <lastName>XXXX</lastName> <address>XXXX</address> <city>XXXX</city> <state>XXXX</state> <zip>XXXX</zip> <country>XXXX</country> <phoneNumber>XXXX</phoneNumber> </billTo> <recurringBilling>false</recurringBilling> <customerIP>XXXX</customerIP> <product>Card Not Present</product> <marketType>eCommerce</marketType> <profile> <customerProfileId>1501068509</customerProfileId> <customerPaymentProfileId>1500626396</customerPaymentProfileId> </profile> </transaction> <clientId>sdk-php-1.9.3</clientId> <transrefId>ref_591f1bf7e719a</transrefId> </getTransactionDetailsResponse>
05-19-2017 09:58 AM
Thanks for the samples.
<createProfile>true</createProfile> is a shortcut to allow you to do two separate steps with one API call. It's creating a new transaction, then making a profile from an existing transaction (the existing transaction being the one it just did within this request).
The process of creating a profile from an existing transaction does not not associate that existing transaction to the profile that it creates. It's literally just creating a profile using the information that it has pulled out of that existing transaction. It's working as designed.
However, you're not the first one to assume that the transaction ID given would then be associated with the newly created profile. This same idea has already been posted onto our Ideas Forum where others can take a look, contribute feedback, and vote for new features.
Here's the specific idea post for that idea. That post links to an original thread with some workflow workarounds. I'd encourage you to look at that idea post and vote on it if you'd like to support that specific idea for improvement.
With regards to your previous documentation problems you've pointed out, we've got them fixed on our end, and are just waiting for them to get deployed to the production web site.
Thanks again!
05-22-2017 01:50 PM
Hi @Aaron,
Thank you so much for this great explanation. I've already implemented another way of transactions handling, now customer profile is created before createTransaction call is sent and profile is succesfully assigned to transaction as it should be.
To avoid long discussions on issue, whether customer should be associated with transaction, when <createProfile>true</createProfile> flag is set, or not (as for me, it shouldn't because <createProfile> declares that customer will be only created and nothing else), I suggest to implement additional flag, for instance:
<profile> <createProfile>true</createProfile> <associateWithTransaction>true</associateWithTransaction> </profile>
This is another view of the same problem as you mentioned in your comment, so I've created a new idea post.
Thanks again for your help.
05-25-2017 10:30 AM