Reply
Highlighted
Contributor
Posts: 36
Registered: ‎02-23-2012

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);
$request->setSandbox(AUTHORIZENET_SANDBOX);
$request->setLogFile(AUTHORIZENET_LOG_FILE);
$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.

Highlighted
Contributor
Posts: 36
Registered: ‎02-23-2012

Re: Problem parsing payment methods from result of getCustomerProfile call

Bump!

 

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.

Highlighted
Posts: 1,609
Topics: 15
Kudos: 201
Solutions: 121
Registered: ‎06-23-2011

Re: Problem parsing payment methods from result of getCustomerProfile call

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}");
    }