Files
carpseeds.pl/wp-content/plugins/woocommerce-gateway-paypal-express-checkout/includes/class-wc-gateway-ppec-checkout-details.php
2024-07-15 11:28:08 +02:00

522 lines
18 KiB
PHP

<?php
/**
* TODO: Move each class into its own file and group them under one dir, checkout-details.
*/
if ( ! defined( 'ABSPATH' ) ) {
exit; // Exit if accessed directly
}
$includes_path = wc_gateway_ppec()->includes_path;
require_once( $includes_path . 'class-wc-gateway-ppec-address.php' );
class PayPal_Checkout_Details {
public $raw_response = array();
public $token = false;
public $custom = false;
public $invnum = false;
public $phone_number = false;
public $billing_agreement_accepted = false;
const BillingAgreementNotAccepted = '0';
const BillingAgreementAccepted = '1';
public $paypal_adjustment = false;
public $redirect_required_after_payment = false;
public $checkout_status = false;
const PaymentNotAttempted = 'PaymentActionNotInitiated';
const PaymentFailed = 'PaymentActionFailed';
const PaymentInProgress = 'PaymentActionInProgress';
const PaymentCompleted = 'PaymentActionCompleted';
public $gift_details = false;
public $buyer_marketing_email = false;
public $survey_question = false;
public $survey_choice_selected = false;
public $payer_details = false;
public $wallets = false;
public $instrument_details = false;
public $shipping_option_details = false;
public $payments = false;
public function loadFromGetECResponse( $getECResponse ) {
$this->raw_response = $getECResponse;
$map = array(
'TOKEN' => 'token',
'CUSTOM' => 'custom',
'INVNUM' => 'invnum',
'PHONENUM' => 'phone_number',
'BILLINGAGREEMENTACCEPTEDSTATUS' => 'billing_agreement_accepted',
'PAYPALADJUSTMENT' => 'paypal_adjustment',
'REDIRECTREQUIRED' => 'redirect_required_after_payment',
'CHECKOUTSTATUS' => 'checkout_status',
'BUYERMARKETINGEMAIL' => 'buyer_marketing_email',
'SURVEYQUESTION' => 'survey_question',
'SURVEYCHOICESELECTED' => 'survey_choice_selected'
);
foreach ( $getECResponse as $index => $value ) {
if ( array_key_exists( $index, $map ) ) {
$this->{ $map[ $index ] } = $value;
}
}
$this->gift_details = new PayPal_Checkout_Gift_Details();
if ( ! $this->gift_details->loadFromGetECResponse( $getECResponse ) ) {
$this->gift_details = false;
}
$this->payer_details = new PayPal_Checkout_Payer_Details();
if ( ! $this->payer_details->loadFromGetECResponse( $getECResponse ) ) {
wc_gateway_ppec_log( sprintf( 'PayPal response did not include the payer billing details: %s', print_r( $getECResponse, true ) ) );
$this->payer_details = false;
}
$this->instrument_details = new PayPal_Checkout_Instrument_Details();
if ( ! $this->instrument_details->loadFromGetECResponse( $getECResponse ) ) {
$this->instrument_details = false;
}
$this->shipping_option_details = new PayPal_Checkout_Shipping_Option_Details();
if ( ! $this->shipping_option_details->loadFromGetECResponse( $getECResponse ) ) {
$this->shipping_option_details = false;
}
$max_wallet_num = -1;
$max_payment_num = -1;
foreach ( $getECResponse as $index => $value ) {
if ( preg_match( '/^(WALLETTYPE|WALLETID|WALLETDESCRIPTION)(\d+)$/', $index, $matches ) ) {
if ( $matches[2] > $max_wallet_num ) {
$max_wallet_num = $matches[2];
}
} elseif ( preg_match( '/^PAYMENTREQUEST_(\d)_(AMT|CURRENCYCODE|ITEMAMT|SHIPPINGAMT|INSURANCEAMT|SHIPDISCAMT|INSURANCEOPTIONOFFERED|HANDLINGAMT|TAXAMT|DESC|CUSTOM|INVNUM|NOTIFYURL|NOTETEXT|TRANSACTIONID|ALLOWEDPAYMENTMETHOD|PAYMENTREQUESTID|BUCKETCATEGORYTYPE)$/', $index, $matches )
|| preg_match( '/^L_PAYMENTREQUEST_(\d)_(NAME|DESC|AMT|NUMBER|QTY|TAXAMT|ITEMWEIGHTVALUE|ITEMWEIGHTUNIT|ITEMLENGTHVALUE|ITEMLENGTHUNIT|ITEMWIDTHVALUE|ITEMWIDTHUNIT|ITEMHEIGHTVALUE|ITEMHEIGHTUNIT)\d+$/', $index, $matches ) ) {
if ( $matches[1] > $max_payment_num ) {
$max_payment_num = $matches[1];
}
}
}
if ( $max_wallet_num > -1 ) {
$this->wallets = array();
for ( $i = 0; $i <= $max_wallet_num; $i++ ) {
$this->wallets[ $i ] = new PayPal_Checkout_Wallet_Details();
$this->wallets[ $i ]->loadFromGetECResponse( $getECResponse, $i );
}
}
if ( $max_payment_num > -1 ) {
$this->payments = array();
for ( $i = 0; $i <= $max_payment_num; $i++ ) {
$this->payments[ $i ] = new PayPal_Checkout_Payment_Details();
$this->payments[ $i ]->loadFromGetECResponse( $getECResponse, $i );
}
}
}
}
class PayPal_Checkout_Payment_Details {
public $shipping_address = false;
public $shipping_address_confirmed = false;
public $shipping_address_normalization_status = false;
const AddressNormalizationNone = 'None';
const AddressNormalizationNormalized = 'Normalized';
const AddressNormalizationUnnormalized = 'Unnormalized';
const AddressNormalizationUserPreferred = 'UserPreferred';
public $amount = false;
public $currency_code = false;
public $item_amount = false;
public $shipping_amount = false;
public $insurance_amount = false;
public $shipping_discount_amount = false;
public $insurance_option_offered = false;
public $handling_amount = false;
public $tax_amount = false;
public $description = false;
public $custom = false;
public $invoice_number = false;
public $notify_url = false;
public $note_text = false;
public $transaction_id = false;
public $allowed_payment_method = false;
const AllowedPaymentMethodInstantPaymentOnly = 'InstantPaymentOnly';
public $payment_request_id = false;
public $bucket_category_type = false;
const BucketCategoryInternationalShipping = '1';
const BucketCategoryLocalDelivery = '2';
public $items = false;
public function loadFromGetECResponse( $getECResponse, $bucketNum ) {
$map = array(
'AMT' => 'amount',
'CURRENCYCODE' => 'currency_code',
'ITEMAMT' => 'item_subtotal',
'SHIPPINGAMT' => 'shipping_amount',
'INSURANCEAMT' => 'insurance_amount',
'SHIPDISCAMT' => 'shipping_discount_amount',
'INSURANCEOPTIONOFFERED' => 'insurance_option_offered',
'HANDLINGAMT' => 'handling_amount',
'TAXAMT' => 'tax_amount',
'DESC' => 'description',
'CUSTOM' => 'custom',
'INVNUM' => 'invoice_number',
'NOTIFYURL' => 'notify_url',
'NOTETEXT' => 'note_text',
'TRANSACTIONID' => 'transaction_id',
'ALLOWEDPAYMENTMETHOD' => 'allowed_payment_method',
'PAYMENTREQUESTID' => 'payment_request_id',
'BUCKETCATEGORYTYPE' => 'bucket_category_type',
'ADDRESSNORMALIZATIONSTATUS' => 'shipping_address_normalization_status'
);
$found_any = false;
foreach ( $map as $index => $value ) {
$var_name = 'PAYMENTREQUEST_' . $bucketNum . '_' . $index;
if ( array_key_exists( $var_name, $getECResponse ) ) {
$this->{ $value } = $getECResponse[ $var_name ];
$found_any = true;
}
}
// See if we have any line items that need to be parsed
$max_line_item_num = -1;
foreach ( $getECResponse as $index => $value ) {
if ( preg_match( '/^L_PAYMENTREQUEST_' . $bucketNum . '_(NAME|DESC|AMT|NUMBER|QTY|TAXAMT|ITEMWEIGHTVALUE|ITEMWEIGHTUNIT|ITEMLENGTHVALUE|ITEMLENGTHUNIT|ITEMWIDTHVALUE|ITEMWIDTHUNIT|ITEMHEIGHTVALUE|ITEMHEIGHTUNIT|ITEMCATEGORY|EBAYITEMNUMBER|EBAYITEMAUCTIONTXNID|EBAYITEMORDERID|EBAYITEMCARTID)(\d+)$/', $index, $matches ) ) {
if ( isset( $matches[2] ) && $matches[2] > $max_line_item_num ) {
$max_line_item_num = $matches[2];
}
}
}
if ( $max_line_item_num > -1 ) {
$found_any = true;
$this->items = array();
for ( $i = 0; $i <= $max_line_item_num; $i++ ) {
$items[ $i ] = new PayPal_Checkout_Payment_Item_Details();
$items[ $i ]->loadFromGetECResponse( $getECResponse, $bucketNum, $i );
}
}
$this->shipping_address = new PayPal_Address();
if ( ! $this->shipping_address->loadFromGetECResponse( $getECResponse, 'PAYMENTREQUEST_' . $bucketNum . '_SHIPTO' ) ) {
$this->shipping_address = false;
} else {
$found_any = true;
}
return $found_any;
}
}
class PayPal_Checkout_Payment_Item_Details {
public $name = false;
public $description = false;
public $amount = false;
public $item_number = false;
public $quantity = false;
public $tax_amount = false;
public $physical_details = false;
public $ebay_item_details = false;
public function loadFromGetECResponse( $getECResponse, $bucketNum, $itemNum ) {
$map = array(
'NAME' => 'name',
'DESC' => 'description',
'AMT' => 'amount',
'NUMBER' => 'item_number',
'QTY' => 'quantity',
'TAXAMT' => 'tax_amount',
);
foreach ( $map as $index => $value ) {
$var_name = 'L_PAYMENTREQUEST_' . $bucketNum . '_' . $index . $itemNum;
if ( array_key_exists( $var_name, $getECResponse ) ) {
$this->{ $value } = $getECResponse[ $var_name ];
}
}
$this->physical_details = new PayPal_Checkout_Payment_Item_Physical_Details();
if ( ! $this->physical_details->loadFromGetECResponse( $getECResponse, $bucketNum, $itemNum ) ) {
$this->physical_details = false;
}
$this->ebay_item_details = new PayPal_Checkout_Payment_Item_Ebay_Item_Details();
if ( ! $this->ebay_item_details->loadFromGetECResponse( $getECResponse, $bucketNum, $itemNum ) ) {
$this->ebay_item_details = false;
}
}
}
class PayPal_Checkout_Payment_Item_Physical_Details {
public $weight;
public $weight_units;
public $length;
public $length_units;
public $width;
public $width_units;
public $height;
public $height_units;
public function loadFromGetECResponse( $getECResponse, $bucketNum, $itemNum ) {
$map = array(
'WEIGHTVALUE' => 'weight',
'WEIGHTUNIT' => 'weight_units',
'LENGTHVALUE' => 'length',
'LENGTHUNIT' => 'length_units',
'WIDTHVALUE' => 'width',
'WIDTHUNIT' => 'width_units',
'HEIGHTVALUE' => 'height',
'HEIGHTUNIT' => 'height_units'
);
$found_any = false;
foreach ( $map as $index => $value ) {
$var_name = 'L_PAYMENTREQUEST_' . $bucketNum . '_ITEM' . $index . $itemNum;
if ( array_key_exists( $var_name, $getECResponse ) ) {
$this->{ $value } = $getECResponse[ $var_name ];
$found_any = true;
}
}
return $found_any;
}
}
class PayPal_Checkout_Payment_Item_Ebay_Item_Details {
public $item_number = false;
public $auction_transaction_id = false;
public $order_id = false;
public $cart_id = false;
public function loadFromGetECResponse( $getECResponse, $bucketNum, $itemNum ) {
$map = array(
'ITEMNUMBER' => 'item_number',
'AUCTIONTXNID' => 'auction_transaction_id',
'ORDERID' => 'order_id',
'CARTID' => 'cart_id'
);
$found_any = false;
foreach ( $map as $index => $value ) {
$var_name = 'L_PAYMENTREQUEST_' . $bucketNum . '_' . $index . $itemNum;
if ( array_key_exists( $var_name, $getECResponse ) ) {
$this->{ $value } = $getECResponse[ $var_name ];
$found_any = true;
}
}
return $found_any;
}
}
class PayPal_Checkout_Shipping_Option_Details {
public $calculation_mode = false;
const CalculationModeCallback = 'Callback';
const CalculationModeFlatrate = 'FlatRate';
public $insurance_option_selected = false;
public $shipping_option_is_default = false;
public $shipping_option_amount = false;
public $shipping_option_name = false;
// Returns true to indicate that the getECResponse array contained variables that were pertinent to this object.
// If not, it returns false to indicate that the caller can destroy this object.
public function loadFromGetECResponse( $getECResponse ) {
$map = array(
'SHIPPINGCALCULATIONMODE' => 'calculation_mode',
'INSURANCEOPTIONSELECTED' => 'insurance_option_selected',
'SHIPPINGOPTIONISDEFAULT' => 'shipping_option_is_default',
'SHIPPINGOPTIONAMOUNT' => 'shipping_option_amount',
'SHIPPINGOPTIONNAME' => 'shipping_option_name'
);
$found_any = false;
foreach ( $getECResponse as $index => $value ) {
if ( array_key_exists( $index, $map ) ) {
$this->{ $map[ $index ] } = $value;
$found_any = true;
}
}
return $found_any;
}
}
class PayPal_Checkout_Instrument_Details {
public $instrument_category = false;
const InstrumentCategoryPayPalCredit = '1';
const InstrumentCategoryPrivateCard = '2';
public $instrument_id = false;
// Returns true to indicate that the getECResponse array contained variables that were pertinent to this object.
// If not, it returns false to indicate that the caller can destroy this object.
public function loadFromGetECResponse( $getECResponse ) {
$map = array(
'INSTRUMENTCATEGORY' => 'instrument_category',
'INSTRUMENTID' => 'instrument_id'
);
$found_any = false;
foreach ( $getECResponse as $index => $value ) {
if ( array_key_exists( $index, $map ) ) {
$this->{ $map[ $index ] } = $value;
$found_any = true;
}
}
return $found_any;
}
}
class PayPal_Checkout_Wallet_Details {
public $wallet_type = false;
const WalletTypeLoyaltyCard = 'LOYALTY_CARD';
const WalletTypeMerchantCoupon = 'MERCHANT_COUPON';
const WalletTypeMerchantClosedLoopOffer = 'MERCHANT_CLOSED_LOOP_OFFER';
public $wallet_id = false;
public $wallet_description = false;
public function __construct( $wallet_type = false, $wallet_id = false, $wallet_description = false ) {
$this->wallet_type = $wallet_type;
$this->wallet_id = $wallet_id;
$this->wallet_description = $wallet_description;
}
// Returns true to indicate that the getECResponse array contained variables that were pertinent to this object.
// If not, it returns false to indicate that the caller can destroy this object.
public function loadFromGetECResponse( $getECResponse, $wallet_num ) {
$found_any = false;
foreach ( $getECResponse as $index => $value ) {
if ( ( 'WALLETTYPE' . $wallet_num ) == $index ) {
$this->wallet_type = $value;
$found_any = true;
} elseif ( ( 'WALLETID' . $wallet_num ) == $index ) {
$this->wallet_id = $value;
$found_any = true;
} elseif ( ( 'WALLETDESCRIPTION' . $wallet_num ) == $index ) {
$this->wallet_description = $value;
$found_any = true;
}
}
return $found_any;
}
}
class PayPal_Checkout_Payer_Details {
public $phone_number = false;
public $email = false;
public $payer_id = false;
public $payer_status = false;
const PayerStatusVerified = 'verified';
const PayerStatusUnverified = 'unverified';
public $country = false;
public $business_name = false;
public $first_name = false;
public $last_name = false;
public $middle_name = false;
public $suffix = false;
public $billing_address = false;
// Returns true to indicate that the getECResponse array contained variables that were pertinent to this object.
// If not, it returns false to indicate that the caller can destroy this object.
public function loadFromGetECResponse( $getECResponse ) {
$map = array(
'PHONENUM' => 'phone_number',
'EMAIL' => 'email',
'PAYERID' => 'payer_id',
'PAYERSTATUS' => 'payer_status',
'COUNTRYCODE' => 'country',
'BUSINESS' => 'business_name',
'FIRSTNAME' => 'first_name',
'MIDDLENAME' => 'middle_name',
'LASTNAME' => 'last_name',
'SUFFIX' => 'suffix'
);
$found_any = false;
// At the same time, see if we have a billing address that needs to be parsed out.
$billing_address_present = false;
foreach ( $getECResponse as $index => $value ) {
if ( array_key_exists( $index, $map ) ) {
$this->{ $map[ $index ] } = $value;
$found_any = true;
}
if ( preg_match( '/^BILLTONAME|STREET|STREET2|CITY|STATE|ZIP|COUNTRY|COUNTRYNAME|ADDRESSOWNER|ADDRESSSTATUS$/', $index ) ) {
$billing_address_present = true;
}
}
if ( $billing_address_present ) {
$this->billing_address = new PayPal_Address();
if ( $this->billing_address->loadFromGetECResponse( $getECResponse, '', true ) ) {
$found_any = true;
} else {
$this->billing_address = false;
}
}
return $found_any;
}
}
class PayPal_Checkout_Gift_Details {
public $gift_message = false;
public $gift_receipt_enabled = false;
public $gift_wrap_name = false;
public $gift_wrap_amount = false;
// Returns true to indicate that the getECResponse array contained variables that were pertinent to this object.
// If not, it returns false to indicate that the caller can destroy this object.
public function loadFromGetECResponse( $getECResponse ) {
$map = array(
'GIFTMESSAGE' => 'gift_message',
'GIFTWRAPNAME' => 'gift_wrap_name',
'GIFTRECEIPTENABLE' => 'gift_receipt_enabled',
'GIFTWRAPAMOUNT' => 'gift_wrap_amount'
);
$found_any = false;
foreach ( $getECResponse as $index => $value ) {
if ( array_key_exists( $index, $map ) ) {
$this->{ $map[ $index ] } = $value;
$found_any = true;
}
}
return $found_any;
}
}