class-wc-stripe-connect.php
5.28 KB
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
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
<?php
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
if ( ! class_exists( 'WC_Stripe_Connect' ) ) {
/**
* Stripe Connect class.
*/
class WC_Stripe_Connect {
const SETTINGS_OPTION = 'woocommerce_stripe_settings';
/**
* Stripe connect api.
*
* @var object $api
*/
private $api;
/**
* Constructor.
*
* @param WC_Stripe_Connect_API $api stripe connect api.
*/
public function __construct( WC_Stripe_Connect_API $api ) {
$this->api = $api;
add_action( 'admin_init', [ $this, 'maybe_handle_redirect' ] );
}
/**
* Gets the OAuth URL for Stripe onboarding flow
*
* @param string $return_url url to return to after oauth flow.
*
* @return string|WP_Error
*/
public function get_oauth_url( $return_url = '' ) {
if ( empty( $return_url ) ) {
$return_url = admin_url( 'admin.php?page=wc-settings&tab=checkout§ion=stripe&panel=settings' );
}
if ( substr( $return_url, 0, 8 ) !== 'https://' ) {
return new WP_Error( 'invalid_url_protocol', __( 'Your site must be served over HTTPS in order to connect your Stripe account automatically.', 'woocommerce-gateway-stripe' ) );
}
$result = $this->api->get_stripe_oauth_init( $return_url );
if ( is_wp_error( $result ) ) {
return $result;
}
return $result->oauthUrl; // phpcs:ignore WordPress.NamingConventions.ValidVariableName.UsedPropertyNotSnakeCase
}
/**
* Initiate OAuth connection request to Connect Server
*
* @param bool $state Stripe onboarding state.
* @param int $code OAuth code.
*
* @return string|WP_Error
*/
public function connect_oauth( $state, $code ) {
$response = $this->api->get_stripe_oauth_keys( $code );
if ( is_wp_error( $response ) ) {
return $response;
}
return $this->save_stripe_keys( $response );
}
/**
* Handle redirect back from oauth-init or credentials reset
*/
public function maybe_handle_redirect() {
if ( ! is_admin() ) {
return;
}
// redirect from oauth-init
if ( isset( $_GET['wcs_stripe_code'], $_GET['wcs_stripe_state'] ) ) {
$response = $this->connect_oauth( wc_clean( wp_unslash( $_GET['wcs_stripe_state'] ) ), wc_clean( wp_unslash( $_GET['wcs_stripe_code'] ) ) );
wp_safe_redirect( esc_url_raw( remove_query_arg( [ 'wcs_stripe_state', 'wcs_stripe_code' ] ) ) );
exit;
}
}
/**
* Saves stripe keys after OAuth response
*
* @param array $result OAuth response result.
*
* @return array|WP_Error
*/
private function save_stripe_keys( $result ) {
if ( ! isset( $result->publishableKey, $result->secretKey ) ) { // phpcs:ignore WordPress.NamingConventions.ValidVariableName.UsedPropertyNotSnakeCase
return new WP_Error( 'Invalid credentials received from WooCommerce Connect server' );
}
$is_test = false !== strpos( $result->publishableKey, '_test_' ); // phpcs:ignore WordPress.NamingConventions.ValidVariableName.UsedPropertyNotSnakeCase
$prefix = $is_test ? 'test_' : '';
$default_options = $this->get_default_stripe_config();
$options = array_merge( $default_options, get_option( self::SETTINGS_OPTION, [] ) );
$options['enabled'] = 'yes';
$options['testmode'] = $is_test ? 'yes' : 'no';
$options[ $prefix . 'publishable_key' ] = $result->publishableKey; // phpcs:ignore WordPress.NamingConventions.ValidVariableName.UsedPropertyNotSnakeCase
$options[ $prefix . 'secret_key' ] = $result->secretKey; // phpcs:ignore WordPress.NamingConventions.ValidVariableName.UsedPropertyNotSnakeCase
// While we are at it, let's also clear the account_id and
// test_account_id if present.
unset( $options['account_id'] );
unset( $options['test_account_id'] );
update_option( self::SETTINGS_OPTION, $options );
return $result;
}
/**
* Clears keys for test or production (whichever is presently enabled).
*/
private function clear_stripe_keys() {
$options = get_option( self::SETTINGS_OPTION, [] );
if ( 'yes' === $options['testmode'] ) {
$options['test_publishable_key'] = '';
$options['test_secret_key'] = '';
// clear test_account_id if present
unset( $options['test_account_id'] );
} else {
$options['publishable_key'] = '';
$options['secret_key'] = '';
// clear account_id if present
unset( $options['account_id'] );
}
update_option( self::SETTINGS_OPTION, $options );
}
/**
* Gets default Stripe settings
*/
private function get_default_stripe_config() {
$result = [];
$gateway = new WC_Gateway_Stripe();
foreach ( $gateway->form_fields as $key => $value ) {
if ( isset( $value['default'] ) ) {
$result[ $key ] = $value['default'];
}
}
return $result;
}
public function is_connected() {
$options = get_option( self::SETTINGS_OPTION, [] );
if ( isset( $options['testmode'] ) && 'yes' === $options['testmode'] ) {
return isset( $options['test_publishable_key'], $options['test_secret_key'] ) && trim( $options['test_publishable_key'] ) && trim( $options['test_secret_key'] );
} else {
return isset( $options['publishable_key'], $options['secret_key'] ) && trim( $options['publishable_key'] ) && trim( $options['secret_key'] );
}
}
}
}