Showing results for 
Search instead for 
Did you mean: 

Problem parsing payment methods from result of getCustomerProfile call

I'm using the PHP SDK to contact the gateway like so:

// create a request object
$request = new AuthorizeNetCIM(API_LOGIN_ID, TRANSACTION_KEY);
$response = $request->getCustomerProfile($authorizenet_customer_profile_id);

 This brings back a result, but the PHP SDK doesn't seem to be able to do anything very useful with it:

$response->getCustomerProfileIds() returns NULL even with a valid response

$response->getCustomerPaymentProfileIds() returns NULL even with a valid response

$response->getCustomerShippingAddressIds() returns NULL even with a valid response

$response->getCustomerAddressId() returns FALSE even with a valid response

$response->getCustomerProfileId() actually does return a profile id but that's useless.  i had to have the profile id to call the original gateway function.

$response->getPaymentProfileId() actually returns *one* of the payment profile ids regardless of how many are returned.


Given this sad peformance, I attempted to do some var_dumps on the object returned and some casting to sort things out.  This has turned out to be a nightmare because the response XML is totally different when a user has a single payment account versus when they have several.  This code works great when a user has several accounts.  When they have one, it creates a useless 3-element array:


$prof_array = (array)$response->xml->profile;
$payment_profiles = $prof_array["paymentProfiles"];

$result = array();
foreach($payment_profiles as $prof){
    $arr = array();
    $arr["payment_profile_id"] = (int)$prof->customerPaymentProfileId;
    if ($prof->payment->creditCard) {
        $arr["type"] = "creditCard";
        $arr["card_number"] = (string)$prof->payment->creditCard->cardNumber;
    } elseif ($prof->payment->bankAccount) {
        $ba = $prof->payment->bankAccount;
        $arr["type"] = "bankAccount";
        $arr["account_type"] = (string)$ba->accountType;
        $arr["routing_number"] = (string)$ba->routingNumber;
        $arr["account_number"] = (string)$ba->accountNumber;
        $arr["name_on_account"] = (string)$ba->nameOnAccount;
        $arr["bank_name"] = (string)$ba->bankName; 
    $result[] = $arr;


Can anyone tell me the proper way to extract the masked card number (e.g., XXXX1234) and/or bank account details from a getCustomerProfile call?  I'm really disappointed with the PHP SDK.




Seriously, can anyone tell me if I'm missing something in the PHP SDK?  Alternatively, can anyone recommend the most efficient technique for retrieving a well-structured data object listing of all the payment profiles that belong to a given customer profile id? The technique needs to work whether the customer has multiple profiles or just one.


This seems to be working for me. $pprofile is payment profile, and you'll have to do some twiddling with the specific values, but thiis works with one or multiple profiles.


    $profile = $request->getCustomerProfile($profile_id_here);
    if (!$profile->isOk())
        $errors[] = $profile->xml->messages->message->text;

    else for ($i = 0; $pprofile = $profile->xml->profile->paymentProfiles[$i]; $i++) {
        if ($pprofile->payment->bankAccount)
            $display['profiles'][] = array($pprofile->customerPaymentProfileId, "Bank Account {$pprofile->payment->bankAccount->routingNumber}-{$pprofile->payment->bankAccount->accountNumber}");
        elseif ($pprofile->payment->creditCard)
            $display['profiles'][] = array($pprofile->customerPaymentProfileId, "Credit Card XXXXXXXX{$pprofile->payment->creditCard->cardNumber}");