PluginProbe
PayPlug for WooCommerce (Official) / 2.8.2
PayPlug for WooCommerce (Official) v2.8.2
3.0.0 2.18.0 1.0.17 1.0.18 1.0.19 1.0.20 1.0.21 1.0.22 1.0.3 1.0.4 1.0.5 1.0.6 1.0.7 1.0.8 1.1.0 1.10.0 1.10.1 1.2.1 1.2.10 1.2.11 1.2.2 1.2.3 1.2.4 1.2.5 1.2.6 All 101 releases
payplug / src / Gateway / PayplugAddressData.php

PayplugAddressData.php in PayPlug for WooCommerce (Official) 2.8.2, at src/Gateway/PayplugAddressData.php

305 lines 10.9 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 namespace Payplug\PayplugWoocommerce\Gateway;
4
5 // Exit if accessed directly
6 if ( ! defined( 'ABSPATH' ) ) {
7 exit;
8 }
9
10 use libphonenumber\PhoneNumberFormat;
11 use libphonenumber\PhoneNumberType;
12 use libphonenumber\PhoneNumberUtil;
13 use Payplug\PayplugWoocommerce\PayplugWoocommerceHelper;
14
15 class PayplugAddressData {
16
17 const DELIVERY_TYPE_BILLING = 'BILLING';
18 const DELIVERY_TYPE_VERIFIED = 'VERIFIED';
19 const DELIVERY_TYPE_NEW = 'NEW';
20 const DELIVERY_TYPE_SHIP_TO_STORE = 'SHIP_TO_STORE';
21 const DELIVERY_TYPE_DIGITAL_GOODS = 'DIGITAL_GOODS';
22 const DELIVERY_TYPE_TRAVEL_OR_EVENT = 'TRAVEL_OR_EVENT';
23 const DELIVERY_TYPE_OTHER = 'OTHER';
24
25 public static $address_fields = [
26 'address1',
27 'address2',
28 'postcode',
29 'city',
30 'state',
31 'country'
32 ];
33
34 /**
35 * @var array
36 */
37 protected $billing;
38
39 /**
40 * @var array
41 */
42 protected $shipping;
43
44 /**
45 * Get address data from order.
46 *
47 * @param $order
48 *
49 * @return PayplugAddressData
50 * @throws \InvalidArgumentException
51 */
52 public static function from_order( $order ) {
53 if ( ! is_a( $order, '\WC_Order' ) ) {
54 throw new \InvalidArgumentException(
55 sprintf( 'Expected WC_Order object, got %s', get_class( $order ) )
56 );
57 }
58
59 $address_data = new PayplugAddressData();
60 $address_data->prepare_address_data( $order );
61
62 return $address_data;
63 }
64
65 /**
66 * Check if an address has already been used by a customer
67 *
68 * @param int $customer
69 * @param string $hash
70 *
71 * @return bool
72 */
73 public static function address_already_used( $customer, $hash ) {
74 $hash_list = self::get_customer_addresses_hash( $customer );
75
76 return ! empty( $hash_list ) && in_array( $hash, $hash_list );
77 }
78
79 /**
80 * Get the list of hash of all addresses used by the customer
81 *
82 * @param int $customer
83 *
84 * @return array
85 */
86 public static function get_customer_addresses_hash( $customer ) {
87 $hash_list = get_user_meta( $customer, 'payplug_addresses_hash', true );
88
89 return is_array( $hash_list ) ? $hash_list : [];
90 }
91
92 /**
93 * Update the list of hash of all addresses used by the customer
94 *
95 * @param int $customer
96 * @param array $hash_list
97 *
98 * @return bool
99 */
100 public static function update_customer_addresses_hash( $customer, $hash_list ) {
101 $result = update_user_meta( $customer, 'payplug_addresses_hash', $hash_list );
102
103 return false !== $result;
104 }
105
106 /**
107 * Hash an address
108 *
109 * @param array $address
110 *
111 * @return string
112 */
113 public static function hash_address( $address ) {
114
115 $to_hash = '';
116 foreach ( self::$address_fields as $field ) {
117 if ( empty( $address[ $field ] ) ) {
118 continue;
119 }
120
121 $to_hash .= strtolower( remove_accents( $address[ $field ] ) );
122 }
123
124 return md5( $to_hash );
125 }
126
127 /**
128 * Get billing data.
129 *
130 * @return array|null
131 */
132 public function get_billing() {
133 return ( ! empty( $this->billing ) ) ? $this->billing : null;
134 }
135
136 /**
137 * Get shipping data.
138 *
139 * @return array|null
140 */
141 public function get_shipping() {
142 return ( ! empty( $this->shipping ) ) ? $this->shipping : null;
143 }
144
145 /**
146 * Prepare data for billing and shipping.
147 *
148 * @param \WC_Order $order
149 */
150 protected function prepare_address_data( $order ) {
151
152 $customer = PayplugWoocommerceHelper::is_pre_30() ? $order->customer_user : $order->get_customer_id();
153
154 $billing_first_name = PayplugWoocommerceHelper::is_pre_30() ? $order->billing_first_name : $order->get_billing_first_name();
155 $billing_last_name = PayplugWoocommerceHelper::is_pre_30() ? $order->billing_last_name : $order->get_billing_last_name();
156 $billing_email = PayplugWoocommerceHelper::is_pre_30() ? $order->billing_email : $order->get_billing_email();
157 $billing_address1 = PayplugWoocommerceHelper::is_pre_30() ? $order->billing_address_1 : $order->get_billing_address_1();
158 $billing_address2 = PayplugWoocommerceHelper::is_pre_30() ? $order->billing_address_2 : $order->get_billing_address_2();
159 $billing_postcode = PayplugWoocommerceHelper::is_pre_30() ? $order->billing_postcode : $order->get_billing_postcode();
160 $billing_city = PayplugWoocommerceHelper::is_pre_30() ? $order->billing_city : $order->get_billing_city();
161 $billing_country = PayplugWoocommerceHelper::is_pre_30() ? $order->billing_country : $order->get_billing_country();
162 $billing_company = PayplugWoocommerceHelper::is_pre_30() ? $order->billing_company : $order->get_billing_company();
163 if (empty($billing_company)) {
164 $billing_company = $billing_first_name .' '. $billing_last_name;
165 }
166
167 if ( ! PayplugWoocommerceHelper::is_country_supported( $billing_country ) ) {
168 $billing_country = PayplugWoocommerceHelper::get_default_country();
169 }
170
171 $this->billing = [
172 'first_name' => $this->limit_length( $billing_first_name ),
173 'last_name' => $this->limit_length( $billing_last_name ),
174 'email' => $this->limit_length( $billing_email, 255 ),
175 'address1' => $this->limit_length( $billing_address1, 255 ),
176 'postcode' => $this->limit_length( $billing_postcode, 16 ),
177 'city' => $this->limit_length( $billing_city ),
178 'country' => $this->limit_length( $billing_country, 2 ),
179 'company_name' => $this->limit_length( $billing_company )
180 ];
181
182 if ( ! empty( $billing_address2 ) ) {
183 $this->billing['address2'] = $this->limit_length( $billing_address2, 255 );
184 }
185
186 // We need to know if current cart contain products we will be shipped to the customer
187 // to set the correct `delivery_type` value
188 if ( WC()->cart->needs_shipping() ) {
189 $has_shipping_address = PayplugWoocommerceHelper::is_pre_30()
190 ? $order->shipping_address_1
191 : $order->get_shipping_address_1();
192
193 if ( $has_shipping_address && ! wc_ship_to_billing_address_only() ) {
194 $shipping_first_name = PayplugWoocommerceHelper::is_pre_30() ? $order->shipping_first_name : $order->get_shipping_first_name();
195 $shipping_last_name = PayplugWoocommerceHelper::is_pre_30() ? $order->shipping_last_name : $order->get_shipping_last_name();
196 // Using email from billing address since Woocommerce doesn't provide one for the shipping address by default.
197 $shipping_email = PayplugWoocommerceHelper::is_pre_30() ? $order->billing_email : $order->get_billing_email();
198 $shipping_address1 = PayplugWoocommerceHelper::is_pre_30() ? $order->shipping_address_1 : $order->get_shipping_address_1();
199 $shipping_address2 = PayplugWoocommerceHelper::is_pre_30() ? $order->shipping_address_2 : $order->get_shipping_address_2();
200 $shipping_postcode = PayplugWoocommerceHelper::is_pre_30() ? $order->shipping_postcode : $order->get_shipping_postcode();
201 $shipping_city = PayplugWoocommerceHelper::is_pre_30() ? $order->shipping_city : $order->get_shipping_city();
202 $shipping_country = PayplugWoocommerceHelper::is_pre_30() ? $order->shipping_country : $order->get_shipping_country();
203 $shipping_company = PayplugWoocommerceHelper::is_pre_30() ? $order->shipping_company : $order->get_shipping_company();
204
205 if (empty($shipping_company)) {
206 $shipping_company = $shipping_first_name .' '. $shipping_last_name;
207 }
208
209 if ( ! PayplugWoocommerceHelper::is_country_supported( $shipping_country ) ) {
210 $shipping_country = PayplugWoocommerceHelper::get_default_country();
211 }
212
213 $this->shipping = [
214 'first_name' => $this->limit_length( $shipping_first_name ),
215 'last_name' => $this->limit_length( $shipping_last_name ),
216 'email' => $this->limit_length( $shipping_email, 255 ),
217 'address1' => $this->limit_length( $shipping_address1, 255 ),
218 'postcode' => $this->limit_length( $shipping_postcode, 16 ),
219 'city' => $this->limit_length( $shipping_city ),
220 'country' => $this->limit_length( $shipping_country, 2 ),
221 'company_name' => $this->limit_length( $shipping_company )
222 ];
223
224 if ( ! empty( $shipping_address2 ) ) {
225 $this->shipping['address2'] = $this->limit_length( $shipping_address2, 255 );
226 }
227
228 if ( $customer > 0 ) {
229 $address_hash = self::hash_address( $this->shipping );
230 $address_already_used = self::address_already_used( $customer, $address_hash );
231
232 // Set the delivery_type to `VERIFIED` if the customer has already used the address before
233 // otherwise set it to `NEW` since we have separate shipping address
234 $this->shipping['delivery_type'] = ( $address_already_used )
235 ? self::DELIVERY_TYPE_VERIFIED
236 : self::DELIVERY_TYPE_NEW;
237 } else {
238 // Set the delivery_type to `NEW` since we have separate shipping address
239 $this->shipping['delivery_type'] = self::DELIVERY_TYPE_NEW;
240 }
241 } else {
242 $this->shipping = $this->billing;
243
244 if ( $customer > 0 ) {
245 $address_hash = self::hash_address( $this->shipping );
246 $address_already_used = self::address_already_used( $customer, $address_hash );
247
248 // Set the delivery_type to `VERIFIED` if the customer has already used the address before
249 // otherwise set it to `BILLING` since we reuse the billing address for shipping
250 $this->shipping['delivery_type'] = ( $address_already_used )
251 ? self::DELIVERY_TYPE_VERIFIED
252 : self::DELIVERY_TYPE_BILLING;
253 } else {
254 // Set the delivery_type to `BILLING` since we reuse the billing address for shipping
255 $this->shipping['delivery_type'] = self::DELIVERY_TYPE_BILLING;
256 }
257 }
258 } else {
259 // Set the delivery_type to `OTHER` since we dont't need to ship the products
260 $this->shipping = $this->billing;
261 $this->shipping['delivery_type'] = self::DELIVERY_TYPE_OTHER;
262 }
263
264 // Maybe set the phone field if available
265 $country = PayplugWoocommerceHelper::is_pre_30() ? $order->billing_country : $order->get_billing_country();
266 $phone = PayplugWoocommerceHelper::is_pre_30() ? $order->billing_phone : $order->get_billing_phone();
267 if ( ! empty( $phone ) && ! empty( $country ) ) {
268 try {
269 $phone_number_util = PhoneNumberUtil::getInstance();
270 $phone_number = $phone_number_util->parse( $phone, $country );
271
272 if ( ! $phone_number_util->isValidNumber( $phone_number ) ) {
273 throw new \Exception( 'Invalid phone number' );
274 }
275
276 if ( PhoneNumberType::MOBILE === $phone_number_util->getNumberType( $phone_number ) ) {
277 $this->billing['mobile_phone_number'] = $phone_number_util->format( $phone_number, PhoneNumberFormat::E164 );
278 $this->shipping['mobile_phone_number'] = $phone_number_util->format( $phone_number, PhoneNumberFormat::E164 );
279 } else {
280 $this->billing['landline_phone_number'] = $phone_number_util->format( $phone_number, PhoneNumberFormat::E164 );
281 }
282 } catch ( \Exception $e ) {
283 // Fail to parse phone number.
284 // Could be an incorrect number or the number doesn't belong to the billing country.
285 }
286 }
287 }
288
289 /**
290 * Limit string length.
291 *
292 * @param string $value
293 * @param int $maxlength
294 *
295 * @return string
296 */
297 protected function limit_length( $value, $maxlength = 100 ) {
298 if ( ! empty( $value ) ) {
299 $value = ( strlen( $value ) > $maxlength ) ? substr( $value, 0, $maxlength ) : $value;
300 }
301
302 return $value;
303 }
304 }
305