Your IP : 216.73.216.220


Current Path : /var/www/html/app/code/FlipsDigital/HappyMind/Cron/
Upload File :
Current File : /var/www/html/app/code/FlipsDigital/HappyMind/Cron/PaymentStatusDailyUpdate.php

<?php
namespace FlipsDigital\HappyMind\Cron;
use \Zend\Log\Writer\Stream;
use \Zend\Log\Logger;

class PaymentStatusDailyUpdate
{
    protected $_className = __CLASS__;

	public function __construct(
        \Magento\Framework\Stdlib\DateTime\TimezoneInterface $timezone,
        \Magento\Framework\HTTP\Client\Curl $curl,
        \FlipsDigital\HktGateway\Controller\Auth\Jwt $jwtAuth,
        \FlipsDigital\CustomerTextbookList\Model\CustomerTextbookListFactory $customerTextbookListFactory,
        \FlipsDigital\HktGateway\Model\PaymentLogFactory $paymentLogFactory,
        \Magento\Sales\Api\OrderRepositoryInterface $orderRepository
	)
	{
        $this->_timezone = $timezone;
        $this->_curl = $curl;
        $this->_jwtAuth = $jwtAuth;
        $this->_ctlFactory = $customerTextbookListFactory;
        $this->_paymentLogFactory = $paymentLogFactory;
        $this->_orderRepository = $orderRepository;
        $arrClassName = explode('\\', $this->_className);
        $logFile = BP . '/var/log/cron' . array_pop($arrClassName) . '.log';
        $writer = new Stream($logFile);
        $this->_logger = new Logger();
        $this->_logger->addWriter($writer);
	}

