summaryrefslogtreecommitdiff
path: root/snippets/oidc-woocommerce.php
blob: 815b749727c48e22c7b4d0eec028e20d6b7f7c0b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
/**
 * This code is in the public domain.
 *
 * This snippet integrates the OIDC connect button with WooCommerce
 * to allow importing the customer's shopping details via OIDC.
 */

/**
 * Add OIDC login form to checkout page.
 */
add_action ('openid-connect-generic-register-login-form',
    function ( $login_form ) {

        // if WooCommerce is inactive, do nothing
        if ( ! in_array( 'woocommerce/woocommerce.php',
                         apply_filters( 'active_plugins',
                                        get_option( 'active_plugins' ) ) ) ) {
             return;
        }

	// show login form at the shopping cart (if not logged in)
	add_action( 'woocommerce_before_checkout_billing_form',
                    function () use ( $login_form ) {
                             $user = wp_get_current_user ();
                             if (0 == $user->ID) {
		                // ID 0 is used to indicate user is not logged in.
                                // Re-use filter logic to generate login page
        	                print ( $login_form->handle_login_page ('') );
	                     }
                     });

        // Add action to set cookie to redirect back to current
        // (checkout) page after OIDC provided the data
        add_action( 'woocommerce_before_checkout_billing_form',
                    array( $login_form, 'handle_redirect_cookie' ) );

    }
);


// hook to convert OIDC fields to WC checkout fields if logged in
add_filter( 'woocommerce_checkout_fields',
            'filter_checkout_get_value' );


/**
 * Filter to transform (defaults) for the Billing details according to
 * the information obtained from OpenID Connect (OIDC).  WooCommerce
 * already grabs many of the values properly, but there are some fields
 * which we have to convert manually.
 */
function filter_checkout_get_value ($in=array()){
    $user = wp_get_current_user ();
    if (0 != $user->ID) {
	$token_response = $user->get ('openid-connect-generic-last-user-claim');
	if ( (isset( $token_response)) &&
             (array_key_exists ('given_name', $token_response)) ){
                 $given_name = $token_response [ 'given_name' ];
 	         $in['billing']['billing_first_name']['default'] = $given_name;
	         $in['shipping']['shipping_first_name']['default'] = $given_name;
        }
	if ( (isset( $token_response)) &&
             (array_key_exists ('family_name', $token_response)) ){
                 $family_name = $token_response [ 'family_name' ];
 	         $in['billing']['billing_last_name']['default'] = $family_name;
		 $in['shipping']['shipping_last_name']['default'] = $family_name;
        }
	if ( (isset( $token_response)) &&
             (array_key_exists ('phone_number', $token_response)) ){
                 $phone_number = $token_response [ 'phone_number' ];
 		 $in['billing']['billing_phone']['default'] = $phone_number;
		 $in['shipping']['shipping_phone']['default'] = $phone_number;
        }
        if ( (isset( $token_response)) &&
             (array_key_exists ('address', $token_response)) ){
		 $address = $token_response [ 'address' ];
		 if ( array_key_exists( 'postal_code', $address ) ){
			$postal_code = $address [ 'postal_code' ];
			$in['billing']['billing_postcode']['default'] = $postal_code;
			$in['shipping']['shipping_postcode']['default'] = $postal_code;
		 }
		 if ( array_key_exists( 'country', $address ) ){
			$country = $address [ 'country' ];
			$in['billing']['billing_country']['default'] = $country;
			$in['shipping']['shipping_country']['default'] = $country;
		 }
		 if ( array_key_exists( 'locality', $address ) ){
			$locality = $address [ 'locality' ];
			$in['billing']['billing_city']['default'] = $locality;
			$in['shipping']['shipping_city']['default'] = $locality;
		 }
		 if ( array_key_exists ( 'region', $address ) ){
			$region = $address [ 'region' ];
			$in['billing']['billing_state']['default'] = $region;
			$in['shipping']['shipping_state']['default'] = $region;
		 }
		 if ( array_key_exists ( 'formatted', $address ) ){
			$formatted = $address [ 'formatted' ];
			$lines = explode ( '\r\n', $formatted );
			if ( count($lines) > 0 ){
				$in['billing']['billing_address_1']['default'] = $lines[0];
				$in['shipping']['shipping_address_1']['default'] = $lines[0];
			}
			if ( count($lines) > 1 ){
				$in['billing']['billing_address_2']['default'] = $lines[1];
				$in['shipping']['shipping_address_2']['default'] = $lines[1];
			}
		 }
		 if ( array_key_exists ( 'street_address', $address ) ){
			$street_address = $address [ 'street_address' ];
			if ( ! array_key_exists ( 'formatted', $address ) ){
				$in['billing']['billing_address_1']['default'] = $street_address;
			        $in['shipping']['shipping_address_1']['default'] = $street_address;
		        }
		}
	}
    }
    return $in;
}