| @@ -6,8 +6,12 @@ | ||
| 6 | 6 | */ |
| 7 | 7 | |
| 8 | 8 | add_action( 'usces_construct', 'usces_action_acting_construct', 10 ); |
| 9 | 9 | add_action( 'usces_after_cart_instant', 'usces_action_acting_transaction', 10 ); |
| 10 | +// A3 (Layer 3 / uscesid removal): restore the shopper's cart/entry for settlement notifications | |
| 11 | +// from the transaction-keyed DB store, uscesid-independently. Must run after usces_session_start() | |
| 12 | +// (constructor end) and before usces_main()'s `new usces_cart()`, hence the usces_main hook. | |
| 13 | +add_action( 'usces_main', 'usces_restore_acting_session_from_store', 1 ); | |
| 10 | 14 | |
| 11 | 15 | /** |
| 12 | 16 | * Settlement Result Notification Processing. |
| 13 | 17 | * usces_construct |
| @@ -19,10 +23,10 @@ | ||
| 19 | 23 | $rand = wp_unslash( $_POST['X-S_TORIHIKI_NO'] ); |
| 20 | 24 | $datas = array(); |
| 21 | 25 | /* 決済成功の時のみセッション復帰 */ |
| 22 | 26 | if ( 0 == $_POST['X-ERRLEVEL'] ) { |
| 23 | - $datas = usces_get_order_acting_data( $rand ); | |
| 24 | - $_GET['uscesid'] = $datas['sesid']; | |
| 27 | + $datas = usces_get_order_acting_data( $rand ); | |
| 28 | + // A3: uscesid ブリッジは廃止。セッション復元は usces_restore_acting_session_from_store()(usces_main)で DBストアから実施. | |
| 25 | 29 | if ( empty( $datas['sesid'] ) ) { |
| 26 | 30 | /* sesidが無い場合はファイルログのみ */ |
| 27 | 31 | usces_log( 'remise construct : error1', 'acting_transaction.log' ); |
| 28 | 32 | } else { |
| @@ -33,11 +37,11 @@ | ||
| 33 | 37 | |
| 34 | 38 | /* digitalcheck_conv */ |
| 35 | 39 | } elseif ( isset( $_POST['SID'] ) && isset( $_POST['FUKA'] ) && isset( $_POST['CVS'] ) ) { |
| 36 | 40 | |
| 37 | - $sid = wp_unslash( $_POST['SID'] ); | |
| 38 | - $datas = usces_get_order_acting_data( $sid ); | |
| 39 | - $_GET['uscesid'] = $datas['sesid']; | |
| 41 | + $sid = wp_unslash( $_POST['SID'] ); | |
| 42 | + $datas = usces_get_order_acting_data( $sid ); | |
| 43 | + // A3: uscesid ブリッジは廃止。セッション復元は usces_restore_acting_session_from_store()(usces_main)で DBストアから実施. | |
| 40 | 44 | if ( empty( $datas['sesid'] ) ) { |
| 41 | 45 | $log = array( |
| 42 | 46 | 'acting' => 'digitalcheck', |
| 43 | 47 | 'key' => $sid, |
| @@ -52,11 +56,11 @@ | ||
| 52 | 56 | |
| 53 | 57 | /* AnotherLane */ |
| 54 | 58 | } elseif ( isset( $_REQUEST['SiteId'] ) && isset( $_REQUEST['rand'] ) ) { |
| 55 | 59 | |
| 56 | - $rand = wp_unslash( $_REQUEST['rand'] ); | |
| 57 | - $datas = usces_get_order_acting_data( $rand ); | |
| 58 | - $_GET['uscesid'] = $datas['sesid']; | |
| 60 | + $rand = wp_unslash( $_REQUEST['rand'] ); | |
| 61 | + $datas = usces_get_order_acting_data( $rand ); | |
| 62 | + // A3: uscesid ブリッジは廃止。セッション復元は usces_restore_acting_session_from_store()(usces_main)で DBストアから実施. | |
| 59 | 63 | if ( empty( $datas['sesid'] ) ) { |
| 60 | 64 | $log = array( |
| 61 | 65 | 'acting' => 'anotherlane', |
| 62 | 66 | 'key' => $rand, |
| @@ -71,11 +75,13 @@ | ||
| 71 | 75 | |
| 72 | 76 | /* Veritrans */ |
| 73 | 77 | } elseif ( isset( $_POST['orderId'] ) && isset( $_POST['merchantEncryptionKey'] ) ) { |
| 74 | 78 | |
| 75 | - $orderid = wp_unslash( $_POST['orderId'] ); | |
| 76 | - $datas = usces_get_order_acting_data( $orderid ); | |
| 77 | - $_GET['uscesid'] = $datas['sesid']; | |
| 79 | + $orderid = wp_unslash( $_POST['orderId'] ); | |
| 80 | + $datas = usces_get_order_acting_data( $orderid ); | |
| 81 | + // A3: uscesid ブリッジは廃止($_GET['uscesid'] を読む処理は撤廃済みのため代入は無意味だった)。 | |
| 82 | + // ベリトランス Air-Web は選択可能な決済から除外済み(settlement.class.php)のため、DBストアからの | |
| 83 | + // セッション復元(usces_restore_acting_session_from_store)の対象外とする. | |
| 78 | 84 | if ( empty( $datas['sesid'] ) ) { |
| 79 | 85 | $log = array( |
| 80 | 86 | 'acting' => 'veritrans', |
| 81 | 87 | 'key' => $orderid, |
| @@ -90,8 +96,121 @@ | ||
| 90 | 96 | } |
| 91 | 97 | } |
| 92 | 98 | |
| 93 | 99 | /** |
| 100 | + * 決済通知(サーバー間・ブラウザ Cookie 無し)で、確定時に保存したカート/エントリを DBストア | |
| 101 | + * (usces_access)から $_SESSION へ復元する。uscesid セッション橋渡しの置き換え(Layer 3 / A3)。 | |
| 102 | + * | |
| 103 | + * usces_session_start()(コンストラクタ末尾)より後・usces_main() の `new usces_cart()` より前に | |
| 104 | + * 実行する必要があるため usces_main フックに登録する(construct では直後の @session_start() に | |
| 105 | + * 上書きされてしまうため)。復元後、usces_cart 生成 → usces_after_cart_instant | |
| 106 | + * (usces_action_acting_transaction)が $usces->cart->get_cart() を参照して処理する。 | |
| 107 | + * | |
| 108 | + * 対象はサーバー間通知でセッション復元が要る remise / digitalcheck_conv / AnotherLane。 | |
| 109 | + * | |
| 110 | + * usces_main | |
| 111 | + */ | |
| 112 | +function usces_restore_acting_session_from_store() { | |
| 113 | + $rand = ''; | |
| 114 | + if ( isset( $_POST['X-TRANID'] ) && ! isset( $_POST['OPT'] ) && isset( $_POST['X-S_TORIHIKI_NO'] ) ) { | |
| 115 | + /* remise: 決済成功時(X-ERRLEVEL == 0)のみ復元 */ | |
| 116 | + if ( isset( $_POST['X-ERRLEVEL'] ) && 0 == $_POST['X-ERRLEVEL'] ) { | |
| 117 | + $rand = wp_unslash( $_POST['X-S_TORIHIKI_NO'] ); | |
| 118 | + } | |
| 119 | + } elseif ( isset( $_POST['SID'] ) && isset( $_POST['FUKA'] ) && isset( $_POST['CVS'] ) ) { | |
| 120 | + /* digitalcheck_conv */ | |
| 121 | + $rand = wp_unslash( $_POST['SID'] ); | |
| 122 | + } elseif ( isset( $_REQUEST['SiteId'] ) && isset( $_REQUEST['rand'] ) ) { | |
| 123 | + /* AnotherLane: 通知は $_REQUEST(GET/POST 両様)。旧 usces_action_acting_construct の | |
| 124 | + * $_GET['uscesid']=$datas['sesid'] ブリッジの置き換え。KickType サーバー通知で order_processing() | |
| 125 | + * がカートを読む前にここで DBストアから復元する。 */ | |
| 126 | + $rand = wp_unslash( $_REQUEST['rand'] ); | |
| 127 | + } | |
| 128 | + | |
| 129 | + if ( '' === $rand ) { | |
| 130 | + return; | |
| 131 | + } | |
| 132 | + | |
| 133 | + $datas = usces_get_order_acting_data( $rand ); | |
| 134 | + if ( empty( $datas ) || empty( $datas['order_data'] ) ) { | |
| 135 | + return; | |
| 136 | + } | |
| 137 | + | |
| 138 | + $order_data = wel_safe_maybe_unserialize( $datas['order_data'] ); | |
| 139 | + if ( ! is_array( $order_data ) ) { | |
| 140 | + return; | |
| 141 | + } | |
| 142 | + | |
| 143 | + if ( isset( $order_data['cart'] ) && is_array( $order_data['cart'] ) ) { | |
| 144 | + /* | |
| 145 | + * DBストア(usces_access)の cart は save_order_acting_data() が保存した | |
| 146 | + * $usces->cart->get_cart() の「出力形式」= [ i => array( serial, post_id, sku, options, | |
| 147 | + * price, unit_price, quantity, advance ) ](インデックス配列)。 | |
| 148 | + * 一方 $_SESSION['usces_cart'] の「内部形式」は | |
| 149 | + * [ '<serial>' => array( 'price', 'unit_price', 'quant', 'advance' ) ](serial をキーにしたマップ)で、 | |
| 150 | + * usces_cart::get_cart()/key_unserialize() はこの内部形式を前提に読む | |
| 151 | + * (キー=serial/数量キーは 'quant')。そのまま代入すると整数キー 0 が serial として | |
| 152 | + * unserialize され false → array_keys(false) で致命的エラーになるため、内部形式へ変換して復元する。 | |
| 153 | + */ | |
| 154 | + $session_cart = array(); | |
| 155 | + foreach ( $order_data['cart'] as $item ) { | |
| 156 | + if ( ! is_array( $item ) || ! isset( $item['serial'] ) ) { | |
| 157 | + continue; | |
| 158 | + } | |
| 159 | + $session_cart[ $item['serial'] ] = array( | |
| 160 | + 'price' => isset( $item['price'] ) ? $item['price'] : 0, | |
| 161 | + 'unit_price' => isset( $item['unit_price'] ) ? $item['unit_price'] : 0, | |
| 162 | + 'quant' => isset( $item['quantity'] ) ? $item['quantity'] : 0, | |
| 163 | + 'advance' => isset( $item['advance'] ) ? $item['advance'] : '', | |
| 164 | + ); | |
| 165 | + } | |
| 166 | + $_SESSION['usces_cart'] = $session_cart; | |
| 167 | + } | |
| 168 | + if ( isset( $order_data['entry'] ) ) { | |
| 169 | + $_SESSION['usces_entry'] = $order_data['entry']; | |
| 170 | + } | |
| 171 | + usces_log( 'acting session restored from DB store (uscesid-independent) : ' . $rand, 'acting_transaction.log' ); | |
| 172 | +} | |
| 173 | + | |
| 174 | +/** | |
| 175 | + * 決済結果通知の送信元IPが許可リストに含まれるか判定する。 | |
| 176 | + * | |
| 177 | + * @param string $remote_addr Source IP address of the notification. | |
| 178 | + * @param array|string $allowed Allowed IP addresses / CIDR ranges. | |
| 179 | + * @return bool True when the source IP is allowed. | |
| 180 | + */ | |
| 181 | +function usces_acting_notice_ip_allowed( $remote_addr, $allowed ) { | |
| 182 | + if ( empty( $remote_addr ) || empty( $allowed ) ) { | |
| 183 | + return false; | |
| 184 | + } | |
| 185 | + $remote_long = ip2long( $remote_addr ); | |
| 186 | + if ( false === $remote_long ) { | |
| 187 | + return false; | |
| 188 | + } | |
| 189 | + foreach ( (array) $allowed as $entry ) { | |
| 190 | + $entry = trim( (string) $entry ); | |
| 191 | + if ( '' === $entry ) { | |
| 192 | + continue; | |
| 193 | + } | |
| 194 | + if ( false !== strpos( $entry, '/' ) ) { | |
| 195 | + list( $subnet, $bits ) = explode( '/', $entry, 2 ); | |
| 196 | + $subnet_long = ip2long( $subnet ); | |
| 197 | + $bits = (int) $bits; | |
| 198 | + if ( false === $subnet_long || $bits < 1 || 32 < $bits ) { | |
| 199 | + continue; | |
| 200 | + } | |
| 201 | + $mask = ( 0xFFFFFFFF << ( 32 - $bits ) ) & 0xFFFFFFFF; | |
| 202 | + if ( ( $remote_long & $mask ) === ( $subnet_long & $mask ) ) { | |
| 203 | + return true; | |
| 204 | + } | |
| 205 | + } elseif ( ip2long( $entry ) === $remote_long ) { | |
| 206 | + return true; | |
| 207 | + } | |
| 208 | + } | |
| 209 | + return false; | |
| 210 | +} | |
| 211 | + | |
| 212 | +/** | |
| 94 | 213 | * Settlement Result Notification Processing. |
| 95 | 214 | * usces_after_cart_instant |
| 96 | 215 | */ |
| 97 | 216 | function usces_action_acting_transaction() { |
| @@ -189,8 +308,9 @@ | ||
| 189 | 308 | $data = array(); |
| 190 | 309 | foreach ( $_POST as $key => $value ) { |
| 191 | 310 | $data[ $key ] = mb_convert_encoding( $value, 'UTF-8', 'SJIS' ); |
| 192 | 311 | } |
| 312 | + REMISE_SETTLEMENT::get_instance()->acting_notice_ip_guard( $data ); | |
| 193 | 313 | |
| 194 | 314 | $table_name = $wpdb->prefix . 'usces_order'; |
| 195 | 315 | $table_meta_name = $wpdb->prefix . 'usces_order_meta'; |
| 196 | 316 | |
| @@ -250,8 +370,9 @@ | ||
| 250 | 370 | case 'CPL_PRE': /* コンビニペーパーレス決済識別コード */ |
| 251 | 371 | break; |
| 252 | 372 | |
| 253 | 373 | case 'CPL': /* 入金確定 */ |
| 374 | + JPAYMENT_SETTLEMENT::get_instance()->acting_notice_ip_guard(); | |
| 254 | 375 | $acting = wp_unslash( $_REQUEST['acting'] ); |
| 255 | 376 | $data = array(); |
| 256 | 377 | foreach ( $_GET as $key => $value ) { |
| 257 | 378 | $data[ $key ] = esc_sql( $value ); |
| @@ -270,9 +391,9 @@ | ||
| 270 | 391 | 'result' => 'ORDER DATA KEY ERROR', |
| 271 | 392 | 'data' => $data, |
| 272 | 393 | ); |
| 273 | 394 | usces_save_order_acting_error( $log ); |
| 274 | - usces_log( 'jpayment conv error1 : ' . print_r( $data, true ), 'acting_transaction.log' ); | |
| 395 | + usces_log( 'ROBOT PAYMENT conv error1 : ' . print_r( $data, true ), 'acting_transaction.log' ); | |
| 275 | 396 | die( 'error1' ); |
| 276 | 397 | } |
| 277 | 398 | |
| 278 | 399 | $res = usces_change_order_receipt( $order_id, 'receipted' ); |
| @@ -283,9 +404,9 @@ | ||
| 283 | 404 | 'result' => 'ORDER DATA UPDATE ERROR', |
| 284 | 405 | 'data' => $data, |
| 285 | 406 | ); |
| 286 | 407 | usces_save_order_acting_error( $log ); |
| 287 | - usces_log( 'jpayment conv error2 : ' . print_r( $data, true ), 'acting_transaction.log' ); | |
| 408 | + usces_log( 'ROBOT PAYMENT conv error2 : ' . print_r( $data, true ), 'acting_transaction.log' ); | |
| 288 | 409 | die( 'error2' ); |
| 289 | 410 | } |
| 290 | 411 | |
| 291 | 412 | $res = $usces->set_order_meta_value( 'acting_' . $acting, serialize( $data ), $order_id ); |
| @@ -296,9 +417,9 @@ | ||
| 296 | 417 | 'result' => 'ORDER META DATA UPDATE ERROR', |
| 297 | 418 | 'data' => $data, |
| 298 | 419 | ); |
| 299 | 420 | usces_save_order_acting_error( $log ); |
| 300 | - usces_log( 'jpayment conv error3 : ' . print_r( $data, true ), 'acting_transaction.log' ); | |
| 421 | + usces_log( 'ROBOT PAYMENT conv error3 : ' . print_r( $data, true ), 'acting_transaction.log' ); | |
| 301 | 422 | die( 'error3' ); |
| 302 | 423 | } |
| 303 | 424 | |
| 304 | 425 | usces_action_acting_getpoint( $order_id ); |
| @@ -307,8 +428,9 @@ | ||
| 307 | 428 | die( 'ROBOT PAYMENT' ); |
| 308 | 429 | break; |
| 309 | 430 | |
| 310 | 431 | case 'CVS_CAN': /* 入金取消 */ |
| 432 | + JPAYMENT_SETTLEMENT::get_instance()->acting_notice_ip_guard(); | |
| 311 | 433 | $acting = wp_unslash( $_REQUEST['acting'] ); |
| 312 | 434 | $data = array(); |
| 313 | 435 | foreach ( $_GET as $key => $value ) { |
| 314 | 436 | $data[ $key ] = esc_sql( $value ); |
| @@ -327,9 +449,9 @@ | ||
| 327 | 449 | 'result' => 'ORDER DATA KEY ERROR', |
| 328 | 450 | 'data' => $data, |
| 329 | 451 | ); |
| 330 | 452 | usces_save_order_acting_error( $log ); |
| 331 | - usces_log( 'jpayment conv error1 : ' . print_r( $data, true ), 'acting_transaction.log' ); | |
| 453 | + usces_log( 'ROBOT PAYMENT conv error1 : ' . print_r( $data, true ), 'acting_transaction.log' ); | |
| 332 | 454 | die( 'error1' ); |
| 333 | 455 | } |
| 334 | 456 | |
| 335 | 457 | $res = usces_change_order_receipt( $order_id, 'noreceipt' ); |
| @@ -340,9 +462,9 @@ | ||
| 340 | 462 | 'result' => 'ORDER DATA UPDATE ERROR', |
| 341 | 463 | 'data' => $data, |
| 342 | 464 | ); |
| 343 | 465 | usces_save_order_acting_error( $log ); |
| 344 | - usces_log( 'jpayment conv error2 : ' . print_r( $data, true ), 'acting_transaction.log' ); | |
| 466 | + usces_log( 'ROBOT PAYMENT conv error2 : ' . print_r( $data, true ), 'acting_transaction.log' ); | |
| 345 | 467 | die( 'error2' ); |
| 346 | 468 | } |
| 347 | 469 | |
| 348 | 470 | $res = $usces->set_order_meta_value( 'acting_' . $acting, serialize( $data ), $order_id ); |
| @@ -353,9 +475,9 @@ | ||
| 353 | 475 | 'result' => 'ORDER META DATA UPDATE ERROR', |
| 354 | 476 | 'data' => $data, |
| 355 | 477 | ); |
| 356 | 478 | usces_save_order_acting_error( $log ); |
| 357 | - usces_log( 'jpayment conv error3 : ' . print_r( $data, true ), 'acting_transaction.log' ); | |
| 479 | + usces_log( 'ROBOT PAYMENT conv error3 : ' . print_r( $data, true ), 'acting_transaction.log' ); | |
| 358 | 480 | die( 'error3' ); |
| 359 | 481 | } |
| 360 | 482 | |
| 361 | 483 | usces_action_acting_getpoint( $order_id, false ); |
| @@ -371,8 +493,9 @@ | ||
| 371 | 493 | case 'BANK': /* 受付完了 */ |
| 372 | 494 | break; |
| 373 | 495 | |
| 374 | 496 | case 'BAN_SAL': /* 入金完了 */ |
| 497 | + JPAYMENT_SETTLEMENT::get_instance()->acting_notice_ip_guard(); | |
| 375 | 498 | if ( isset( $_GET['mf'] ) && '1' == wp_unslash( $_GET['mf'] ) ) { /* 入金マッチングの場合 */ |
| 376 | 499 | $acting = wp_unslash( $_REQUEST['acting'] ); |
| 377 | 500 | $data = array(); |
| 378 | 501 | foreach ( $_GET as $key => $value ) { |
| @@ -392,9 +515,9 @@ | ||
| 392 | 515 | 'result' => 'ORDER DATA KEY ERROR', |
| 393 | 516 | 'data' => $data, |
| 394 | 517 | ); |
| 395 | 518 | usces_save_order_acting_error( $log ); |
| 396 | - usces_log( 'jpayment bank error1 : ' . print_r( $data, true ), 'acting_transaction.log' ); | |
| 519 | + usces_log( 'ROBOT PAYMENT bank error1 : ' . print_r( $data, true ), 'acting_transaction.log' ); | |
| 397 | 520 | die( 'error1' ); |
| 398 | 521 | } |
| 399 | 522 | |
| 400 | 523 | $res = usces_change_order_receipt( $order_id, 'receipted' ); |
| @@ -405,9 +528,9 @@ | ||
| 405 | 528 | 'result' => 'ORDER DATA UPDATE ERROR', |
| 406 | 529 | 'data' => $data, |
| 407 | 530 | ); |
| 408 | 531 | usces_save_order_acting_error( $log ); |
| 409 | - usces_log( 'jpayment bank error2 : ' . print_r( $data, true ), 'acting_transaction.log' ); | |
| 532 | + usces_log( 'ROBOT PAYMENT bank error2 : ' . print_r( $data, true ), 'acting_transaction.log' ); | |
| 410 | 533 | die( 'error2' ); |
| 411 | 534 | } |
| 412 | 535 | |
| 413 | 536 | $res = $usces->set_order_meta_value( 'acting_' . $acting, serialize( $data ), $order_id ); |
| @@ -418,9 +541,9 @@ | ||
| 418 | 541 | 'result' => 'ORDER META DATA UPDATE ERROR', |
| 419 | 542 | 'data' => $data, |
| 420 | 543 | ); |
| 421 | 544 | usces_save_order_acting_error( $log ); |
| 422 | - usces_log( 'jpayment bank error3 : ' . print_r( $data, true ), 'acting_transaction.log' ); | |
| 545 | + usces_log( 'ROBOT PAYMENT bank error3 : ' . print_r( $data, true ), 'acting_transaction.log' ); | |
| 423 | 546 | die( 'error3' ); |
| 424 | 547 | } |
| 425 | 548 | |
| 426 | 549 | usces_action_acting_getpoint( $order_id ); |
| @@ -454,73 +577,9 @@ | ||
| 454 | 577 | usces_log( 'PayPal IPN transaction : ' . wp_unslash( $_REQUEST['txn_id'] ), 'acting_transaction.log' ); |
| 455 | 578 | } |
| 456 | 579 | die( 'PayPal' ); |
| 457 | 580 | |
| 458 | - /* PayPal ipn (WPP) */ | |
| 459 | - } elseif ( isset( $_REQUEST['ipn_track_id'] ) ) { | |
| 460 | - $data = array(); | |
| 461 | - foreach ( $_REQUEST as $key => $value ) { | |
| 462 | - $data[ $key ] = $value; | |
| 463 | - } | |
| 464 | - usces_log( 'paypal ipn : ' . print_r( $data, true ), 'acting_transaction.log' ); | |
| 465 | - | |
| 466 | - /* PayPal Webpayment Plus */ | |
| 467 | - if ( isset( $_POST['txn_type'] ) && 'pro_hosted' == wp_unslash( $_POST['txn_type'] ) ) { | |
| 468 | - $acting_opts = $usces->options['acting_settings']['paypal_wpp']; | |
| 469 | - $key = isset( $_POST['custom'] ) ? wp_unslash( $_POST['custom'] ) : ''; | |
| 470 | - usces_log( serialize( $data ), 'db', 'paypal_ipn', $key ); | |
| 471 | - $ipn_res = usces_paypal_ipn_check( $acting_opts['host_url'] ); | |
| 472 | - if ( true === $ipn_res[0] ) { | |
| 473 | - $order_id = $ipn_res['order_id']; | |
| 474 | - usces_restore_order_acting_data( $order_id ); | |
| 475 | - $res = $usces->order_processing(); | |
| 476 | - if ( 'ordercompletion' == $res ) { | |
| 477 | - usces_log( 'PayPal Webpayment Plus : Payment confirmation', 'acting_transaction.log' ); | |
| 478 | - $usces->cart->crear_cart(); | |
| 479 | - } else { | |
| 480 | - $log = array( | |
| 481 | - 'acting' => 'paypal_wpp', | |
| 482 | - 'key' => $key, | |
| 483 | - 'result' => 'ORDER DATA REGISTERED ERROR', | |
| 484 | - 'data' => wp_unslash( $_POST ), | |
| 485 | - ); | |
| 486 | - usces_save_order_acting_error( $log ); | |
| 487 | - usces_log( 'PayPal Webpayment Plus : Error', 'acting_transaction.log' ); | |
| 488 | - } | |
| 489 | - } else { | |
| 490 | - $log = array( | |
| 491 | - 'acting' => 'paypal_wpp', | |
| 492 | - 'key' => $key, | |
| 493 | - 'result' => 'PAYPAL IPN CHECK ERROR', | |
| 494 | - 'data' => $ipn_res, | |
| 495 | - ); | |
| 496 | - usces_save_order_acting_error( $log ); | |
| 497 | - } | |
| 498 | - exit; | |
| 499 | - | |
| 500 | - } else { | |
| 501 | - $table_name = $wpdb->prefix . 'usces_order'; | |
| 502 | - $table_meta_name = $wpdb->prefix . 'usces_order_meta'; | |
| 503 | - if ( isset( $_REQUEST['txn_id'] ) || isset( $_REQUEST['recurring_payment_id'] ) ) { | |
| 504 | - if ( ( isset( $_REQUEST['payment_status'] ) && 'Completed' == wp_unslash( $_REQUEST['payment_status'] ) ) || | |
| 505 | - ( isset( $_REQUEST['profile_status'] ) && 'Active' == wp_unslash( $_REQUEST['profile_status'] ) ) ) { | |
| 506 | - $settlement_id = ( isset( $_REQUEST['recurring_payment_id'] ) ) ? wp_unslash( $_REQUEST['recurring_payment_id'] ) : wp_unslash( $_REQUEST['txn_id'] ); | |
| 507 | - $query = $wpdb->prepare( "SELECT ID, order_status FROM $table_name INNER JOIN $table_meta_name ON ID = order_id WHERE meta_key = %s AND meta_value = %s", 'settlement_id', $settlement_id ); | |
| 508 | - $order_data = $wpdb->get_row( $query, ARRAY_A ); | |
| 509 | - if ( $order_data ) { | |
| 510 | - if ( $usces->is_status( 'pending', $order_data['order_status'] ) ) { | |
| 511 | - $order_status = str_replace( 'pending', 'receipted', $order_data['order_status'] ); | |
| 512 | - $query = $wpdb->prepare( "UPDATE $table_name SET order_status = %s WHERE ID = %d", $order_status, $order_data['ID'] ); | |
| 513 | - $res = $wpdb->query( $query ); | |
| 514 | - } | |
| 515 | - do_action( 'usces_action_paypal_ipn_status_completed', $order_data ); | |
| 516 | - } | |
| 517 | - } | |
| 518 | - } | |
| 519 | - die( 'PayPal' ); | |
| 520 | - } | |
| 521 | - | |
| 522 | - /* telecom edy */ | |
| 581 | + /* telecom edy 提供対象外のため無効化. CVE-2026-19887(PHP Object Injection)対応. | |
| 523 | 582 | } elseif ( isset( $_REQUEST['clientip'] ) && isset( $_REQUEST['sendid'] ) && ( isset( $_REQUEST['acting'] ) && 'telecom_edy' == $_REQUEST['acting'] ) ) { |
| 524 | 583 | $data = array(); |
| 525 | 584 | foreach ( $_REQUEST as $key => $value ) { |
| 526 | 585 | $data[ $key ] = $value; |
| @@ -535,9 +594,9 @@ | ||
| 535 | 594 | if ( 'yes' === wp_unslash( $_REQUEST['rel'] ) && isset( $_REQUEST['option'] ) ) { |
| 536 | 595 | $table_meta_name = $wpdb->prefix . 'usces_order_meta'; |
| 537 | 596 | $mquery = $wpdb->prepare( "SELECT order_id, meta_value FROM $table_meta_name WHERE meta_key = %s", wp_unslash( $_REQUEST['option'] ) ); |
| 538 | 597 | $mvalue = $wpdb->get_row( $mquery, ARRAY_A ); |
| 539 | - $value = unserialize( $mvalue['meta_value'] ); | |
| 598 | + $value = wel_safe_maybe_unserialize( $mvalue['meta_value'] ); | |
| 540 | 599 | $_SESSION['usces_cart'] = $value['usces_cart']; |
| 541 | 600 | $_SESSION['usces_entry'] = $value['usces_entry']; |
| 542 | 601 | $_SESSION['usces_member'] = $value['usces_member']; |
| 543 | 602 | $res = $usces->order_processing(); |
| @@ -565,11 +624,17 @@ | ||
| 565 | 624 | usces_save_order_acting_error( $log ); |
| 566 | 625 | usces_log( 'telecom edy - Error 2 : ' . print_r( $data, true ), 'acting_transaction.log' ); |
| 567 | 626 | } |
| 568 | 627 | die( 'SuccessOK' ); |
| 628 | + */ | |
| 569 | 629 | |
| 570 | 630 | /* telecom credit */ |
| 571 | 631 | } elseif ( isset( $_REQUEST['clientip'] ) && isset( $_REQUEST['sendid'] ) && isset( $_REQUEST['rel'] ) ) { |
| 632 | + $acting_clientip = ( isset( $usces->options['acting_settings']['telecom']['clientip'] ) ) ? (string) $usces->options['acting_settings']['telecom']['clientip'] : ''; | |
| 633 | + if ( '' === $acting_clientip || (string) wp_unslash( $_REQUEST['clientip'] ) !== $acting_clientip ) { | |
| 634 | + /* 設定済みクライアントIPと一致しない通知は正規のものではないため記録せず終了 */ | |
| 635 | + die( 'SuccessOK' ); | |
| 636 | + } | |
| 572 | 637 | $data = array(); |
| 573 | 638 | foreach ( $_REQUEST as $key => $value ) { |
| 574 | 639 | $data[ $key ] = $value; |
| 575 | 640 | } |
| @@ -657,8 +722,9 @@ | ||
| 657 | 722 | } |
| 658 | 723 | $sid = ( isset( $data['SID'] ) ) ? $data['SID'] : ''; |
| 659 | 724 | |
| 660 | 725 | if ( isset( $data['SEQ'] ) ) { |
| 726 | + DIGITALCHECK_SETTLEMENT::get_instance()->acting_notice_ip_guard( $data ); | |
| 661 | 727 | $table_name = $wpdb->prefix . 'usces_order'; |
| 662 | 728 | $table_meta_name = $wpdb->prefix . 'usces_order_meta'; |
| 663 | 729 | $query = $wpdb->prepare( "SELECT `order_id` FROM $table_meta_name WHERE `meta_key` = %s AND `meta_value` = %s", 'SID', $sid ); |
| 664 | 730 | $order_id = $wpdb->get_var( $query ); |
| @@ -781,9 +847,9 @@ | ||
| 781 | 847 | header( 'location: ' . USCES_CART_URL . $delim . 'acting=mizuho_card&acting_return=1&stran=' . $stran . '&mbtran=' . $mbtran . '&rsltcd=' . $rsltcd ); |
| 782 | 848 | } |
| 783 | 849 | die(); |
| 784 | 850 | |
| 785 | - /* mizuho conv */ | |
| 851 | + /* mizuho conv 提供対象外のため無効化。 | |
| 786 | 852 | } elseif ( ( isset( $_GET['p_ver'] ) && '0200' == wp_unslash( $_GET['p_ver'] ) ) && ( isset( $_GET['bkcode'] ) && ( 'cv01' == wp_unslash( $_GET['bkcode'] ) || 'cv02' == wp_unslash( $_GET['bkcode'] ) ) ) ) { |
| 787 | 853 | usces_log( 'mizuho conv : ' . print_r( $_GET, true ), 'acting_transaction.log' ); |
| 788 | 854 | $stran = ( array_key_exists( 'stran', $_REQUEST ) ) ? wp_unslash( $_REQUEST['stran'] ) : ''; |
| 789 | 855 | $mbtran = ( array_key_exists( 'mbtran', $_REQUEST ) ) ? wp_unslash( $_REQUEST['mbtran'] ) : ''; |
| @@ -792,9 +858,9 @@ | ||
| 792 | 858 | $tdate = ( array_key_exists( 'tdate', $_REQUEST ) ) ? wp_unslash( $_REQUEST['tdate'] ) : ''; |
| 793 | 859 | $rsltcd = ( array_key_exists( 'rsltcd', $_REQUEST ) ) ? wp_unslash( $_REQUEST['rsltcd'] ) : ''; |
| 794 | 860 | $permalink_structure = get_option( 'permalink_structure' ); |
| 795 | 861 | $delim = ( ! $usces->use_ssl && $permalink_structure ) ? '?' : '&'; |
| 796 | - if ( '' != $tdate ) { /* 入金通知 */ | |
| 862 | + if ( '' != $tdate ) { // 入金通知 | |
| 797 | 863 | $data = array(); |
| 798 | 864 | foreach ( $_REQUEST as $key => $value ) { |
| 799 | 865 | $data[ $key ] = $value; |
| 800 | 866 | } |
| @@ -836,11 +902,11 @@ | ||
| 836 | 902 | } |
| 837 | 903 | } else { |
| 838 | 904 | usces_log( 'mizuho conv : ' . print_r( wp_unslash( $_GET ), true ), 'acting_transaction.log' ); |
| 839 | 905 | } |
| 840 | - } elseif ( '108' == substr( $rsltcd, 0, 3 ) || '208' == substr( $rsltcd, 0, 3 ) || '308' == substr( $rsltcd, 0, 3 ) ) { /* キャンセル */ | |
| 906 | + } elseif ( '108' == substr( $rsltcd, 0, 3 ) || '208' == substr( $rsltcd, 0, 3 ) || '308' == substr( $rsltcd, 0, 3 ) ) { // キャンセル | |
| 841 | 907 | header( 'location: ' . USCES_CART_URL . $delim . 'confirm=1' ); |
| 842 | - } elseif ( '109' == substr( $rsltcd, 0, 3 ) || '209' == substr( $rsltcd, 0, 3 ) || '309' == substr( $rsltcd, 0, 3 ) ) { /* エラー */ | |
| 908 | + } elseif ( '109' == substr( $rsltcd, 0, 3 ) || '209' == substr( $rsltcd, 0, 3 ) || '309' == substr( $rsltcd, 0, 3 ) ) { // エラー | |
| 843 | 909 | $log = array( |
| 844 | 910 | 'acting' => 'mizuho_conv', |
| 845 | 911 | 'key' => $stran, |
| 846 | 912 | 'result' => $rsltcd, |
| @@ -852,8 +918,9 @@ | ||
| 852 | 918 | } else { |
| 853 | 919 | header( 'location: ' . USCES_CART_URL . $delim . 'acting=mizuho_conv&acting_return=1&stran=' . $stran . '&mbtran=' . $mbtran . '&bktrans=' . wp_unslash( $_GET['bktrans'] ) . '&tranid=' . $tranid . '&rsltcd=' . $rsltcd ); |
| 854 | 920 | } |
| 855 | 921 | die(); |
| 922 | + */ | |
| 856 | 923 | |
| 857 | 924 | /* AnotherLane credit */ |
| 858 | 925 | } elseif ( isset( $_REQUEST['SiteId'] ) && isset( $_REQUEST['TransactionId'] ) && isset( $_REQUEST['Result'] ) ) { |
| 859 | 926 | $data = array(); |