	public function execute()
	{
        return;
		// TODO: Implement execute() method.
        $this->_logger->info("START: " . __METHOD__ );

        $objCTL = $this->_ctlFactory->create();
        $collectionCTL = $objCTL->getCollection();
        $collectionCTL->addAttributeToSelect('*');
        $collectionCTL->addFieldToFilter('order_id', ['null' => true]);
        $collectionCTL->addFieldToFilter('transaction_id', ['neq' => 'null']);
        $collectionCTL->addFieldToFilter('prepare_oder_id', ['neq' => '0']);
        $collectionCTL->addFieldToFilter('payment_status', ['null' => true]);
        $collectionCTL->setOrder('entity_id','ASC');

        if ($collectionCTL->count()){
            foreach ($collectionCTL->getItems() as $key => $value) {
                $this->_logger->info("Customer Textbook - ".$value->getData('entity_id'));
                $payment_method = $value->getData('payment_method');
                $transaction_id = $value->getData('transaction_id');
                $magento_order_id = $value->getData('prepare_oder_id');
                $logData = [];
                $logData['identifier'] = $transaction_id;
                $logData['create_at'] = $this->_timezone->date()->format('Y-m-d H:i:s');
                $logData['magento_order_id'] = $magento_order_id;
                $order = $this->_orderRepository->get($magento_order_id);
                $magento_order_status = $order->getStatus();
                
                $this->_logger->info("Payment Method: ".$payment_method);
                $this->_logger->info("Transaction Id: ".$transaction_id);
                if($payment_method == 'payment_tng_fps'){
                    // Production - support FPS
                    $app_id = '6298738225';
                    $app_secret = 'EJb+j4zUZyxAG6WgS3rbbbLErJUAUh++idbTygD1BTS8IoxFSXOcxGvh3Efg5QVx+VkKSXHV5ZFHb4viIkkD4w==';
                    $public_key = 'MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAn5HOyqvf5MJon7qktLaxXQ8vkI/Z0cvsp8MjkZU9ZY2PFiXr7shumVFM9k3gIKzpplkWywC01cBoWLiIGD+UCxkqm/tnivDzFTLNf3xucPMJWqTmnj66IdZu4+msv4UVgv2Y00tfXBtr+eqYSif9SDNmyQ/ceHwHBZisnQB9mQil1HIdvEi62X3+l8EDOd3bYoxMQ54s4RfLdX8feww2Cfir98hTaFBdW77ETKfrca7sy6+i6Uo59IOlUZvmSz7Nor3oJsvdw0Ga2yrPD//A6w+Z6E1FtwK8Ug7U9pPfpf+o249U9AUj2w92K5Pbi6kEgkmfF8XlsipHuTwcwRJqqHEv5j6JdYAZcUZAl+s9iWE83eff3fSv19ope1FhbOzuFVYgEl97BAUOVDyENtSnLqY5zM8bfdtJxzrafMdDCUMq/hbgfiSB6e13s+SCxwqxBFOfDgQwNQqSjcXc47z0VCMHnWqdg9x3QihrSTa2khxgZtTTLsm/opB7GR1OEdtqPKg43xSUHQsjL866JkGCmHYn2ey6LVxDB6crVkdHtDmbfyyfW+oF81iqYzvAIIjSJmj82Dlv5SG9xVvVHzAJ7MdZyU02XcCXaFmEXuBrFEHeULrUCh70RosvRJtyk18xB4ST3INctqP6rFkzA00FyZZ0nrPPbQqc+HQwaswVqGkCAwEAAQ==';
                    $api_url = 'https://gateway2.tapngo.com.hk/paymentApi/payment/status';

                    // UAT
                    // $app_id = '4278527199';
                    // $app_secret = '4qt3IzuyeTiznf8A8vG8zkvS+K/24YqLjmtIVI+hYXpCfqYau8kuzw/I2zwxay0K83ihsAwa9CinqnZlhwO/wg==';
                    // $public_key = 'MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAs4YU4S9UfZNyl0V0s7fMTU71fJCvRb7yFhz3eNDnd+mazKYSQEo/BOEWrtcTSaioXLAu+EYIVXpbXYhd0rIjBhbwD6aw7QW57NBMD+i0L2rbRV+R3sCzfaDduWtQtdr1bYi8Bg1Oozmzjva3cSK8SetURi6QPr4Yakr0nfo8/y+0fu7FkUGGQT4uIzjleSmqJGZWnNRKLrEp+27i4C0uK1VuwQwmpWhs9ZoFs2cIG8+7GaMEFUPW/YMlgPL36yKqVcdthqxOM7bO0lsr/FWF2FTtNoX/CMUyIbfI10f+sBTRxIIGcHf8sbe4w7IGF9xMTVYSrSTYYnPflNxdfYR+/9CUxvNEW0niTfgV3fHN56Z22W62xOEa8ITsAKfNS+l6OBw5Jp7cNQzqjG3FA9CbyDgOMUfjobTAcvNL2+W58mybtsqj8c9SCdw38H3pC/HIdk+EyGdmfQRB2p1BbymgL+/5cf+OU1VjXuZaYljoOLVOG4clxaiEbYd+DJlaJm1sCFDHOuBrRSRIhMmbgPbaEczP6+IcRcGaJc1F9jermBay86eTAng4c8kb5vnwRB1noh7sZzeCSwCgJ23db1YzayNC8qqvNHikjLfHSXkOB8NrG8gqG/d21M9su82ACDpelUc6rN43Zxf3yrLbpEMGHbcFoUluI8oTL/IQTB8WkgkCAwEAAQ==';
                    // $api_url = 'https://gateway.sandbox.tapngo.com.hk/paymentApi/payment/status';

                    $time = time()*1000;
                    $queryStr = 'appId='.$app_id.'&merTradeNo='.$transaction_id.'&timestamp='.$time;
                    $sign = hash_hmac('sha512', $queryStr, $app_secret, true);
                    $data = [
                        'appId' => $app_id,
                        'merTradeNo' => $transaction_id,
                        'timestamp' => $time,
                        'sign' => base64_encode($sign),
                    ];
                    $header = [
                        'Content-Type: application/x-www-form-urlencoded',
                        'Accept: application/json',
                    ];
                    $responseData = $this->_cURL($api_url, http_build_query($data), $header);
                    $logData['request_data'] = http_build_query($data);
                    $logData['response_data'] = $responseData;
                    
                    // $demo_response = '{"content":{"chiMessage":"請求完成","engMessage":"Request Success","internal":"Request Success","payload":{"merTradeNo":"HM202207071415999","tradeNo":"AA0016495704","tradeStatus":"TRADE_FINISHED"},"resultCode":"0"},"sign":"0zt5A3OV2d7EcBE0BCBAUTbrwLKooJ4DobovwuR+bHGNgbazzu4g1ssciYfoMG4dZtgib04OCMWe2U86d0V9mA=="}';
                    // $demo_response = '{"content":{"chiMessage":"查詢付款資料不成功。 (Ref: ZA02)","engMessage":"Query payment status failed. (Ref: ZA02)","internal":"Query payment status failed. (Ref: ZA02)","resultCode":"493"},"sign":"ATsq2MABQ/fv+rHbJsL+6ZsrMOA5ZI+ZQPlxidsmMIM7AujFQvqBEKXAfL9aeP8Zn4/yQ81/sIiAe4Xfhvtn8g=="}';
                    // $responseData = $demo_response;

                    $responseData = json_decode($responseData);
                    $resultCode = $responseData->content->resultCode;
                    if($resultCode == 0){
                        $tradeStatus = $responseData->content->payload->tradeStatus;
                        $logData['payment_status'] = $tradeStatus;
                        switch($tradeStatus){
                            case 'TRADE_FINISHED':
                                $value->setData('order_id', $magento_order_id);
                                $value->setData('prepare_oder_id', 'completed');
                                $value->setData('payment_amount', $order->getGrandTotal());
                                $magento_order_status = \Magento\Sales\Model\Order::STATE_COMPLETE;
                                break;
                            case 'TRADE_CLOSED':
                                $value->setData('prepare_oder_id', '0');
                                $magento_order_status = \Magento\Sales\Model\Order::STATE_CANCELED;
                                break;
                        }
                        $value->save();
                    }else{
                        $logData['payment_status'] = $responseData->content->internal;
                    }
                    $this->_logger->info("API Payment Status: ".$logData['payment_status']);
                }else{
                    switch($payment_method) {
                        case 'payment_alipay_hk':
                            $app_id = '0068808214';
                            $app_secret = 'dbzhfkGI2f3eOlwsqxhEABz7z1sn7PB9A5YG4VrDA7OAeQvL3GVArnemYkOeSHgdT9hD2CGR/nJYPjvG3OPhyw==';
                            $api_url = 'https://gateway2.tapngo.com.hk/ePaymentGateway/alipayhk/transactions/orderStatus';
                        break;
                        case 'payment_alipay_cn':
                            $app_id = '7841813081';
                            $app_secret = '/P6yAbskjS0K25fH6Om8kxkdVgqpJRaarxpXNOmNoTmfSqvwaO3A+e4i0xzrnxDBE/1Np7a1r14uTwzcgTnGQA==';
                            $api_url = 'https://gateway2.tapngo.com.hk/ePaymentGateway/alipaycn/transactions/orderStatus';
                        break;
                        case 'payment_visa_master':
                            $app_id = '8198364860';
                            $app_secret = 'YX8chyKVNHYKN2u2AXMynVoQEpAvvqYL86wNNIoPOz9aAdKBCG96xg+n7x4VdHaTQiv/wSPIIRQmi9pQvK9SNg==';
                            $api_url = 'https://gateway2.tapngo.com.hk/ePaymentGateway/visamastercard/v2/transactions/orderStatus';
                        break;
                        case 'payment_wechatpay':
                            $app_id = '2516279849';
                            $app_secret = 'CpswD/217CJqvCmaZqKpOkwhh4SyU0wlZX6OaW45tuC0gOro57RnMDu8LpBO9ma/v0ppmWEN8VtKrCmGOUIbSg==';
                            $api_url = 'https://gateway2.tapngo.com.hk/ePaymentGateway/wechatpay/transactions/orderStatus';
                        break;
                    }
                    $payload = [
                        "sub" => $app_id,
                        "iat" => time()
                    ];
                    $token = $this->_jwtAuth->getToken($payload, $app_secret);
                    $authorization = "Authorization: Bearer ".$token;
                    $data = [
                        'merchantTransactionId' => $transaction_id,
                    ];
                    $header = [
                        'Content-Type: application/json',
                        $authorization,
                    ];
                    $responseData = $this->_cURL($api_url, json_encode($data), $header);
                    $logData['request_data'] = json_encode($data);
                    $logData['response_data'] = $responseData;

                    $responseData = json_decode($responseData);
                    $responseStatus = $responseData->status;
                    $transactionState = '';
                    if($responseStatus == 0){
                        if($payment_method == 'payment_visa_master'){
                            if(count($responseData->payload->transactions) >= 2){
                                $transactionState = $responseData->payload->transactions[1]->transactionState;
                                if($transactionState == 'CAPTURED'){
                                    $transactionState = 'COMPLETED';
                                }
                            }
                        }else{
                            if(isset($responseData->payload->transactions[0]->transactionState)){
                                $transactionState = $responseData->payload->transactions[0]->transactionState;
                            }
                        }
                        $logData['payment_status'] = $transactionState;
                        switch($transactionState){
                            case 'COMPLETED':
                                $value->setData('order_id', $magento_order_id);
                                $value->setData('prepare_oder_id', 'completed');
                                $value->setData('payment_amount', $responseData->payload->capturedChargeTotal);
                                $magento_order_status = \Magento\Sales\Model\Order::STATE_COMPLETE;
                                break;
                            case 'FAILED':
                                $value->setData('prepare_oder_id', '0');
                                $magento_order_status = \Magento\Sales\Model\Order::STATE_CANCELED;
                                break;
                        }
                        $value->save();
                    }else{
                        $logData['payment_status'] = $responseData->message;
                    }
                    $this->_logger->info("API Payment Status: ".$logData['payment_status']);
                }
                $this->_logger->info("Order Id: ".$magento_order_id." | Order Status: ".$magento_order_status);
                $order->setStatus($magento_order_status)->setState($magento_order_status);
                $this->_orderRepository->save($order);

                $objPaymentLog = $this->_paymentLogFactory->create();
                $objPaymentLog->setData($logData);
                $objPaymentLog->save();
            }
        }else{
            $this->_logger->info("All payment status checked.");
        }
        $this->_logger->info("END: " . __METHOD__ );
	}
    protected function _cURL($api_url, $data, $header)
    {
        $ch = curl_init();
        $options = [
            CURLOPT_URL => $api_url,
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_CUSTOMREQUEST => 'POST',
            CURLOPT_POSTFIELDS => $data,
            CURLOPT_HTTPHEADER => $header
        ];
        curl_setopt_array($ch, $options);
        $response = curl_exec($ch);
        curl_close($ch);
        return $response;
    }
}