Advertisement
y2kbug

event.php

May 23rd, 2023
858
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 11.89 KB | None | 0 0
  1. public function checkout($params = []){
  2.         try{
  3.             if( empty($params['section']) || empty($params['representative']) ){
  4.                 throw new \Exception('INVALID_DATA');
  5.             }
  6.  
  7.             if(!empty($params['onsite_secret'])){
  8.                 $this->onsite = $this->is_onsite([
  9.                     'secret' => $params['onsite_secret']
  10.                 ]);
  11.             }
  12.  
  13.             if(!empty($params['pay_by_cash']) && $params['pay_by_cash'] == true && !$this->onsite){
  14.                 throw new \Exception('INVALID_PAYMENT_METHOD');
  15.             }
  16.  
  17.             global $DB;
  18.        
  19.             $res = $DB->prepare("SELECT * FROM `event` WHERE `url_alias` = ? AND `deleted` = 0 LIMIT 1");
  20.             $res->execute([
  21.                 $params['section']
  22.             ]);
  23.             $event = $res->fetch(\PDO::FETCH_ASSOC);
  24.             if( empty($event) ){
  25.                 throw new \Exception('INVALID_EVENT');
  26.             }
  27.  
  28.             $res = $DB->prepare("SELECT * FROM `event_visitor_type` WHERE `event_id` = ? AND `id` = ? LIMIT 1");
  29.             $res->execute([
  30.                 $event['id'],
  31.                 $params['visitor_type']
  32.             ]);
  33.             $visitor_type = $res->fetch(\PDO::FETCH_ASSOC);
  34.             if( empty($visitor_type) ){
  35.                 throw new \Exception('INVALID_VISITOR_TYPE');
  36.             }
  37.  
  38.             $coupon_type = NULL;
  39.             $modifier = -1;
  40.             if($params['coupon_applied'] == true && !empty($params['coupon_code'])){
  41.                 $res = $DB->prepare("SELECT * FROM `coupon` WHERE `event_id` = ? AND `coupon_code` = ?");
  42.                 $res->execute([
  43.                     $event['id'],
  44.                     $params['coupon_code']
  45.                 ]);
  46.                 $coupon = $res->fetch(\PDO::FETCH_ASSOC);
  47.  
  48.                 if (empty($coupon)) {
  49.                     throw new \Exception('INVALID_COUPON_CODE');
  50.                 }
  51.  
  52.                 if ($coupon['coupon_start_time'] > time()) {
  53.                     throw new \Exception('COUPON_NOT_AVAILABLE_YET');
  54.                 }
  55.  
  56.                 if (time() > $coupon['coupon_end_time']) {
  57.                     throw new \Exception('COUPON_EXPIRED');
  58.                 }
  59.  
  60.                 if($coupon['redemption_quota'] > 0 && $coupon['redeemed'] >= $coupon['redemption_quota']){
  61.                     throw new \Exception('REDEMPTION_QUOTA_REACHED');
  62.                 }
  63.  
  64.                 $coupon_type = $coupon['type'];
  65.                 $modifier = floatval($coupon['modifier']);
  66.             }
  67.  
  68.             $original_price = ((!empty($params['accompany']) ? count($params['accompany']) : 0) + 1) * floatval($visitor_type['price']);
  69.  
  70.             $total = floatval($params['total']);
  71.             $discounted_price = empty($coupon_type) || $modifier > -1 ? $original_price : ($coupon_type === 'Percentage' ? $original_price * $modifier : ($coupon_type === 'Lump-sum' ? $original_price + $modifier : $original_price));
  72.             if($total !== $discounted_price){
  73.                 throw new \Exception('INVALID_TOTAL_PRICE');
  74.             }
  75.  
  76.             $payment_method = $total > 0 ? ($params['pay_by_cash'] == true ? 'cash' : 'paypal') : '';
  77.  
  78.             $secret = md5(uniqid());
  79.  
  80.             $language_id_map = [
  81.                 'en_gb' => 1,
  82.                 'zh_hk' => 2,
  83.                 'zh_cn' => 3
  84.             ];
  85.  
  86.             $res = $DB->prepare("INSERT INTO `registration` (`event_id`, `event_visitor_type_id`, `accompany_count`, `language_id`, `price`, `coupon_code`, `coupon_modifier`, `final_price`, `payment_method`, `approval_status`, `secret`, `create_time`) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
  87.             $res->execute([
  88.                 $event['id'],
  89.                 $params['visitor_type'],
  90.                 !empty($params['accompany']) ? count($params['accompany']) : 0,
  91.                 $language_id_map[ $params['language'] ],
  92.                 floatval($original_price),
  93.                 !empty($coupon['coupon_code']) ? $coupon['coupon_code'] : '',
  94.                 $modifier,
  95.                 $total,
  96.                 $payment_method,
  97.                 !$this->onsite && $event['approval_required'] == 1 ? -1 : 1,
  98.                 $secret,
  99.                 time()
  100.             ]);
  101.             $registration_id = $DB->lastInsertId();
  102.             if(empty($registration_id)){
  103.                 throw new \Exception('Failed to register! Please try again later, or contact us!');
  104.             }
  105.  
  106.             $invoice_id = (!empty($event['invoice_prefix']) ? str_replace('', '', $event['invoice_prefix']) : 'GENERAL'). '_'. $registration_id;
  107.  
  108.             if(!empty($coupon_type) && !empty($modifier)){
  109.                 $res = $DB->prepare("UPDATE `coupon` SET `redeemed` = `redeemed` + 1 WHERE `id` = ? LIMIT 1");
  110.                 $res->execute([
  111.                     $coupon['id']
  112.                 ]);
  113.             }
  114.  
  115.             $duplicated_value_for_search_key = ['`invoice_id` = ?'];
  116.             $duplicated_value_for_search_value = [$invoice_id];
  117.             foreach($params['representative'] AS $question_id => $answer){
  118.                 $answer_value = is_array($answer) ? ($this->is_multidimensional_array($answer) ? $this->multi_implode("\n", $answer) : (is_numeric(implode('', $answer)) ? implode(' ', $answer) : implode("\n", $answer))) : $answer;
  119.  
  120.                 $res = $DB->prepare("INSERT INTO `registration_representative` (`registration_id`, `question_id`, `answer`) VALUES (?, ?, ?)");
  121.                 $res->execute([
  122.                     $registration_id,
  123.                     $question_id,
  124.                     $answer_value
  125.                 ]);
  126.  
  127.                 if($question_id < 0){
  128.                     switch($question_id){
  129.                         case -8:
  130.                             $duplicated_value_for_search_key[] = '`country` = ?';
  131.                             break;
  132.                         case -7:
  133.                             $duplicated_value_for_search_key[] = '`job_title` = ?';
  134.                             break;
  135.                         case -6:
  136.                             $duplicated_value_for_search_key[] = '`salutation` = ?';
  137.                             break;
  138.                         case -5:
  139.                             $duplicated_value_for_search_key[] = '`first_name` = ?';
  140.                             break;
  141.                         case -4:
  142.                             $duplicated_value_for_search_key[] = '`last_name` = ?';
  143.                             break;
  144.                         case -3:
  145.                             $duplicated_value_for_search_key[] = '`company` = ?';
  146.                             break;
  147.                         case -2:
  148.                             $duplicated_value_for_search_key[] = '`email_address` = ?';
  149.                             break;
  150.                         case -1:
  151.                             $duplicated_value_for_search_key[] = '`mobile_phone_number` = ?';
  152.                             break;
  153.                         default:
  154.                     }
  155.  
  156.                     $duplicated_value_for_search_value[] = $answer_value;
  157.                 }
  158.             }
  159.  
  160.             if(!empty($duplicated_value_for_search_key) && !empty($duplicated_value_for_search_value)){
  161.                 $res = $DB->prepare("UPDATE `registration` SET ". implode(', ', $duplicated_value_for_search_key). " WHERE `id` = ? LIMIT 1");
  162.                 $res->execute(array_merge(
  163.                     $duplicated_value_for_search_value,
  164.                     [$registration_id]
  165.                 ));
  166.             }
  167.            
  168.             if( !empty($params['accompany']) ){
  169.                 foreach($params['accompany'] AS $accompany_id => $accompany){
  170.                     foreach($accompany AS $question_id => $answer){
  171.                         $res = $DB->prepare("INSERT INTO `registration_accompany` (`registration_id`, `accompany_id`, `question_id`, `answer`) VALUES (?, ?, ?, ?)");
  172.                         $res->execute([
  173.                             $registration_id,
  174.                             $accompany_id + 1,
  175.                             $question_id,
  176.                             is_array($answer) ? implode(' ', $answer) : $answer
  177.                         ]);
  178.                     }
  179.                 }
  180.             }
  181.  
  182.             if(!$this->onsite && $event['approval_required'] == 1){
  183.                 $payment_method = 'pending';
  184.             }elseif($payment_method === 'paypal'){
  185.                 $paypal_params = [
  186.                     'METHOD' => 'SetExpressCheckout',
  187.                     'VERSION' => '124.0',
  188.                     'USER' => PAYPAL_USER,
  189.                     'PWD' => PAYPAL_PWD,
  190.                     'SIGNATURE' => PAYPAL_SIGNATURE,
  191.                     'LOCALECODE' => 'en_GB',
  192.                     'PAYMENTREQUEST_0_PAYMENTACTION' => 'Sale',
  193.                     'PAYMENTREQUEST_0_CURRENCYCODE' => 'USD',
  194.                     'L_PAYMENTREQUEST_0_NAME0' => $event['name_'. $params['language']]. ' - '. $visitor_type['name_'. $params['language']],
  195.                     'L_PAYMENTREQUEST_0_QTY0' => 1 + (!empty($params['accompany']) ? count($params['accompany']) : 0),
  196.                     'L_PAYMENTREQUEST_0_AMT0' => floatval($visitor_type['price']),
  197.                     'PAYMENTREQUEST_0_AMT' => $total,
  198.                     'PAYMENTREQUEST_0_ITEMAMT' => $total,
  199.                     'PAYMENTREQUEST_0_INVNUM' => $invoice_id,
  200.                     'RETURNURL' => WWW_URL_ROOT. '#/'. $params['language']. '/'. $params['section']. '/payment/'. ($this->onsite ? '?onsite_secret='. $params['onsite_secret'] : ''),
  201.                     'CANCELURL' => WWW_URL_ROOT. '#/'. $params['language']. '/'. $params['section']. '/canceled/'. ($this->onsite ? '?onsite_secret='. $params['onsite_secret'] : '')
  202.                 ];
  203.  
  204.                 if(!empty($coupon_type)){
  205.                     $paypal_params['L_PAYMENTREQUEST_0_NAME1'] = 'Coupon Code ('. $coupon['coupon_code']. ')';
  206.                     $paypal_params['L_PAYMENTREQUEST_0_QTY1'] = 1;
  207.                     $paypal_params['L_PAYMENTREQUEST_0_AMT1'] = $discounted_price - $original_price;
  208.                 }
  209.  
  210.                 $ch = curl_init();
  211.                 curl_setopt($ch, CURLOPT_URL, PAYPAL_API);
  212.                 curl_setopt($ch, CURLOPT_POST, true);
  213.                 curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  214.                 curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($paypal_params));
  215.                 $res = curl_exec($ch);
  216.                 curl_close($ch);
  217.  
  218.                 $paypal_returned_values = array();
  219.                 parse_str($res, $paypal_returned_values);
  220.  
  221.                 if(empty($res) || empty($paypal_returned_values) || empty($paypal_returned_values['ACK'])){
  222.                     throw new \Exception ('Express-checkout failed');
  223.                 }elseif($paypal_returned_values['ACK'] !== 'Success'){
  224.                     throw new \Exception ($paypal_returned_values['L_SEVERITYCODE0']. ': '. $paypal_returned_values['L_LONGMESSAGE0']. ' ('. $paypal_returned_values['L_ERRORCODE0']. ')');
  225.                 }
  226.             }elseif($total == 0){
  227.                 $this->send_confirmation_email(array_merge(['registration_id' => $registration_id], $params));
  228.             }
  229.            
  230.             $success = true;
  231.         } catch (\Exception $ex) {
  232.             $success = false;
  233.             $msg = $ex->getMessage();
  234.         }
  235.        
  236.         return array(
  237.             'success' => $success,
  238.             'msg' => !empty($msg) ? $msg : NULL,
  239.             'data' => [
  240.                 'registration_id' =>  $registration_id,
  241.                 'payment_method' => $payment_method,
  242.                 'url' => !empty($paypal_returned_values['TOKEN']) ? (PAYPAL_CHECKOUT_URL. '?cmd=_express-checkout&token='. $paypal_returned_values['TOKEN']. '&useraction=commit') : NULL,
  243.                 'barcode' => $this->onsite ? json_encode([
  244.                     'id' => $registration_id,
  245.                     'secret' => $secret
  246.                 ]) : NULL
  247.             ]
  248.         );
  249.     }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement