Changeset 2891510
- Timestamp:
- 03/31/2023 06:42:38 PM (3 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
sagepay-direct-gateway-for-gravity-forms/tags/1.0.0/class-gf-sagepay-direct.php
r2072830 r2891510 29 29 protected $_capabilities_uninstall = 'gravityforms_sagepay_direct_uninstall'; 30 30 protected $_capabilities_plugin_page = 'gravityforms_sagepay_direct_plugin_page'; 31 32 // Automatic upgrade enabled33 protected $_enable_rg_autoupgrade = false;34 31 35 32 /** … … 160 157 //use the custom settings if found, otherwise use the master plugin settings 161 158 162 $apiSettingsEnabled = $this->current_feed['meta']['apiSettingsEnabled']; 163 164 if ( $apiSettingsEnabled ) { 159 160 if ( isset($this->current_feed['meta']['apiSettingsEnabled']) && !empty($this->current_feed['meta']['apiSettingsEnabled']) ) { 165 161 166 162 $vendorname = $this->current_feed['meta']['overrideVendorName']; … … 214 210 $default_settings = $this->replace_field( 'transactionType', $transaction_type, $default_settings ); 215 211 212 $default_settings[3]['fields'][0]['field_map'][] = array('label' => 'First Name', 'name' => 'first_name','required' => '' ); 213 214 $default_settings[3]['fields'][0]['field_map'][] = array('label' => 'Last Name', 'name' => 'last_name','required' => '' ); 216 215 217 216 //remove default options before adding custom … … 232 231 $default_settings = $this->add_field_after( 'billingInformation', $fields, $default_settings ); 233 232 234 $fields = array(235 array(236 'name' => 'apiSettingsEnabled',237 'label' => esc_html__( 'API Settings', 'gf-sagepay-direct-patsatech' ),238 'type' => 'checkbox',239 'tooltip' => '<h6>' . esc_html__( 'API Settings', 'gf-sagepay-direct-patsatech' ) . '</h6>' . esc_html__( 'Override the settings provided on the SagePay Direct Settings page and use these instead for this feed.', 'gf-sagepay-direct-patsatech' ),240 'onchange' => "if(jQuery(this).prop('checked')){241 jQuery('#gaddon-setting-row-overrideVendorName').show();242 jQuery('#gaddon-setting-row-overrideTransactionType').show();243 } else {244 jQuery('#gaddon-setting-row-overrideVendorName').hide();245 jQuery('#gaddon-setting-row-overrideTransactionType').hide();246 jQuery('#overrideVendorName').val('');247 jQuery('#overrideTransactionType').val('');248 jQuery('i').removeClass('icon-check fa-check');249 }",250 'choices' => array(251 array(252 'label' => 'Override Default Settings',253 'name' => 'apiSettingsEnabled',254 ),255 )256 ),257 array(258 'name' => 'overrideMode',259 'label' => esc_html__( 'Mode', 'gf-sagepay-direct-patsatech' ),260 'type' => 'radio',261 'default_value' => 'test',262 'hidden' => ! $this->get_setting( 'apiSettingsEnabled' ),263 'tooltip' => '<h6>' . esc_html__( 'Mode', 'gf-sagepay-direct-patsatech' ) . '</h6>' . esc_html__( 'Select either Production or Test mode to override the chosen mode on the QBMS (Intuit) Settings page.', 'gf-sagepay-direct-patsatech' ),264 'choices' => array(265 array(266 'label' => esc_html__( 'Production', 'gf-sagepay-direct-patsatech' ),267 'value' => 'production',268 ),269 array(270 'label' => esc_html__( 'Test', 'gf-sagepay-direct-patsatech' ),271 'value' => 'test',272 ),273 ),274 'horizontal' => true,275 ),276 array(277 'name' => 'overrideVendorName',278 'label' => esc_html__( 'Vendor Name', 'gf-sagepay-direct-patsatech' ),279 'type' => 'text',280 'class' => 'medium',281 'hidden' => ! $this->get_setting( 'apiSettingsEnabled' ),282 'tooltip' => '<h6>' . esc_html__( 'Vendor Name', 'gf-sagepay-direct-patsatech' ) . '</h6>' . esc_html__( 'Please enter your vendor name provided by SagePay.', 'gf-sagepay-direct-patsatech' ),283 ),284 array(285 'name' => 'overrideTransactionType',286 'label' => esc_html__( 'Mode', 'gf-sagepay-direct-patsatech' ),287 'type' => 'radio',288 'default_value' => 'test',289 'hidden' => ! $this->get_setting( 'apiSettingsEnabled' ),290 'tooltip' => '<h6>' . esc_html__( 'Transaction Type', 'gf-sagepay-direct-patsatech' ) . '</h6>' . esc_html__( 'Select Payment, Deferred or Authenticated.', 'gf-sagepay-direct-patsatech' ),291 'choices' => array(292 array(293 'label' => esc_html__( 'Payment', 'gf-sagepay-direct-patsatech' ),294 'value' => 'PAYMENT',295 ),296 array(297 'label' => esc_html__( 'Deferred', 'gf-sagepay-direct-patsatech' ),298 'value' => 'DEFFERRED',299 ),300 array(301 'label' => esc_html__( 'Authenticate', 'gf-sagepay-direct-patsatech' ),302 'value' => 'AUTHENTICATE',303 ),304 ),305 'horizontal' => true,306 ),307 );308 309 $default_settings = $this->add_field_after( 'conditionalLogic', $fields, $default_settings );310 233 311 234 return $default_settings; 312 235 } 313 314 236 315 237 316 238 public function settings_options($field, $echo = true) 317 239 { 318 $checkboxes = array( 319 'name' => 'delay_notification', 320 'type' => 'checkboxes', 321 'onclick' => 'ToggleNotifications();', 322 'choices' => array( 323 array( 324 'label' => __('Send notifications only when payment is received.', 'gf-sagepay-direct-patsatech'), 325 'name' => 'delayNotification', 326 ), 327 ) 328 ); 329 330 $html = $this->settings_checkbox($checkboxes, false); 331 332 $html .= $this->settings_hidden(array( 'name' => 'selectedNotifications', 'id' => 'selectedNotifications' ), false); 333 334 $form = $this->get_current_form(); 335 $has_delayed_notifications = $this->get_setting('delayNotification'); 336 ob_start(); ?> 337 <ul id="gf_sagepay_direct_notification_container" style="padding-left:20px; margin-top:10px; <?php echo $has_delayed_notifications ? '' : 'display:none;' ?>"> 240 $checkboxes = array( 241 'name' => 'delay_notification', 242 'type' => 'checkboxes', 243 'onclick' => 'ToggleNotifications();', 244 'choices' => array( 245 array( 246 'label' => __('Send notifications only when payment is received.', 'gf-sagepay-direct-patsatech'), 247 'name' => 'delayNotification', 248 ), 249 ) 250 ); 251 252 $html = $this->settings_checkbox($checkboxes, false); 253 254 $html .= $this->settings_hidden(array( 'name' => 'selectedNotifications', 'id' => 'selectedNotifications' ), false); 255 256 $form = $this->get_current_form(); 257 $has_delayed_notifications = $this->get_setting('delayNotification'); 258 ob_start(); ?> 259 <ul id="gf_sagepay_direct_notification_container" style="padding-left:20px; margin-top:10px; <?php echo $has_delayed_notifications ? '' : 'display:none;' ?>"> 260 <?php 261 if (! empty($form) && is_array($form['notifications'])) { 262 $selected_notifications = $this->get_setting('selectedNotifications'); 263 if (! is_array($selected_notifications)) { 264 $selected_notifications = array(); 265 } 266 267 //$selected_notifications = empty($selected_notifications) ? array() : json_decode($selected_notifications); 268 269 foreach ($form['notifications'] as $notification) { 270 ?> 271 <li class="gf_sagepay_direct_notification"> 272 <input type="checkbox" class="notification_checkbox" value="<?php echo $notification['id'] ?>" onclick="SaveNotifications();" <?php checked(true, in_array($notification['id'], $selected_notifications)) ?> /> 273 <label class="inline" for="gf_sagepay_selected_notifications"><?php echo $notification['name']; ?></label> 274 </li> 275 <?php 276 } 277 } ?> 278 </ul> 279 <script type='text/javascript'> 280 function SaveNotifications() { 281 var notifications = []; 282 jQuery('.notification_checkbox').each(function () { 283 if (jQuery(this).is(':checked')) { 284 notifications.push(jQuery(this).val()); 285 } 286 }); 287 jQuery('#selectedNotifications').val(jQuery.toJSON(notifications)); 288 } 289 290 function ToggleNotifications() { 291 292 var container = jQuery('#gf_sagepay_direct_notification_container'); 293 var isChecked = jQuery('#delaynotification').is(':checked'); 294 295 if (isChecked) { 296 container.slideDown(); 297 jQuery('.gf_sagepay_direct_notification input').prop('checked', true); 298 } 299 else { 300 container.slideUp(); 301 jQuery('.gf_sagepay_direct_notification input').prop('checked', false); 302 } 303 304 SaveNotifications(); 305 } 306 </script> 338 307 <?php 339 if (! empty($form) && is_array($form['notifications'])) { 340 $selected_notifications = $this->get_setting('selectedNotifications'); 341 if (! is_array($selected_notifications)) { 342 $selected_notifications = array(); 343 } 344 345 //$selected_notifications = empty($selected_notifications) ? array() : json_decode($selected_notifications); 346 347 foreach ($form['notifications'] as $notification) { 348 ?> 349 <li class="gf_sagepay_direct_notification"> 350 <input type="checkbox" class="notification_checkbox" value="<?php echo $notification['id'] ?>" onclick="SaveNotifications();" <?php checked(true, in_array($notification['id'], $selected_notifications)) ?> /> 351 <label class="inline" for="gf_sagepay_selected_notifications"><?php echo $notification['name']; ?></label> 352 </li> 353 <?php 354 } 355 } ?> 356 </ul> 357 <script type='text/javascript'> 358 function SaveNotifications() { 359 var notifications = []; 360 jQuery('.notification_checkbox').each(function () { 361 if (jQuery(this).is(':checked')) { 362 notifications.push(jQuery(this).val()); 363 } 364 }); 365 jQuery('#selectedNotifications').val(jQuery.toJSON(notifications)); 366 } 367 368 function ToggleNotifications() { 369 370 var container = jQuery('#gf_sagepay_direct_notification_container'); 371 var isChecked = jQuery('#delaynotification').is(':checked'); 372 373 if (isChecked) { 374 container.slideDown(); 375 jQuery('.gf_sagepay_direct_notification input').prop('checked', true); 376 } 377 else { 378 container.slideUp(); 379 jQuery('.gf_sagepay_direct_notification input').prop('checked', false); 380 } 381 382 SaveNotifications(); 383 } 384 </script> 385 <?php 386 387 $html .= ob_get_clean(); 388 389 if ($echo) { 390 echo $html; 391 } 392 393 return $html; 308 309 $html .= ob_get_clean(); 310 311 if ($echo) { 312 echo $html; 313 } 314 315 return $html; 394 316 } 395 317 … … 454 376 455 377 return array( 456 'complete_payment' => esc_html__( 'Payment Completed', 'gf-sagepay-direct-patsatech' ), 378 'complete_payment' => esc_html__( 'Payment Completed', 'gf-sagepay-direct-patsatech' ), 379 'fail_payment' => esc_html__( 'Payment Failed', 'gf-sagepay-direct-patsatech' ), 457 380 ); 458 381 } 459 460 // used to upgrade old feeds into new version 461 public function get_old_feeds() { 462 global $wpdb; 463 $table_name = $wpdb->prefix . 'rg_mondca'; 464 465 if ( ! $this->table_exists( $table_name ) ) { 466 return false; 467 } 468 469 $form_table_name = RGFormsModel::get_form_table_name(); 470 $sql = "SELECT s.id, s.is_active, s.form_id, s.meta, f.title as form_title 471 FROM $table_name s 472 INNER JOIN $form_table_name f ON s.form_id = f.id"; 473 474 $results = $wpdb->get_results( $sql, ARRAY_A ); 475 476 $count = sizeof( $results ); 477 $this->log_debug( __METHOD__ . "(): {$count} feed(s) found to copy." ); 478 for ( $i = 0; $i < $count; $i ++ ) { 479 $results[ $i ]['meta'] = maybe_unserialize( $results[ $i ]['meta'] ); 480 } 481 482 return $results; 483 } 484 485 public function convert_interval( $interval, $to_type ) { 486 //convert single character into long text for new feed settings or convert long text into single character for sending to paypal 487 //$to_type: text (change character to long text), OR char (change long text to character) 488 if ( empty( $interval ) ) { 489 return ''; 490 } 491 492 $new_interval = ''; 493 if ( $to_type == 'text' ) { 494 //convert single char to text 495 switch ( strtoupper( $interval ) ) { 496 case 'D' : 497 $new_interval = 'day'; 498 break; 499 case 'W' : 500 $new_interval = 'week'; 501 break; 502 case 'M' : 503 $new_interval = 'month'; 504 break; 505 case 'Y' : 506 $new_interval = 'year'; 507 break; 508 default : 509 $new_interval = $interval; 510 break; 382 383 384 385 private function getRequestHeaders() { 386 $headers = array(); 387 foreach($_SERVER as $key => $value) { 388 if (substr($key, 0, 5) <> 'HTTP_') { 389 continue; 511 390 } 512 } else { 513 //convert text to single char 514 switch ( strtolower( $interval ) ) { 515 case 'day' : 516 $new_interval = 'D'; 517 break; 518 case 'week' : 519 $new_interval = 'W'; 520 break; 521 case 'month' : 522 $new_interval = 'M'; 523 break; 524 case 'year' : 525 $new_interval = 'Y'; 526 break; 527 default : 528 $new_interval = $interval; 529 break; 530 } 531 } 532 533 return $new_interval; 534 } 535 536 public function upgrade( $previous_version ) { 537 538 if ( empty( $previous_version ) ) { 539 $previous_version = get_option( 'gf_mondca_version' ); 540 } 541 $previous_is_pre_addon_framework = ! empty( $previous_version ) && version_compare( $previous_version, '2.0.dev1', '<' ); 542 543 if ( $previous_is_pre_addon_framework ) { 544 $this->log_debug( __METHOD__ . '(): Copying over data to new table structure.' ); 545 546 $old_feeds = $this->get_old_feeds(); 547 if ( $old_feeds ) { 548 $this->log_debug( __METHOD__ . '(): Migrating feeds.' ); 549 550 $counter = 1; 551 foreach ( $old_feeds as $old_feed ) { 552 $feed_name = 'Feed ' . $counter; 553 $form_id = $old_feed['form_id']; 554 $is_active = $old_feed['is_active']; 555 $customer_fields = rgar( $old_feed['meta'], 'customer_fields' ); 556 557 $new_meta = array( 558 'feedName' => $feed_name, 559 'transactionType' => rgar( $old_feed['meta'], 'type' ), 560 'enableReceipt' => rgar( $old_feed['meta'], 'enable_receipt' ), 561 'change_post_status' => rgar( $old_feed['meta'], 'update_post_action' ) ? '1' : '0', 562 'update_post_action' => rgar( $old_feed['meta'], 'update_post_action' ), 563 'recurringAmount' => rgar( $old_feed['meta'], 'recurring_amount_field' ) == 'all' ? 'form_total' : rgar( $old_feed['meta'], 'recurring_amount_field' ), 564 'recurringTimes' => rgar( $old_feed['meta'], 'recurring_times' ), 565 'paymentAmount' => 'form_total', 566 //default to this for new field in framework version 567 'billingCycle_length' => rgar( $old_feed['meta'], 'billing_cycle_number' ), 568 'billingCycle_unit' => $this->convert_interval( rgar( $old_feed['meta'], 'billing_cycle_type' ), 'text' ), 569 'setupFee_enabled' => rgar( $old_feed['meta'], 'setup_fee_enabled' ), 570 'setupFee_product' => rgar( $old_feed['meta'], 'setup_fee_amount_field' ), 571 //trial_period_number is always set to 1 in the old version, no need to use trial_period_number in the database 572 'trial_enabled' => rgar( $old_feed['meta'], 'trial_period_enabled' ), 573 'trial_product' => 'enter_amount', 574 //default to this for new field in framework version 575 'trial_amount' => rgar( $old_feed['meta'], 'trial_amount' ), 576 'billingInformation_firstName' => rgar( $customer_fields, 'first_name' ), 577 'billingInformation_lastName' => rgar( $customer_fields, 'last_name' ), 578 'billingInformation_email' => rgar( $customer_fields, 'email' ), 579 'billingInformation_address' => rgar( $customer_fields, 'address1' ), 580 'billingInformation_address2' => rgar( $customer_fields, 'address2' ), 581 'billingInformation_city' => rgar( $customer_fields, 'city' ), 582 'billingInformation_state' => rgar( $customer_fields, 'state' ), 583 'billingInformation_zip' => rgar( $customer_fields, 'zip' ), 584 'billingInformation_country' => rgar( $customer_fields, 'country' ), 585 'apiSettingsEnabled' => rgar( $old_feed['meta'], 'api_settings_enabled' ), 586 'overrideVendorName' => rgar( $old_feed['meta'], 'vendorname' ), 587 'overrideTransactionType' => rgar( $old_feed['meta'], 'transactiontype' ), 588 'overrideMode' => rgar( $old_feed['meta'], 'mode' ), 589 'delayNotification' => rgar($old_feed['meta'], 'delay_notifications'), 590 'selectedNotifications' => rgar($old_feed['meta'], 'selected_notifications'), 591 ); 592 593 $optin_enabled = rgar( $old_feed['meta'], 'mondca_conditional_enabled' ); 594 if ( $optin_enabled ) { 595 $new_meta['feed_condition_conditional_logic'] = 1; 596 $new_meta['feed_condition_conditional_logic_object'] = array( 597 'conditionalLogic' => array( 598 'actionType' => 'show', 599 'logicType' => 'all', 600 'rules' => array( 601 array( 602 'fieldId' => $old_feed['meta']['mondca_conditional_field_id'], 603 'operator' => $old_feed['meta']['mondca_conditional_operator'], 604 'value' => $old_feed['meta']['mondca_conditional_value'], 605 ), 606 ) 607 ) 608 ); 609 } else { 610 $new_meta['feed_condition_conditional_logic'] = 0; 611 } 612 613 $this->insert_feed( $form_id, $is_active, $new_meta ); 614 $counter ++; 615 616 } 617 } 618 619 $old_settings = get_option( 'gf_mondca_settings' ); 620 621 if ( ! empty( $old_settings ) ) { 622 $this->log_debug( __METHOD__ . '(): Copying plugin settings.' ); 623 $new_settings = array( 624 'vendorname' => rgar( $old_settings, 'vendorname' ), 625 'transactiontype' => rgar( $old_settings, 'transactiontype' ), 626 'mode' => rgar( $old_settings, 'mode' ), 627 ); 628 629 parent::update_plugin_settings( $new_settings ); 630 } 631 632 //copy existing SagePay Direct transactions to new table 633 $this->copy_transactions(); 634 635 } 636 637 } 638 639 public function copy_transactions() { 640 //copy transactions from the SagePay Direct transaction table to the addon payment transaction table 641 global $wpdb; 642 $old_table_name = $this->get_old_transaction_table_name(); 643 644 if ( ! $this->table_exists( $old_table_name ) ) { 645 return false; 646 } 647 648 $this->log_debug( __METHOD__ . '(): Copying old SagePay Direct transactions into new table structure.' ); 649 650 $new_table_name = $this->get_new_transaction_table_name(); 651 652 $sql = "INSERT INTO {$new_table_name} (lead_id, transaction_type, transaction_id, is_recurring, amount, date_created) 653 SELECT entry_id, transaction_type, transaction_id, is_renewal, amount, date_created FROM {$old_table_name}"; 654 655 $wpdb->query( $sql ); 656 657 $this->log_debug( __METHOD__ . "(): Transactions: {$wpdb->rows_affected} rows were added." ); 658 } 659 660 public function get_old_transaction_table_name() { 661 global $wpdb; 662 663 return $wpdb->prefix . 'rg_mondca_transaction'; 664 } 665 666 public function get_new_transaction_table_name() { 667 global $wpdb; 668 669 return $wpdb->prefix . 'gf_addon_payment_transaction'; 670 } 391 $header = str_replace(' ', '-', ucwords(str_replace('_', ' ', strtolower(substr($key, 5))))); 392 $headers[$header] = $value; 393 } 394 return $headers; 395 } 396 397 398 public static function get_ip_address() { 399 if ( isset( $_SERVER['HTTP_X_REAL_IP'] ) ) { 400 return sanitize_text_field( wp_unslash( $_SERVER['HTTP_X_REAL_IP'] ) ); 401 } elseif ( isset( $_SERVER['HTTP_X_FORWARDED_FOR'] ) ) { 402 // Proxy servers can send through this header like this: X-Forwarded-For: client1, proxy1, proxy2 403 // Make sure we always only send through the first IP in the list which should always be the client IP. 404 return (string) rest_is_ip_address( trim( current( preg_split( '/,/', sanitize_text_field( wp_unslash( $_SERVER['HTTP_X_FORWARDED_FOR'] ) ) ) ) ) ); 405 } elseif ( isset( $_SERVER['REMOTE_ADDR'] ) ) { 406 return sanitize_text_field( wp_unslash( $_SERVER['REMOTE_ADDR'] ) ); 407 } 408 return ''; 409 } 410 411 412 413 414 671 415 672 416 … … 676 420 $txnArray = $this->get_payment_transaction( $feed, $submission_data, $form, $entry ); 677 421 678 $config = $this->get_config( $feed, $submission_data );679 $form_data = $this->get_form_data( $submission_data, $form, $config );680 681 422 $names = $this->get_first_last_name( $submission_data['card_name'] ); 682 423 424 if( isset($entry[$feed['meta']['billingInformation_first_name']]) ){ 425 $names['first_name'] = $entry[$feed['meta']['billingInformation_first_name']]; 426 } 427 428 $ship_last_name = ''; 429 if( isset($entry[$feed['meta']['billingInformation_last_name']]) ){ 430 $names['last_name'] = $entry[$feed['meta']['billingInformation_last_name']]; 431 } 432 433 $ipn_url = get_bloginfo('url') . '/?page=gf_sagepay_direct_ipn'; 434 683 435 $settings = $this->get_aim(); 684 436 685 $entry_id = GFAPI::add_entry( $entry ); 686 $entry = GFAPI::get_entry( $entry_id ); 687 688 $credit_card = preg_replace( '/(?<=\d)\s+(?=\d)/', '', trim( $txnArray['card'] ) ); 689 $month = $txnArray['month']; 690 $year = $txnArray['year']; 437 //$entry_id = GFAPI::add_entry( $entry ); 438 //$entry_id = $entry['id']; 439 //$entry = GFAPI::get_entry( $entry_id ); 440 441 $credit_card = preg_replace( '/(?<=\d)\s+(?=\d)/', '', trim( $txnArray['card'] ) ); 442 $month = $txnArray['month']; 443 $year = $txnArray['year']; 691 444 692 445 $amt = $txnArray['amount']; 693 $order_id = $entry_id; 446 694 447 $currency = GFCommon::get_currency(); 695 448 … … 702 455 703 456 $time_stamp = date("ymdHis"); 704 $orderid = $settings['vendorname'] . "-" . $time_stamp . "-" . $order_id;457 $orderid = $settings['vendorname'] . "-" . $time_stamp ; 705 458 706 459 $sd_arg['ReferrerID'] = 'CC923B06-40D5-4713-85C1-700D690550BF'; … … 746 499 $sd_arg['CV2'] = $txnArray['cvv']; 747 500 $sd_arg['CardType'] = $cardtype; 748 $sd_arg['VPSProtocol'] = " 3.00";501 $sd_arg['VPSProtocol'] = "4.00"; 749 502 $sd_arg['Vendor'] = $settings['vendorname']; 750 503 $sd_arg['Description'] = sprintf(__('Order #%s', 'woo-sagepay-patsatech'), $orderid); … … 754 507 //$sd_arg['Basket'] = $basket; 755 508 509 $header = $this->getRequestHeaders(); 510 511 $sd_arg['ClientIPAddress'] = $this->get_ip_address(); 512 $sd_arg['BrowserJavascriptEnabled'] = 0; 513 $sd_arg['BrowserAcceptHeader'] = $header['Accept']; 514 $sd_arg['BrowserLanguage'] = substr($header['Accept-Language'], 0, 2); 515 $sd_arg['BrowserUserAgent'] = $header['User-Agent']; 516 $sd_arg['ThreeDSNotificationURL'] = $ipn_url; 517 $sd_arg['ChallengeWindowSize'] = "05"; 518 519 520 $this->log_error( __METHOD__ . '(): Request from Opayo => ' . print_r($sd_arg,true) ); 521 756 522 $post_values = ""; 757 523 foreach ($sd_arg as $key => $value) { … … 772 538 )); 773 539 774 $wpd_session['sagepay_vtc'] = $orderid; 775 $wpd_session['sagepay_oid'] = $order_id; 776 777 $ipn_url = get_bloginfo('url') . '/?page=gf_sagepay_direct_ipn'; 778 779 if (!is_wp_error($response) && $response['response']['code'] >= 200 && $response['response']['code'] < 300) { 780 $resp = array(); 781 $lines = preg_split('/\r\n|\r|\n/', $response['body']); 782 foreach ($lines as $line) { 783 $key_value = preg_split('/=/', $line, 2); 784 if (count($key_value) > 1) { 785 $resp[trim($key_value[0])] = trim($key_value[1]); 786 } 787 } 788 789 if ($resp['Status'] == "OK" || $resp['Status'] == "REGISTERED" || $resp['Status'] == "AUTHENTICATED") { 790 791 set_transient('sagepay_direct', $wpd_session, 60*60); 792 793 wp_redirect($ipn_url.'&sagepay_status=complete'); exit; 794 795 } elseif ($resp['Status'] == "3DAUTH") { 796 if ($resp['3DSecureStatus'] == 'OK') { 797 if (isset($resp['ACSURL']) && isset($resp['MD'])) { 798 $wpd_session['sagepay_acsurl'] = $resp['ACSURL']; 799 $wpd_session['sagepay_pareq'] = $resp['PAReq']; 800 $wpd_session['sagepay_md'] = $resp['MD']; 801 802 set_transient('sagepay_direct', $wpd_session, 60*60); 803 804 $this->log_error( __METHOD__ . '(): Response => ' .sprintf(__("SagePay Direct Payment Intiated waiting for 3D Secure response. Transaction Id: %s", "gf-sagepay-direct-patsatech"), $orderid) ); 805 806 $auth = array( 807 'is_authorized' => false, 808 'transaction_id' => $orderid, 809 'error_message' => 'SagePay Direct Payment Intiated waiting for 3D Secure response.' 810 ); 811 812 GFPaymentAddOn::add_note($entry['id'], sprintf(__("SagePay Direct Payment Intiated waiting for 3D Secure response. Transaction Id: %s", "gf-sagepay-direct-patsatech"), $orderid)); 813 814 echo '<!DOCTYPE html> 815 <html> 816 <head> 817 <script> 818 window.onload = function(e){ 819 document.getElementById("sagepay_direct_payment_form").submit(); 820 } 821 </script> 822 </head> 823 <body> 824 <form action="'.$wpd_session['sagepay_acsurl'].'" method="post" name="sagepay_direct_payment_form" target="_self" id="sagepay_direct_payment_form" > 825 <input type="hidden" name="PaReq" value="'. $wpd_session['sagepay_pareq'] .'" /> 826 <input type="hidden" name="MD" value="'. $wpd_session['sagepay_md'] .'" /> 827 <input type="hidden" name="TermUrl" value="'. $ipn_url .'" /> 828 <input type="submit" /> 829 <b> Please wait while you are being redirected.</b> 830 </form> 831 </body> 832 </html>'; 833 834 exit; 835 836 } 837 } 838 } else { 839 if (isset($resp['StatusDetail'])) { 840 $error = sprintf(__('Transaction Failed. %s - %s', 'woo-sagepay-patsatech'), $resp['Status'], $resp['StatusDetail']); 841 842 $this->log_error( __METHOD__ . '(): '.$error ); 843 844 GFPaymentAddOn::add_note($entry['id'], 'Payment failed. Response => '.$error ); 845 846 $auth = array( 847 'is_authorized' => false, 848 //'transaction_id' => $orderid, 849 'error_message' => 'Payment failed. Response => '.$error 850 ); 851 852 } else { 853 $error = sprintf(__('Transaction Failed with %s - unknown error.', 'woo-sagepay-patsatech'), $resp['Status']); 854 855 $this->log_error( __METHOD__ . '(): '.$error ); 856 857 GFPaymentAddOn::add_note($entry['id'], 'Payment failed. Response => '.$error ); 858 859 $auth = array( 860 'is_authorized' => false, 861 //'transaction_id' => $orderid, 862 'error_message' => 'Payment failed. Response => '.$error 863 ); 864 } 865 } 866 } else { 867 $error = __('Gateway Error. Please Notify the Store Owner about this error.', 'woo-sagepay-patsatech'); 868 869 $this->log_error( __METHOD__ . '(): '.$error ); 870 871 GFPaymentAddOn::add_note($entry['id'], $error ); 872 873 $auth = array( 874 'is_authorized' => false, 875 //'transaction_id' => $orderid, 876 'error_message' => $error 877 ); 878 } 540 $wpd_session['sagepay_vtc'] = $orderid; 541 542 $wpd_session['sagepay_amount'] = $amt; 543 544 if (!is_wp_error($response) && $response['response']['code'] >= 200 && $response['response']['code'] < 300) { 545 $resp = array(); 546 $lines = preg_split('/\r\n|\r|\n/', $response['body']); 547 foreach ($lines as $line) { 548 $key_value = preg_split('/=/', $line, 2); 549 if (count($key_value) > 1) { 550 $resp[trim($key_value[0])] = trim($key_value[1]); 551 } 552 } 553 554 set_transient('sagepay_response', $resp, 60*60); 555 556 $this->log_error( __METHOD__ . '(): Response from Opayo => ' . print_r($resp,true) ); 557 558 if ($resp['Status'] == "OK" || $resp['Status'] == "REGISTERED" || $resp['Status'] == "AUTHENTICATED") { 559 560 set_transient('sagepay_direct', $wpd_session, 60*60); 561 562 $auth = array( 563 'is_authorized' => true, 564 'transaction_id' => $orderid, 565 'captured_payment' => array( 566 'is_success' => true, 567 'error_message' => '', 568 'transaction_id' => $orderid, 569 'amount' => $amt 570 ), 571 ); 572 573 574 575 576 } elseif ($resp['Status'] == "3DAUTH") { 577 if ($resp['3DSecureStatus'] == 'OK') { 578 if (isset($resp['ACSURL']) && ( isset($resp['MD']) || isset($resp['CReq']) )) { 579 580 $entry_id = GFAPI::add_entry( $entry ); 581 $entry = GFAPI::get_entry( $entry_id ); 582 $wpd_session['sagepay_oid'] = $entry_id; 583 584 $wpd_session['sagepay_acsurl'] = $resp['ACSURL']; 585 586 if( isset($resp['PAReq']) && !empty($resp['PAReq']) ){ 587 $wpd_session['sagepay_pareq'] = $resp['PAReq']; 588 } 589 590 if( isset($resp['CReq']) && !empty($resp['CReq']) ){ 591 $wpd_session['sagepay_pareq'] = ""; 592 $wpd_session['sagepay_creq'] = $resp['CReq']; 593 } 594 595 if( isset($resp['MD']) && !empty($resp['MD']) ){ 596 $wpd_session['sagepay_md'] = $resp['MD']; 597 } 598 599 $wpd_session['sagepay_vpstxid'] = $resp['VPSTxId']; 600 601 set_transient('sagepay_direct', $wpd_session, 60*60); 602 603 $this->log_error( __METHOD__ . '(): Response => ' .sprintf(__("SagePay Direct Payment Intiated waiting for 3D Secure response. Transaction Id: %s", "gf-sagepay-direct-patsatech"), $orderid) ); 604 605 $auth = array( 606 'is_authorized' => false, 607 'transaction_id' => $orderid, 608 'error_message' => 'SagePay Direct Payment Intiated waiting for 3D Secure response.' 609 ); 610 611 GFPaymentAddOn::add_note($entry['id'], sprintf(__("SagePay Direct Payment Intiated waiting for 3D Secure response. Transaction Id: %s", "gf-sagepay-direct-patsatech"), $orderid)); 612 613 614 wp_redirect($ipn_url.'&sagepay_status=3ds'); exit; 615 616 } 617 } 618 } else { 619 620 if (isset($resp['StatusDetail'])) { 621 $error = sprintf(__('Transaction Failed. %s - %s', 'woo-sagepay-patsatech'), $resp['Status'], $resp['StatusDetail']); 622 623 $this->log_error( __METHOD__ . '(): '.$error ); 624 625 $auth = array( 626 'is_authorized' => false, 627 //'transaction_id' => $orderid, 628 'error_message' => 'Payment failed. Response => '.$error 629 ); 630 631 } else { 632 $error = sprintf(__('Transaction Failed with %s - unknown error.', 'woo-sagepay-patsatech'), $resp['Status']); 633 634 $this->log_error( __METHOD__ . '(): '.$error ); 635 636 $auth = array( 637 'is_authorized' => false, 638 //'transaction_id' => $orderid, 639 'error_message' => 'Payment failed. Response => '.$error 640 ); 641 } 642 } 643 } else { 644 645 $error = __('Gateway Error. Please Notify the Store Owner about this error.', 'woo-sagepay-patsatech'); 646 647 $this->log_error( __METHOD__ . '(): '.$error ); 648 649 $auth = array( 650 'is_authorized' => false, 651 //'transaction_id' => $orderid, 652 'error_message' => $error 653 ); 654 } 879 655 880 656 return $auth; … … 961 737 } 962 738 963 // Convert submission_data into form_data for hooks backwards compatibility964 private function get_form_data( $submission_data, $form, $config ) {965 966 $form_data = array();967 968 // getting billing information969 $form_data['form_title'] = $submission_data['form_title'];970 $form_data['email'] = $submission_data['email'];971 $form_data['address1'] = $submission_data['address'];972 $form_data['address2'] = $submission_data['address2'];973 $form_data['city'] = $submission_data['city'];974 $form_data['state'] = $submission_data['state'];975 $form_data['zip'] = $submission_data['zip'];976 $form_data['country'] = $submission_data['country'];977 $form_data['phone'] = $submission_data['phone'];978 979 $form_data['card_number'] = $submission_data['card_number'];980 $form_data['expiration_date'] = $submission_data['card_expiration_date'];981 $form_data['security_code'] = $submission_data['card_security_code'];982 $names = $this->get_first_last_name( $submission_data['card_name'] );983 $form_data['first_name'] = $names['first_name'];984 $form_data['last_name'] = $names['last_name'];985 986 // form_data line items987 $i = 0;988 foreach ( $submission_data['line_items'] as $line_item ) {989 $form_data['line_items'][ $i ]['item_id'] = $line_item['id'];990 $form_data['line_items'][ $i ]['item_name'] = $line_item['name'];991 $form_data['line_items'][ $i ]['item_description'] = $line_item['description'];992 $form_data['line_items'][ $i ]['item_quantity'] = $line_item['quantity'];993 $form_data['line_items'][ $i ]['item_unit_price'] = $line_item['unit_price'];994 $form_data['line_items'][ $i ]['item_taxable'] = 'Y';995 $i ++;996 }997 998 $form_data['amount'] = $submission_data['payment_amount'];999 $form_data['fee_amount'] = $submission_data['setup_fee'];1000 1001 // need an easy way to filter the order info as it is not modifiable once it is added to the transaction object1002 $form_data = gf_apply_filters( 'gform_mondca_form_data', $form['id'], $form_data, $form, $config );1003 1004 return $form_data;1005 }1006 1007 // Convert feed into config for hooks backwards compatibility1008 private function get_config( $feed, $submission_data ) {1009 1010 $config = array();1011 1012 $config['id'] = $feed['id'];1013 $config['form_id'] = $feed['form_id'];1014 $config['is_active'] = $feed['is_active'];1015 1016 $config['meta']['type'] = rgar( $feed['meta'], 'transactionType' );1017 $config['meta']['enable_receipt'] = rgar( $feed['meta'], 'enableReceipt' );1018 $config['meta']['update_post_action'] = rgar( $feed['meta'], 'update_post_action' );1019 1020 $config['meta']['mondca_conditional_enabled'] = rgar( $feed['meta'], 'feed_condition_conditional_logic' );1021 if ( $feed['meta']['feed_condition_conditional_logic'] ) {1022 $config['meta']['mondca_conditional_field_id'] = $feed['meta']['feed_condition_conditional_logic_object']['conditionalLogic']['rules'][0]['fieldId'];1023 $config['meta']['mondca_conditional_operator'] = $feed['meta']['feed_condition_conditional_logic_object']['conditionalLogic']['rules'][0]['operator'];1024 $config['meta']['mondca_conditional_value'] = $feed['meta']['feed_condition_conditional_logic_object']['conditionalLogic']['rules'][0]['value'];1025 }1026 1027 if ( $feed['meta']['transactionType'] == 'subscription' ) {1028 $config['meta']['recurring_amount_field'] = $feed['meta']['recurringAmount'];1029 $config['meta']['billing_cycle_number'] = $feed['meta']['billingCycle_length'];1030 $config['meta']['billing_cycle_type'] = $feed['meta']['billingCycle_unit'] == 'day' ? 'D' : 'M';1031 $config['meta']['recurring_times'] = $feed['meta']['recurringTimes'];1032 $config['meta']['setup_fee_enabled'] = $feed['meta']['setupFee_enabled'];1033 $config['meta']['setup_fee_amount_field'] = $feed['meta']['setupFee_product'];1034 $config['meta']['trial_period_enabled'] = $feed['meta']['trial_enabled'];1035 if ( $feed['meta']['trial_enabled'] ) {1036 $config['meta']['trial_period_number'] = 1;1037 $config['meta']['trial_amount'] = $submission_data['trial'];1038 }1039 1040 }1041 1042 $config['meta']['api_settings_enabled'] = rgar( $feed['meta'], 'apiSettingsEnabled' );1043 $config['meta']['mode'] = rgar( $feed['meta'], 'overrideMode' );1044 $config['meta']['vendorname'] = rgar( $feed['meta'], 'overrideVendorName' );1045 $config['meta']['transactiontype'] = rgar( $feed['meta'], 'overrideTransactionType' );1046 1047 $config['meta']['customer_fields']['email'] = rgar( $feed['meta'], 'billingInformation_email' );1048 $config['meta']['customer_fields']['address1'] = rgar( $feed['meta'], 'billingInformation_address' );1049 $config['meta']['customer_fields']['address2'] = rgar( $feed['meta'], 'billingInformation_address2' );1050 $config['meta']['customer_fields']['city'] = rgar( $feed['meta'], 'billingInformation_city' );1051 $config['meta']['customer_fields']['state'] = rgar( $feed['meta'], 'billingInformation_state' );1052 $config['meta']['customer_fields']['zip'] = rgar( $feed['meta'], 'billingInformation_zip' );1053 $config['meta']['customer_fields']['country'] = rgar( $feed['meta'], 'billingInformation_country' );1054 1055 return $config;1056 1057 }1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 739 1070 740 … … 1080 750 1081 751 $settings = $this->get_plugin_settings(); 1082 1083 //wp_die("<pre>".print_r($response,true)); exit; 1084 1085 if( isset( $_REQUEST['MD'] ) && !empty( $_REQUEST['PaRes'] ) ){ 1086 1087 $wpd_session = get_transient('sagepay_direct'); 1088 1089 //------ Getting entry related to this IPN ----------------------------------------------// 1090 $entry = GFAPI::get_entry($wpd_session['sagepay_oid']); 1091 1092 $transaction_id = $wpd_session['sagepay_vtc']; 1093 1094 $request_array = array( 1095 'MD' => $_REQUEST['MD'], 1096 'PARes' => $_REQUEST['PaRes'], 1097 'VendorTxCode' => $wpd_session['sagepay_vtc'], 1098 ); 752 753 $ipn_url = get_bloginfo('url') . '/?page=gf_sagepay_direct_ipn'; 754 755 $wpd_session = get_transient('sagepay_direct'); 756 757 $entry = GFAPI::get_entry($wpd_session['sagepay_oid']); 758 759 $feed = $this->get_payment_feed($entry); 760 761 $transaction_id = $wpd_session['sagepay_vtc']; 762 763 $amount = $wpd_session['sagepay_amount']; 764 765 if( ( isset( $_REQUEST['MD'] ) && !empty( $_REQUEST['PaRes'] ) ) || isset($_REQUEST['cres']) ){ 766 767 768 if( isset($_REQUEST['cres']) ){ 769 $request_array = array( 770 'CRes' => $_REQUEST['cres'], 771 'VPSTxId' => $wpd_session['sagepay_vpstxid'], 772 ); 773 }elseif( isset($_REQUEST['PaRes']) ){ 774 $request_array = array( 775 'MD' => $_REQUEST['MD'], 776 'PARes' => $_REQUEST['PaRes'], 777 'VendorTxCode' => $wpd_session['sagepay_vtc'], 778 ); 779 } 1099 780 1100 781 $request = http_build_query($request_array); … … 1130 811 } 1131 812 813 set_transient('sagepay_response', $resp, 60*60); 814 815 1132 816 if ($resp['Status'] == "OK" || $resp['Status'] == "REGISTERED" || $resp['Status'] == "AUTHENTICATED") { 1133 817 1134 $amount = $entry['3']; 1135 1136 //----- Processing IPN ------------------------------------------------------------// 1137 $this->log_debug('Processing IPN...'); 1138 $action = $this->process_ipn($feed, $entry, 'completed', 'normal', $transaction_id, $transaction_id, $_REQUEST['futurePayId'], $amount, $_REQUEST['pending_reason'], $_REQUEST['reason_code'], $amount); 1139 $this->log_debug('IPN processing complete.'); 818 //----- Processing IPN ------------------------------------------------------------// 819 $this->log_debug('Processing IPN...'); 820 $action = $this->process_ipn($feed, $entry, 'completed', $transaction_id, $amount ); 821 $this->log_debug('IPN processing complete.'); 1140 822 1141 823 } elseif ($resp['Status'] == "3DAUTH") { 1142 824 if ($resp['3DSecureStatus'] == 'OK') { 1143 if (isset($resp['ACSURL']) && isset($resp['MD'])) { 1144 $wpd_session['sagepay_acsurl'] = $resp['ACSURL']; 1145 $wpd_session['sagepay_pareq'] = $resp['PAReq']; 1146 $wpd_session['sagepay_md'] = $resp['MD']; 1147 1148 set_transient('sagepay_direct', $wpd_session, 60*60); 1149 1150 $this->log_error( __METHOD__ . '(): Response => ' .sprintf(__("SagePay Direct Payment Intiated waiting for 3D Secure response. Transaction Id: %s", "gf-sagepay-direct-patsatech"), $orderid) ); 1151 1152 GFPaymentAddOn::add_note($entry['id'], sprintf(__("SagePay Direct Payment Intiated waiting for 3D Secure response. Transaction Id: %s", "gf-sagepay-direct-patsatech"), $orderid)); 1153 1154 $ipn_url = get_bloginfo('url') . '/?page=gf_sagepay_direct_ipn'; 1155 1156 echo '<!DOCTYPE html> 1157 <html> 1158 <head> 1159 <script> 1160 window.onload = function(e){ 1161 document.getElementById("sagepay_direct_payment_form").submit(); 1162 } 1163 </script> 1164 </head> 1165 <body> 1166 <form action="'.$wpd_session['sagepay_acsurl'].'" method="post" name="sagepay_direct_payment_form" target="_self" id="sagepay_direct_payment_form" > 1167 <input type="hidden" name="PaReq" value="'. $wpd_session['sagepay_pareq'] .'" /> 1168 <input type="hidden" name="MD" value="'. $wpd_session['sagepay_md'] .'" /> 1169 <input type="hidden" name="TermUrl" value="'. $ipn_url .'" /> 1170 <input type="submit" /> 1171 <b> Please wait while you are being redirected.</b> 1172 </form> 1173 </body> 1174 </html>'; 1175 1176 exit; 825 if (isset($resp['ACSURL']) && ( isset($resp['PAReq']) || isset($resp['CReq'] ))) { 826 827 $wpd_session['sagepay_acsurl'] = $resp['ACSURL']; 828 829 if( isset($resp['PAReq']) && !empty($resp['PAReq']) ){ 830 $wpd_session['sagepay_pareq'] = $resp['PAReq']; 831 } 832 833 if( isset($resp['CReq']) && !empty($resp['CReq']) ){ 834 $wpd_session['sagepay_pareq'] = ""; 835 $wpd_session['sagepay_creq'] = $resp['CReq']; 836 } 837 838 $wpd_session['sagepay_md'] = $resp['MD']; 839 840 $wpd_session['sagepay_vpstxid'] = $resp['VPSTxId']; 841 842 set_transient('sagepay_direct', $wpd_session, 60*60); 843 844 $this->log_error( __METHOD__ . '(): Response => ' .sprintf(__("SagePay Direct Payment Intiated waiting for 3D Secure response. Transaction Id: %s", "gf-sagepay-direct-patsatech"), $orderid) ); 845 846 GFPaymentAddOn::add_note($entry['id'], sprintf(__("SagePay Direct Payment Intiated waiting for 3D Secure response. Transaction Id: %s", "gf-sagepay-direct-patsatech"), $orderid)); 847 848 $params = ''; 849 if( !empty($wpd_session['sagepay_pareq']) ){ 850 $params .= '<input type="hidden" name="PaReq" value="'. $wpd_session['sagepay_pareq'] .'" />'; 851 $params .= '<input type="hidden" name="MD" value="'. $wpd_session['sagepay_md'] .'" />'; 852 853 } 854 if( !empty($wpd_session['sagepay_creq']) ){ 855 $params .= '<input type="hidden" name="creq" value="'. $wpd_session['sagepay_creq'] .'" />'; 856 $params .= '<input type="hidden" name="threeDSSessionData" value="'. str_replace(array("{", "}"), "", $resp['VPSTxId']) .'" />'; 857 } 858 859 860 echo '<!DOCTYPE html> 861 <html> 862 <head> 863 <script> 864 window.onload = function(e){ 865 document.getElementById("sagepay_direct_payment_form").submit(); 866 } 867 </script> 868 </head> 869 <body> 870 <form action="'.$wpd_session['sagepay_acsurl'].'" method="post" name="sagepay_direct_payment_form" target="_self" id="sagepay_direct_payment_form" > 871 '.$params.' 872 <input type="hidden" name="TermUrl" value="'. $ipn_url .'" /> 873 <input type="submit" /> 874 <b> Please wait while you are being redirected.</b> 875 </form> 876 </body> 877 </html>'; 878 879 exit; 1177 880 1178 881 } … … 1182 885 $error = sprintf(__('Transaction Failed. %s - %s', 'woo-sagepay-patsatech'), $resp['Status'], $resp['StatusDetail']); 1183 886 1184 $this->log_error( __METHOD__ . '(): '.$error );1185 1186 GFPaymentAddOn::add_note($entry['id'], 'Payment failed. Response => '.$error );887 $this->log_error( __METHOD__ . '(): '.$error ); 888 889 GFPaymentAddOn::add_note($entry['id'], 'Payment failed. Response => '.$error ); 1187 890 1188 891 } else { 1189 892 $error = sprintf(__('Transaction Failed with %s - unknown error.', 'woo-sagepay-patsatech'), $resp['Status']); 1190 893 1191 $this->log_error( __METHOD__ . '(): '.$error );1192 1193 GFPaymentAddOn::add_note($entry['id'], 'Payment failed. Response => '.$error );894 $this->log_error( __METHOD__ . '(): '.$error ); 895 896 GFPaymentAddOn::add_note($entry['id'], 'Payment failed. Response => '.$error ); 1194 897 1195 898 } 1196 } 899 900 $url = add_query_arg('message', $error, add_query_arg('sagepay_status', 'error', $ipn_url ) ); 901 wp_redirect($url); exit; 902 903 } 1197 904 } else { 905 1198 906 $error = __('Gateway Error. Please Notify the Store Owner about this error.', 'woo-sagepay-patsatech'); 1199 907 1200 $this->log_error( __METHOD__ . '(): '.$error ); 1201 1202 GFPaymentAddOn::add_note($entry['id'], $error ); 908 $this->log_error( __METHOD__ . '(): '.$error ); 909 910 GFPaymentAddOn::add_note($entry['id'], $error ); 911 912 $url = add_query_arg('message', $error, add_query_arg('sagepay_status', 'error', $ipn_url ) ); 913 wp_redirect($url); exit; 914 1203 915 } 1204 916 1205 917 1206 $return_url = $this->return_url($entry["form_id"], $entry["id"], $entry['source_url']); 1207 1208 wp_redirect( $return_url ); exit(); 1209 1210 1211 }elseif( isset( $_REQUEST['sagepay_status'] ) ){ 918 $return_url = $this->return_url($entry["form_id"], $entry["id"], $entry['source_url']); 919 920 wp_redirect( $return_url ); exit(); 921 922 923 } elseif( isset( $_REQUEST['sagepay_status'] ) && $_REQUEST['sagepay_status'] == '3ds' ){ 924 1212 925 1213 926 $wpd_session = get_transient('sagepay_direct'); 1214 927 1215 //------ Getting entry related to this IPN ----------------------------------------------// 1216 $entry = GFAPI::get_entry($wpd_session['sagepay_oid']); 1217 1218 $transaction_id = $wpd_session['sagepay_vtc']; 1219 1220 $amount = $entry['3']; 928 929 $params = ''; 930 if( !empty($wpd_session['sagepay_pareq']) ){ 931 $params .= '<input type="hidden" name="PaReq" value="'. $wpd_session['sagepay_pareq'] .'" />'; 932 $params .= '<input type="hidden" name="MD" value="'. $wpd_session['sagepay_md'] .'" />'; 933 934 } 935 if( !empty($wpd_session['sagepay_creq']) ){ 936 $params .= '<input type="hidden" name="creq" value="'. $wpd_session['sagepay_creq'] .'" />'; 937 $params .= '<input type="hidden" name="threeDSSessionData" value="'. str_replace(array("{", "}"), "", $wpd_session['sagepay_vpstxid']) .'" />'; 938 } 939 940 941 echo '<!DOCTYPE html> 942 <html> 943 <head> 944 <script> 945 window.onload = function(e){ 946 document.getElementById("sagepay_direct_payment_form").submit(); 947 } 948 </script> 949 </head> 950 <body> 951 <form action="'.$wpd_session['sagepay_acsurl'].'" method="post" name="sagepay_direct_payment_form" target="_self" id="sagepay_direct_payment_form" > 952 '.$params.' 953 <input type="hidden" name="TermUrl" value="'. $ipn_url .'" /> 954 <input type="submit" /> 955 <b> Please wait while you are being redirected.</b> 956 </form> 957 </body> 958 </html>'; 959 960 exit; 961 962 963 964 965 } elseif( isset( $_REQUEST['sagepay_status'] ) && $_REQUEST['sagepay_status'] == 'error' ){ 1221 966 1222 967 //----- Processing IPN ------------------------------------------------------------// 1223 968 $this->log_debug('Processing IPN...'); 1224 $action = $this->process_ipn($feed, $entry, 'completed', 'normal', $transaction_id, $transaction_id, $_REQUEST['futurePayId'], $amount, $_REQUEST['pending_reason'], $_REQUEST['reason_code'], $amount); 1225 $this->log_debug('IPN processing complete.'); 1226 969 $action = $this->process_ipn($feed, $entry, 'failed', $transaction_id, $amount); 970 $this->log_debug('IPN processing complete.'); 1227 971 1228 972 $return_url = $this->return_url($entry["form_id"], $entry["id"], $entry['source_url']); 1229 973 1230 974 wp_redirect( $return_url ); exit(); 975 976 1231 977 } 1232 978 1233 1234 //return $action; 1235 } 1236 1237 private function process_ipn($config, $entry, $status, $transaction_type, $transaction_id, $parent_transaction_id, $subscriber_id, $amount, $pending_reason, $reason, $recurring_amount) 979 return $action; 980 } 981 982 private function process_ipn($feed, $entry, $status, $transaction_id, $amount) 1238 983 { 1239 $this->log_debug("Payment status: {$status} - Transaction Type: {$transaction_type} - Transaction ID: {$transaction_id} - Parent Transaction: {$parent_transaction_id} - Subscriber ID: {$subscriber_id} - Amount: {$amount} - Pending reason: {$pending_reason} - Reason: {$reason}"); 1240 1241 $action = array(); 1242 switch (strtolower($transaction_type)) { 1243 default: 1244 //handles products and donation 1245 switch (strtolower($status)) { 1246 case 'completed': 1247 //creates transaction 1248 $action['id'] = $transaction_id; 1249 $action['type'] = 'complete_payment'; 1250 $action['transaction_id'] = $transaction_id; 1251 $action['amount'] = $amount; 1252 $action['entry_id'] = $entry['id']; 1253 $action['payment_date'] = gmdate('y-m-d H:i:s'); 1254 $action['payment_method'] = 'SagePay'; 1255 $action['ready_to_fulfill'] = ! $entry['is_fulfilled'] ? true : false; 1256 1257 $this->fulfill_order($entry, $transaction_id, $amount); 1258 //update lead, add a note 1259 GFAPI::update_entry($entry); 1260 1261 if (! $this->is_valid_initial_payment_amount($entry['id'], $amount)) { 1262 //create note and transaction 1263 $this->log_debug('Payment amount does not match product price. Entry will not be marked as Approved.'); 1264 GFPaymentAddOn::add_note($entry['id'], sprintf(__('Payment amount (%s) does not match product price. Entry will not be marked as Approved. Transaction Id: %s', 'gf-sagepay-direct-patsatech'), GFCommon::to_money($amount, $entry['currency']), $transaction_id)); 1265 GFPaymentAddOn::insert_transaction($entry['id'], 'payment', $transaction_id, $amount); 1266 1267 $action['abort_callback'] = true; 1268 } else { 1269 GFPaymentAddOn::insert_transaction($entry['id'], 'payment', $transaction_id, $amount); 1270 } 1271 1272 $this->complete_payment($entry, $action); 1273 1274 return $action; 1275 break; 1276 1277 case 'reversed': 1278 //creates transaction 1279 $this->log_debug('Processing reversal.'); 1280 GFAPI::update_entry_property($entry['id'], 'payment_status', 'Refunded'); 1281 GFPaymentAddOn::add_note($entry['id'], sprintf(__('Payment has been reversed. Transaction Id: %s. Reason: %s', 'gf-sagepay-direct-patsatech'), $transaction_id, $this->get_reason($reason))); 1282 GFPaymentAddOn::insert_transaction($entry['id'], 'refund', $action['transaction_id'], $action['amount']); 1283 break; 1284 1285 case 'canceled_reversal': 1286 //creates transaction 1287 $this->log_debug('Processing a reversal cancellation'); 1288 GFAPI::update_entry_property($entry['id'], 'payment_status', 'Paid'); 1289 GFPaymentAddOn::add_note($entry['id'], sprintf(__('Payment reversal has been canceled and the funds have been transferred to your account. Transaction Id: %s', 'gf-sagepay-direct-patsatech'), $entry['transaction_id'])); 1290 GFPaymentAddOn::insert_transaction($entry['id'], 'payment', $action['transaction_id'], $action['amount']); 1291 break; 1292 1293 case 'processed': 1294 case 'pending': 1295 $action['id'] = $transaction_id; 1296 $action['type'] = 'add_pending_payment'; 1297 $action['transaction_id'] = $transaction_id; 1298 $action['entry_id'] = $entry['id']; 1299 $action['amount'] = $amount; 1300 $action['entry_id'] = $entry['id']; 1301 $amount_formatted = GFCommon::to_money($action['amount'], $entry['currency']); 1302 $action['note'] = sprintf(__('Payment is pending. Amount: %s. Transaction Id: %s. Reason: %s', 'gf-sagepay-direct-patsatech'), $amount_formatted, $action['transaction_id'], $this->get_pending_reason($pending_reason)); 1303 1304 return $action; 1305 break; 1306 1307 case 'refunded': 1308 $action['id'] = $transaction_id; 1309 $action['type'] = 'refund_payment'; 1310 $action['transaction_id'] = $transaction_id; 1311 $action['entry_id'] = $entry['id']; 1312 $action['amount'] = $amount; 1313 1314 return $action; 1315 break; 1316 1317 case 'voided': 1318 $action['id'] = $transaction_id; 1319 $action['type'] = 'void_authorization'; 1320 $action['transaction_id'] = $transaction_id; 1321 $action['entry_id'] = $entry['id']; 1322 $action['amount'] = $amount; 1323 1324 return $action; 1325 break; 1326 1327 case 'denied': 1328 case 'failed': 1329 $action['id'] = $transaction_id; 1330 $action['type'] = 'fail_payment'; 1331 $action['transaction_id'] = $transaction_id; 1332 $action['entry_id'] = $entry['id']; 1333 $action['amount'] = $amount; 1334 1335 //update lead, add a note 1336 GFAPI::update_entry($entry); 1337 1338 1339 GFPaymentAddOn::add_note($entry['id'], sprintf(__("Payment has Failed. Transaction Id: %s", "gf-sagepay-direct-patsatech"), $transaction_id)); 1340 1341 return $action; 1342 break; 1343 } 1344 1345 break; 1346 } 1347 } 1348 1349 984 $this->log_debug("Payment status: {$status} - Transaction ID: {$transaction_id} - Amount: {$amount}"); 985 986 $form = GFFormsModel::get_form_meta($entry['form_id']); 987 988 $action = array(); 989 //handles products and donation 990 switch (strtolower($status)) { 991 case 'completed': 992 //creates transaction 993 $action['id'] = $transaction_id; 994 $action['type'] = 'complete_payment'; 995 $action['transaction_id'] = $transaction_id; 996 $action['amount'] = $amount; 997 $action['entry_id'] = $entry['id']; 998 $action['payment_date'] = gmdate('y-m-d H:i:s'); 999 $action['payment_method'] = 'SagePay'; 1000 $action['ready_to_fulfill'] = ! $entry['is_fulfilled'] ? true : false; 1001 1002 1003 update_post_meta( $entry['id'], 'transaction_id', $transaction_id ); 1004 1005 1006 $this->fulfill_order($entry, $transaction_id, $amount); 1007 //update lead, add a note 1008 GFAPI::update_entry($entry); 1009 1010 if (! $this->is_valid_initial_payment_amount($entry['id'], $amount)) { 1011 //create note and transaction 1012 $this->log_debug('Payment amount does not match product price. Entry will not be marked as Approved.'); 1013 GFPaymentAddOn::add_note($entry['id'], sprintf(__('Payment amount (%s) does not match product price. Entry will not be marked as Approved. Transaction Id: %s', 'gf-sagepay-direct-patsatech'), GFCommon::to_money($amount, $entry['currency']), $transaction_id)); 1014 GFPaymentAddOn::insert_transaction($entry['id'], 'payment', $transaction_id, $amount); 1015 1016 $action['abort_callback'] = true; 1017 } else { 1018 GFPaymentAddOn::insert_transaction($entry['id'], 'payment', $transaction_id, $amount); 1019 } 1020 1021 $this->checkout_fulfillment( $transaction_id, $entry, $feed, $form ); 1022 1023 $this->complete_payment($entry, $action); 1024 1025 return $action; 1026 break; 1027 1028 case 'failed': 1029 $action['id'] = $transaction_id; 1030 $action['type'] = 'fail_payment'; 1031 $action['transaction_id'] = $transaction_id; 1032 $action['entry_id'] = $entry['id']; 1033 $action['amount'] = $amount; 1034 1035 //update lead, add a note 1036 GFAPI::update_entry($entry); 1037 1038 1039 GFPaymentAddOn::add_note($entry['id'], sprintf(__("Payment has Failed. Transaction Id: %s", "gf-sagepay-direct-patsatech"), $transaction_id)); 1040 1041 return $action; 1042 break; 1043 } 1044 1045 } 1046 1047 1048 public function checkout_fulfillment( $transaction_id, $entry, $feed, $form ) { 1049 1050 if ( method_exists( $this, 'trigger_payment_delayed_feeds' ) ) { 1051 $this->trigger_payment_delayed_feeds( $transaction_id, $feed, $entry, $form ); 1052 } 1053 1054 } 1350 1055 1351 1056
Note: See TracChangeset
for help on using the changeset viewer.