From 88d1912b3af34ec43160394bb6b3463a42d610be Mon Sep 17 00:00:00 2001 From: ki Date: Wed, 31 May 2023 11:38:33 +0900 Subject: [PATCH] =?UTF-8?q?[GXM-91]=20feat:=20=EB=84=A4=EC=9D=B4=EB=B2=84?= =?UTF-8?q?=ED=8E=98=EC=9D=B4=20=EC=A3=BC=EB=AC=B8=ED=98=95=20=EB=B0=B0?= =?UTF-8?q?=EC=86=A1=EC=A7=80=20=EB=B3=80=EA=B2=BD=20=EB=8C=80=EC=9D=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- IamportPlugin.php | 20 ++++++++++++--- iamport-naverpay.php | 60 +++++++++++++++++++++++++++++++++++++++++++ lib/IamportHelper.php | 1 + readme.txt | 5 +++- 4 files changed, 82 insertions(+), 4 deletions(-) diff --git a/IamportPlugin.php b/IamportPlugin.php index 737bd87..5f93519 100644 --- a/IamportPlugin.php +++ b/IamportPlugin.php @@ -3,7 +3,7 @@ * Plugin Name: 우커머스용 아임포트 플러그인(국내 모든 PG를 한 번에) * Plugin URI: http://www.iamport.kr * Description: 우커머스용 한국PG 연동 플러그인 ( 신용카드 / 실시간계좌이체 / 가상계좌 / 휴대폰소액결제 - 에스크로포함 ) - * Version: 2.2.35 + * Version: 2.2.36 * Author: PortOne * Author URI: https://portone.io/ * @@ -100,6 +100,7 @@ function init_iamport_plugin() { $label_refund = IamportHelper::display_label(IamportHelper::STATUS_REFUND); $label_exchange = IamportHelper::display_label(IamportHelper::STATUS_EXCHANGE); + $label_address_changed = IamportHelper::DEFAULT_STATUS_ADDRESS_CHANGED; register_post_status( 'wc-refund-request', array( 'label' => __( "{$label_refund}", 'iamport-for-woocommerce' ), @@ -119,6 +120,15 @@ function init_iamport_plugin() { 'label_count' => _n_noop( "{$label_exchange} (%s)", "{$label_exchange} (%s)" ) ) ); + register_post_status( 'wc-address-changed', array( + 'label' => __( "{$label_address_changed}", 'iamport-for-woocommerce' ), + 'public' => true, + 'exclude_from_search' => false, + 'show_in_admin_all_list' => true, + 'show_in_admin_status_list' => true, + 'label_count' => _n_noop( "{$label_address_changed} (%s)", "{$label_address_changed} (%s)" ) + ) ); + //상품 제공기간 add_action( 'woocommerce_product_options_advanced', 'iamport_advanced_meta' ); @@ -145,9 +155,11 @@ function add_cancel_actions_to_order_statuses( $order_statuses ) { if ( 'wc-cancelled' === $key ) { $label_refund = IamportHelper::display_label(IamportHelper::STATUS_REFUND); $label_exchange = IamportHelper::display_label(IamportHelper::STATUS_EXCHANGE); + $label_address_changed = IamportHelper::DEFAULT_STATUS_ADDRESS_CHANGED; $new_order_statuses['wc-refund-request'] = __( "{$label_refund}", 'iamport-for-woocommerce' ); $new_order_statuses['wc-exchange-request'] = __( "{$label_exchange}", 'iamport-for-woocommerce' ); + $new_order_statuses['wc-address-changed'] = __( "{$label_address_changed}", 'iamport-for-woocommerce' ); } } @@ -873,6 +885,7 @@ public function __construct() { abstract protected function get_gateway_id(); abstract public function iamport_order_detail( $order_id ); + public function update_shipping_info($order, $payment_data) {} public function init_form_fields() { //iamport기본 플러그인에 해당 정보가 세팅되어있는지 먼저 확인 @@ -986,6 +999,9 @@ public function check_payment_response() { $this->_iamport_post_meta($order_id, '_iamport_paymethod', $payment_data->pay_method); $this->_iamport_post_meta($order_id, '_iamport_pg_tid', $payment_data->pg_tid); $this->_iamport_post_meta($order_id, '_iamport_receipt_url', $payment_data->receipt_url); + + $order = new WC_Order( $order_id ); + $gateway->update_shipping_info($order, $payment_data); if ( $payment_data->status === 'paid' ) { $loggers[] = "B:paid"; @@ -995,8 +1011,6 @@ public function check_payment_response() { //lock the row $synced_row = $wpdb->get_row("SELECT * FROM {$wpdb->prefix}posts WHERE ID = {$order_id} FOR UPDATE"); - $order = new WC_Order( $order_id ); //lock잡은 후 호출(2017-01-16 : 의미없음. [1.6.8] synced_row의 값을 활용해서 status체크해야 함) - if ( $gateway->is_paid_confirmed($order, $payment_data) ) { $loggers[] = "C:confirm"; diff --git a/iamport-naverpay.php b/iamport-naverpay.php index 80d9762..8a540ed 100644 --- a/iamport-naverpay.php +++ b/iamport-naverpay.php @@ -629,6 +629,66 @@ public function is_paid_confirmed($order, $payment_data) { return $payment_data->status === 'paid'; //이미 paid인 건에 대해서만 is_paid_confirmed가 호출되기는 하지만 한 번 더 체크 } + public function update_shipping_info($order, $payment_data) { + try { + // 네이버페이 상품주문정보 조회 + $impUid = $payment_data->imp_uid; + + $iamport = new WooIamport($this->imp_rest_key, $this->imp_rest_secret); + $result = $iamport->getNaverProductOrders($impUid); + + if ( $result->success ) { + $productOrders = $result->data; + + $shippingNotes = array(); + foreach ($productOrders as $idx=>$po) { + //product line item + $productLineItem = IamportHelper::findProductItem($order, $po->product_id, self::getVariationIdFromQuery($po->product_option_id), self::getAttributesFromQuery($po->product_option_id)); + if ($productLineItem) { + $productLineItem->add_meta_data('naver_product_order_id', $po->product_order_id); + $productLineItem->add_meta_data('naver_product_order_status', $po->product_order_status); + $productLineItem->add_meta_data('product_amount', $po->product_amount); + $productLineItem->add_meta_data('delivery_amount', $po->delivery_amount); + $productLineItem->add_meta_data('shipping_memo', $po->shipping_memo ? $po->shipping_memo : '없음'); + $productLineItem->add_meta_data('shipping_due', $po->shipping_due ? date('Y-m-d H:i:s', $po->shipping_due + get_option('gmt_offset')*HOUR_IN_SECONDS) : '없음'); + $productLineItem->save_meta_data(); + } + + $shippingNotes[] = sprintf( __( '[상품명 : %s] 배송요청사항 : %s (배송기한 : %s)', 'iamport-for-woocommerce' ), + $po->product_name, + $po->shipping_memo ? $po->shipping_memo : "없음", + $po->shipping_due ? date('Y-m-d H:i:s', $po->shipping_due + get_option('gmt_offset')*HOUR_IN_SECONDS) : "없음"); + + if ( $idx == 0 ) { //첫번째 상품정보에서 orderer / shipping 정보 추출 + if(!empty($order->get_shipping_address_1()) && ($order->get_shipping_address_1() != $po->shipping_address->base)) { + $order->add_order_note("네이버페이 배송지가 변경되었습니다."); + $order->update_status('address-changed'); + } + $order->set_billing_first_name( $po->orderer->name ); + $order->set_billing_email( $po->orderer->id . "@naver.com" ); + $order->set_billing_phone( $po->orderer->tel ); + + $order->set_shipping_first_name( $po->shipping_address->name ); + $order->add_meta_data( "_shipping_phone1", $po->shipping_address->tel1, true ); //구리지만 어쩔 수 없음 + $order->add_meta_data( "_shipping_phone2", $po->shipping_address->tel2, true ); //구리지만 어쩔 수 없음 + $order->set_shipping_address_1( $po->shipping_address->base ); + $po->shipping_address->detail ? $order->set_shipping_address_2( $po->shipping_address->detail ) : $order->set_shipping_address_2(""); + $order->set_shipping_postcode( $po->shipping_address->postcode ); + } + } + + $orderComment = implode(",\n", $shippingNotes); + $order->set_customer_note( $orderComment ); + } else { + $order->add_order_note( '[네이버페이-상세조회실패] ' . $result->error['message'] ); + error_log('[네이버페이-상세조회실패] ' . $result->error['message']); + } + } catch (Exception $e) { + $order->add_order_note( '[네이버페이-상세조회실패] ' . $e->getMessage() ); + error_log($e); + } + } + public function update_shipping_amount($order, $payment_data) { $shipping_amount = $payment_data->amount - $order->get_total(); diff --git a/lib/IamportHelper.php b/lib/IamportHelper.php index a34b54a..8c916b2 100644 --- a/lib/IamportHelper.php +++ b/lib/IamportHelper.php @@ -11,6 +11,7 @@ class IamportHelper const DEFAULT_STATUS_REFUND = '반품요청'; const DEFAULT_STATUS_EXCHANGE = '교환요청'; const DEFAULT_STATUS_AWAITING_VBANK = '가상계좌 입금대기 중'; + const DEFAULT_STATUS_ADDRESS_CHANGED = '배송지 변경'; public static function get_customer_uid($order) { diff --git a/readme.txt b/readme.txt index 254adf8..19a1f4d 100644 --- a/readme.txt +++ b/readme.txt @@ -4,7 +4,7 @@ Donate link: http://www.iamport.kr Tags: 네이버페이, 카카오페이, 페이코, 이니시스, KCP, naverpay, naver, payco, kakao, kakaopay, kpay, inicis, 유플러스, lguplus, uplus, 나이스, 나이스페이, nice, nicepay, 제이티넷, 티페이, jtnet, tpay, 다날, danal, 모빌리언스, mobilians, 정기결제, subscription, 해외카드, visa, master, jcb, shopping, mall, iamport Requires at least: 3.5 Tested up to: 5.5.1 -Stable tag: 2.2.35 +Stable tag: 2.2.36 License: GPLv2 or later License URI: http://www.gnu.org/licenses/gpl-2.0.html @@ -60,6 +60,9 @@ https://www.facebook.com/iamportservice == Changelog == += 2.2.36 = +* 네이버페이 주문형 결제 후 배송지 변경 시, 주문 건에 반영되도록 기능 추가 + = 2.2.35 = * 엑심베이에 몰페이 결제수단 추가