Edit File by line
/home/zeestwma/ceyloniy.../wp-conte.../plugins/wpforms-.../src/Integrat.../Square
File: Process.php
*
[500] Fix | Delete
* @since 1.9.5
[501] Fix | Delete
*
[502] Fix | Delete
* @param array $plan Plan settings.
[503] Fix | Delete
*
[504] Fix | Delete
* @return bool
[505] Fix | Delete
*/
[506] Fix | Delete
protected function is_subscription_plan_valid( array $plan ): bool {
[507] Fix | Delete
[508] Fix | Delete
return ! empty( $plan['customer_email'] ) && $this->is_recurring_settings_ok( $plan );
[509] Fix | Delete
}
[510] Fix | Delete
[511] Fix | Delete
/**
[512] Fix | Delete
* Check if recurring settings is configured correctly.
[513] Fix | Delete
*
[514] Fix | Delete
* @since 1.9.5
[515] Fix | Delete
*
[516] Fix | Delete
* @param array $settings Settings data.
[517] Fix | Delete
*
[518] Fix | Delete
* @return bool
[519] Fix | Delete
*/
[520] Fix | Delete
protected function is_recurring_settings_ok( array $settings ): bool {
[521] Fix | Delete
[522] Fix | Delete
$error = '';
[523] Fix | Delete
[524] Fix | Delete
// Check subscription settings are provided.
[525] Fix | Delete
if ( empty( $settings['phase_cadence'] ) || empty( $settings['customer_email'] ) || empty( $settings['customer_name'] ) ) {
[526] Fix | Delete
$error = esc_html__( 'Square subscription payment stopped, missing form settings.', 'wpforms-lite' );
[527] Fix | Delete
}
[528] Fix | Delete
[529] Fix | Delete
// Check for required customer email.
[530] Fix | Delete
if ( ! $error && empty( $this->fields[ $settings['customer_email'] ]['value'] ) ) {
[531] Fix | Delete
$error = esc_html__( 'Square subscription payment stopped, customer email not found.', 'wpforms-lite' );
[532] Fix | Delete
}
[533] Fix | Delete
[534] Fix | Delete
// Check for required customer name.
[535] Fix | Delete
if ( ! $error && empty( $this->fields[ $settings['customer_name'] ]['value'] ) ) {
[536] Fix | Delete
$error = esc_html__( 'Square subscription payment stopped, customer name not found.', 'wpforms-lite' );
[537] Fix | Delete
}
[538] Fix | Delete
[539] Fix | Delete
// Before proceeding, check if any basic errors were detected.
[540] Fix | Delete
if ( $error ) {
[541] Fix | Delete
$this->log_errors( $error, $settings );
[542] Fix | Delete
[543] Fix | Delete
return false;
[544] Fix | Delete
}
[545] Fix | Delete
[546] Fix | Delete
return true;
[547] Fix | Delete
}
[548] Fix | Delete
[549] Fix | Delete
/**
[550] Fix | Delete
* Retrieve single payment args.
[551] Fix | Delete
*
[552] Fix | Delete
* @since 1.9.5
[553] Fix | Delete
*
[554] Fix | Delete
* @return array
[555] Fix | Delete
*/
[556] Fix | Delete
private function get_payment_args_single(): array {
[557] Fix | Delete
[558] Fix | Delete
$args = $this->get_payment_args_general();
[559] Fix | Delete
$customer_name = $this->get_customer_name();
[560] Fix | Delete
$customer_email = $this->get_customer_email();
[561] Fix | Delete
[562] Fix | Delete
// Billing Name.
[563] Fix | Delete
if ( isset( $customer_name['first_name'] ) ) {
[564] Fix | Delete
$args['billing']['first_name'] = sanitize_text_field( $customer_name['first_name'] );
[565] Fix | Delete
}
[566] Fix | Delete
[567] Fix | Delete
if ( isset( $customer_name['last_name'] ) ) {
[568] Fix | Delete
$args['billing']['last_name'] = sanitize_text_field( $customer_name['last_name'] );
[569] Fix | Delete
}
[570] Fix | Delete
[571] Fix | Delete
// Billing Address.
[572] Fix | Delete
if ( ! empty( $this->fields[ $this->settings['billing_address'] ] ) ) {
[573] Fix | Delete
$args['billing']['address'] = $this->fields[ $this->settings['billing_address'] ];
[574] Fix | Delete
}
[575] Fix | Delete
[576] Fix | Delete
// Buyer Email.
[577] Fix | Delete
if ( ! empty( $customer_email ) ) {
[578] Fix | Delete
$args['buyer_email'] = sanitize_email( $customer_email );
[579] Fix | Delete
}
[580] Fix | Delete
[581] Fix | Delete
// Payment description.
[582] Fix | Delete
$description = empty( $this->settings['payment_description'] ) ? $this->get_form_name() : html_entity_decode( $this->settings['payment_description'], ENT_COMPAT, 'UTF-8' );
[583] Fix | Delete
[584] Fix | Delete
// The maximum length for the Square notes field is 500 characters.
[585] Fix | Delete
$args['note'] = wp_html_excerpt( Square::APP_NAME . ': ' . $description, 500 );
[586] Fix | Delete
[587] Fix | Delete
// Order items.
[588] Fix | Delete
$args['order_items'] = $this->get_order_items();
[589] Fix | Delete
[590] Fix | Delete
/**
[591] Fix | Delete
* Filter single payment arguments.
[592] Fix | Delete
*
[593] Fix | Delete
* @param array $args The single payment arguments.
[594] Fix | Delete
* @param Process $process The Process instance.
[595] Fix | Delete
*
[596] Fix | Delete
*@since 1.9.5
[597] Fix | Delete
*/
[598] Fix | Delete
return (array) apply_filters( 'wpforms_square_process_get_payment_args_single', $args, $this ); // phpcs:ignore WPForms.PHP.ValidateHooks.InvalidHookName
[599] Fix | Delete
}
[600] Fix | Delete
[601] Fix | Delete
/**
[602] Fix | Delete
* Retrieve arguments for any type of payment.
[603] Fix | Delete
*
[604] Fix | Delete
* @since 1.9.5
[605] Fix | Delete
*
[606] Fix | Delete
* @return array
[607] Fix | Delete
*/
[608] Fix | Delete
private function get_payment_args_general(): array {
[609] Fix | Delete
/**
[610] Fix | Delete
* Filter arguments for any type of payment.
[611] Fix | Delete
*
[612] Fix | Delete
* @since 1.9.5
[613] Fix | Delete
*
[614] Fix | Delete
* @param array $args The general payment arguments.
[615] Fix | Delete
* @param Process $process The Process instance.
[616] Fix | Delete
*/
[617] Fix | Delete
return (array) apply_filters( // phpcs:ignore WPForms.PHP.ValidateHooks.InvalidHookName
[618] Fix | Delete
'wpforms_square_process_get_payment_args_general',
[619] Fix | Delete
[
[620] Fix | Delete
'amount' => Helpers::format_amount( $this->amount ),
[621] Fix | Delete
'currency' => $this->currency,
[622] Fix | Delete
'location_id' => Helpers::get_location_id(),
[623] Fix | Delete
],
[624] Fix | Delete
$this
[625] Fix | Delete
);
[626] Fix | Delete
}
[627] Fix | Delete
[628] Fix | Delete
/**
[629] Fix | Delete
* Retrieve a payment currency.
[630] Fix | Delete
*
[631] Fix | Delete
* @since 1.9.5
[632] Fix | Delete
*
[633] Fix | Delete
* @return string
[634] Fix | Delete
*/
[635] Fix | Delete
private function get_currency(): string {
[636] Fix | Delete
[637] Fix | Delete
return strtoupper( wpforms_get_currency() );
[638] Fix | Delete
}
[639] Fix | Delete
[640] Fix | Delete
/**
[641] Fix | Delete
* Retrieve a payment amount.
[642] Fix | Delete
*
[643] Fix | Delete
* @since 1.9.5
[644] Fix | Delete
*
[645] Fix | Delete
* @return string
[646] Fix | Delete
*/
[647] Fix | Delete
private function get_amount(): string {
[648] Fix | Delete
[649] Fix | Delete
$amount = wpforms_get_total_payment( $this->fields );
[650] Fix | Delete
[651] Fix | Delete
return $amount === false ? wpforms_sanitize_amount( 0 ) : $amount;
[652] Fix | Delete
}
[653] Fix | Delete
[654] Fix | Delete
/**
[655] Fix | Delete
* Retrieve order items.
[656] Fix | Delete
*
[657] Fix | Delete
* @since 1.9.5
[658] Fix | Delete
*
[659] Fix | Delete
* @return array
[660] Fix | Delete
*/
[661] Fix | Delete
private function get_order_items(): array {
[662] Fix | Delete
[663] Fix | Delete
/**
[664] Fix | Delete
* Filter order items types.
[665] Fix | Delete
*
[666] Fix | Delete
* @since 1.9.5
[667] Fix | Delete
*
[668] Fix | Delete
* @param array $types The order items types.
[669] Fix | Delete
*/
[670] Fix | Delete
$types = (array) apply_filters( 'wpforms_square_process_get_order_items_types', wpforms_payment_fields() ); // phpcs:ignore WPForms.PHP.ValidateHooks.InvalidHookName
[671] Fix | Delete
$items = [];
[672] Fix | Delete
[673] Fix | Delete
foreach ( $this->fields as $field_id => $field ) {
[674] Fix | Delete
[675] Fix | Delete
if (
[676] Fix | Delete
empty( $field['type'] ) ||
[677] Fix | Delete
! in_array( $field['type'], $types, true )
[678] Fix | Delete
) {
[679] Fix | Delete
continue;
[680] Fix | Delete
}
[681] Fix | Delete
[682] Fix | Delete
// Skip payment field that is not filled in.
[683] Fix | Delete
if (
[684] Fix | Delete
! isset( $this->entry['fields'][ $field_id ] ) ||
[685] Fix | Delete
wpforms_is_empty_string( $this->entry['fields'][ $field_id ] )
[686] Fix | Delete
) {
[687] Fix | Delete
continue;
[688] Fix | Delete
}
[689] Fix | Delete
[690] Fix | Delete
$items[] = $this->prepare_order_line_item( $field );
[691] Fix | Delete
}
[692] Fix | Delete
[693] Fix | Delete
return $items;
[694] Fix | Delete
}
[695] Fix | Delete
[696] Fix | Delete
/**
[697] Fix | Delete
* Retrieve a Form Name.
[698] Fix | Delete
*
[699] Fix | Delete
* @since 1.9.5
[700] Fix | Delete
*
[701] Fix | Delete
* @return string
[702] Fix | Delete
*/
[703] Fix | Delete
private function get_form_name(): string {
[704] Fix | Delete
[705] Fix | Delete
if ( ! empty( $this->form_data['settings']['form_title'] ) ) {
[706] Fix | Delete
return sanitize_text_field( $this->form_data['settings']['form_title'] );
[707] Fix | Delete
}
[708] Fix | Delete
[709] Fix | Delete
$fallback = sprintf( /* translators: %d - Form ID. */
[710] Fix | Delete
esc_html__( 'Form #%d', 'wpforms-lite' ),
[711] Fix | Delete
$this->form_id
[712] Fix | Delete
);
[713] Fix | Delete
[714] Fix | Delete
$form_obj = wpforms()->obj( 'form' );
[715] Fix | Delete
[716] Fix | Delete
if ( ! $form_obj ) {
[717] Fix | Delete
return $fallback;
[718] Fix | Delete
}
[719] Fix | Delete
[720] Fix | Delete
$form = $form_obj->get( $this->form_id );
[721] Fix | Delete
[722] Fix | Delete
return $form instanceof WP_Post ? $form->post_title : $fallback;
[723] Fix | Delete
}
[724] Fix | Delete
[725] Fix | Delete
/**
[726] Fix | Delete
* Retrieve a Square credit card field.
[727] Fix | Delete
*
[728] Fix | Delete
* @since 1.9.5
[729] Fix | Delete
*
[730] Fix | Delete
* @return array
[731] Fix | Delete
*/
[732] Fix | Delete
private function get_credit_card_field(): array {
[733] Fix | Delete
[734] Fix | Delete
if ( ! is_array( $this->fields ) ) {
[735] Fix | Delete
return [];
[736] Fix | Delete
}
[737] Fix | Delete
[738] Fix | Delete
foreach ( $this->fields as $field ) {
[739] Fix | Delete
if ( ! empty( $field['type'] ) && $field['type'] === 'square' ) {
[740] Fix | Delete
return $field;
[741] Fix | Delete
}
[742] Fix | Delete
}
[743] Fix | Delete
[744] Fix | Delete
return [];
[745] Fix | Delete
}
[746] Fix | Delete
[747] Fix | Delete
/**
[748] Fix | Delete
* Prepare order line item.
[749] Fix | Delete
*
[750] Fix | Delete
* @since 1.9.5
[751] Fix | Delete
*
[752] Fix | Delete
* @param array $field Field data.
[753] Fix | Delete
*
[754] Fix | Delete
* @return array
[755] Fix | Delete
*/
[756] Fix | Delete
private function prepare_order_line_item( array $field ): array {
[757] Fix | Delete
[758] Fix | Delete
$field_id = absint( $field['id'] );
[759] Fix | Delete
$quantity = isset( $field['quantity'] ) ? (int) $field['quantity'] : 1;
[760] Fix | Delete
$name = empty( $field['name'] ) ? sprintf( /* translators: %d - Field ID. */ esc_html__( 'Field #%d', 'wpforms-lite' ), $field_id ) : $field['name'];
[761] Fix | Delete
$item = [
[762] Fix | Delete
'name' => $name,
[763] Fix | Delete
'quantity' => $quantity,
[764] Fix | Delete
];
[765] Fix | Delete
[766] Fix | Delete
if ( empty( $field['value_raw'] ) ) {
[767] Fix | Delete
$item['amount'] = Helpers::format_amount( $field['amount_raw'] );
[768] Fix | Delete
[769] Fix | Delete
return $item;
[770] Fix | Delete
}
[771] Fix | Delete
[772] Fix | Delete
return $this->prepare_order_line_item_variations( $item, $field, $field_id );
[773] Fix | Delete
}
[774] Fix | Delete
[775] Fix | Delete
/**
[776] Fix | Delete
* Prepare order line item variations.
[777] Fix | Delete
*
[778] Fix | Delete
* @since 1.9.5
[779] Fix | Delete
*
[780] Fix | Delete
* @param array $item Item data.
[781] Fix | Delete
* @param array $field Field data.
[782] Fix | Delete
* @param int $field_id Field ID.
[783] Fix | Delete
*
[784] Fix | Delete
* @return array
[785] Fix | Delete
*/
[786] Fix | Delete
private function prepare_order_line_item_variations( array $item, array $field, int $field_id ): array {
[787] Fix | Delete
[788] Fix | Delete
$values = explode( ',', $field['value_raw'] );
[789] Fix | Delete
[790] Fix | Delete
foreach ( $values as $value ) {
[791] Fix | Delete
[792] Fix | Delete
if ( empty( $this->form_data['fields'][ $field_id ]['choices'][ $value ] ) ) {
[793] Fix | Delete
continue;
[794] Fix | Delete
}
[795] Fix | Delete
[796] Fix | Delete
$choice = $this->form_data['fields'][ $field_id ]['choices'][ $value ];
[797] Fix | Delete
[798] Fix | Delete
$item['variations'][] = [
[799] Fix | Delete
'name' => $item['name'],
[800] Fix | Delete
'quantity' => $item['quantity'],
[801] Fix | Delete
'variation_name' => empty( $choice['label'] ) ? sprintf( /* translators: %d - Choice ID. */ esc_html__( 'Choice %d', 'wpforms-lite' ), absint( $value ) ) : $choice['label'],
[802] Fix | Delete
'amount' => Helpers::format_amount( $choice['value'] ),
[803] Fix | Delete
];
[804] Fix | Delete
}
[805] Fix | Delete
[806] Fix | Delete
return $item;
[807] Fix | Delete
}
[808] Fix | Delete
[809] Fix | Delete
/**
[810] Fix | Delete
* Display form errors.
[811] Fix | Delete
*
[812] Fix | Delete
* @since 1.9.5
[813] Fix | Delete
*
[814] Fix | Delete
* @param array $errors Errors to display.
[815] Fix | Delete
*/
[816] Fix | Delete
private function display_errors( array $errors = [] ) {
[817] Fix | Delete
[818] Fix | Delete
if ( ! $errors ) {
[819] Fix | Delete
$errors = $this->errors;
[820] Fix | Delete
}
[821] Fix | Delete
[822] Fix | Delete
if ( ! $errors || ! is_array( $errors ) ) {
[823] Fix | Delete
return;
[824] Fix | Delete
}
[825] Fix | Delete
[826] Fix | Delete
// Check if the form contains a required credit card. If it does
[827] Fix | Delete
// and there was an error, return the error to the user and prevent
[828] Fix | Delete
// the form from being submitted. This should not occur under normal
[829] Fix | Delete
// circumstances.
[830] Fix | Delete
if ( empty( $this->cc_field ) || empty( $this->form_data['fields'][ $this->cc_field['id'] ] ) ) {
[831] Fix | Delete
return;
[832] Fix | Delete
}
[833] Fix | Delete
[834] Fix | Delete
if ( ! empty( $this->form_data['fields'][ $this->cc_field['id'] ]['required'] ) ) {
[835] Fix | Delete
wpforms()->obj( 'process' )->errors[ $this->form_id ]['footer'] = implode( '<br>', $errors );
[836] Fix | Delete
}
[837] Fix | Delete
}
[838] Fix | Delete
[839] Fix | Delete
/**
[840] Fix | Delete
* Collect errors from API and turn it into form errors.
[841] Fix | Delete
*
[842] Fix | Delete
* @since 1.9.5
[843] Fix | Delete
*
[844] Fix | Delete
* @param string $type Payment type (e.g. 'single').
[845] Fix | Delete
*/
[846] Fix | Delete
private function process_api_errors( string $type ) { // phpcs:ignore Generic.CodeAnalysis.UnusedFunctionParameter.Found
[847] Fix | Delete
[848] Fix | Delete
$errors = $this->api->get_errors();
[849] Fix | Delete
[850] Fix | Delete
if ( empty( $errors ) || ! is_array( $errors ) ) {
[851] Fix | Delete
return;
[852] Fix | Delete
}
[853] Fix | Delete
[854] Fix | Delete
$this->display_errors( $errors );
[855] Fix | Delete
[856] Fix | Delete
if ( $type === 'subscription' ) {
[857] Fix | Delete
$title = esc_html__( 'Square subscription payment stopped', 'wpforms-lite' );
[858] Fix | Delete
} else {
[859] Fix | Delete
$title = esc_html__( 'Square payment stopped', 'wpforms-lite' );
[860] Fix | Delete
}
[861] Fix | Delete
[862] Fix | Delete
$_errors = $this->api->get_response_errors();
[863] Fix | Delete
[864] Fix | Delete
if ( ! empty( $_errors ) ) {
[865] Fix | Delete
$this->process_api_errors_codes( $_errors );
[866] Fix | Delete
$errors[] = $_errors;
[867] Fix | Delete
}
[868] Fix | Delete
[869] Fix | Delete
// Log transaction specific errors.
[870] Fix | Delete
$this->log_errors( $title, $errors );
[871] Fix | Delete
}
[872] Fix | Delete
[873] Fix | Delete
/**
[874] Fix | Delete
* Check specific error codes.
[875] Fix | Delete
*
[876] Fix | Delete
* @since 1.9.5
[877] Fix | Delete
*
[878] Fix | Delete
* @param array $errors The last API call errors.
[879] Fix | Delete
*/
[880] Fix | Delete
private function process_api_errors_codes( array $errors ) {
[881] Fix | Delete
[882] Fix | Delete
$codes = $this->get_oauth_error_codes();
[883] Fix | Delete
[884] Fix | Delete
foreach ( $errors as $error ) {
[885] Fix | Delete
[886] Fix | Delete
if (
[887] Fix | Delete
empty( $error['code'] ) ||
[888] Fix | Delete
! in_array( $error['code'], $codes, true )
[889] Fix | Delete
) {
[890] Fix | Delete
continue;
[891] Fix | Delete
}
[892] Fix | Delete
[893] Fix | Delete
// If the error indicates that access token is bad, set a connection as invalid.
[894] Fix | Delete
$this->connection
[895] Fix | Delete
->set_status( Connection::STATUS_INVALID )
[896] Fix | Delete
->save();
[897] Fix | Delete
}
[898] Fix | Delete
}
[899] Fix | Delete
[900] Fix | Delete
/**
[901] Fix | Delete
* Retrieve OAuth-related errors.
[902] Fix | Delete
*
[903] Fix | Delete
* @since 1.9.5
[904] Fix | Delete
*
[905] Fix | Delete
* @link https://developer.squareup.com/docs/oauth-api/best-practices#ensure-api-calls-made-with-oauth-tokens-handle-token-based-errors-appropriately
[906] Fix | Delete
*
[907] Fix | Delete
* @return array
[908] Fix | Delete
*/
[909] Fix | Delete
private function get_oauth_error_codes(): array {
[910] Fix | Delete
[911] Fix | Delete
return [ ErrorCode::ACCESS_TOKEN_EXPIRED, ErrorCode::ACCESS_TOKEN_REVOKED, ErrorCode::UNAUTHORIZED ];
[912] Fix | Delete
}
[913] Fix | Delete
[914] Fix | Delete
/**
[915] Fix | Delete
* Log payment errors.
[916] Fix | Delete
*
[917] Fix | Delete
* @since 1.9.5
[918] Fix | Delete
*
[919] Fix | Delete
* @param string $title Error title.
[920] Fix | Delete
* @param array|string $messages Error messages.
[921] Fix | Delete
* @param string $level Error level to add to 'payment' error level.
[922] Fix | Delete
*/
[923] Fix | Delete
protected function log_errors( string $title, $messages = [], string $level = 'error' ) {
[924] Fix | Delete
[925] Fix | Delete
wpforms_log(
[926] Fix | Delete
$title,
[927] Fix | Delete
$messages,
[928] Fix | Delete
[
[929] Fix | Delete
'type' => [ 'payment', $level ],
[930] Fix | Delete
'form_id' => $this->form_id,
[931] Fix | Delete
]
[932] Fix | Delete
);
[933] Fix | Delete
}
[934] Fix | Delete
[935] Fix | Delete
/**
[936] Fix | Delete
* Update the credit card field value to contain basic details.
[937] Fix | Delete
*
[938] Fix | Delete
* @since 1.9.5
[939] Fix | Delete
*/
[940] Fix | Delete
private function update_credit_card_field_value() {
[941] Fix | Delete
[942] Fix | Delete
if ( $this->errors || ! $this->api ) {
[943] Fix | Delete
return;
[944] Fix | Delete
}
[945] Fix | Delete
[946] Fix | Delete
// Get a card.
[947] Fix | Delete
$card = $this->get_card();
[948] Fix | Delete
[949] Fix | Delete
if ( empty( $card ) ) {
[950] Fix | Delete
return;
[951] Fix | Delete
}
[952] Fix | Delete
[953] Fix | Delete
$details = [
[954] Fix | Delete
'brand' => $card->getCardBrand(),
[955] Fix | Delete
'last4' => $card->getLast4(),
[956] Fix | Delete
'holder' => $this->get_card_holder( $card ),
[957] Fix | Delete
];
[958] Fix | Delete
$details = implode( "\n", array_filter( $details ) );
[959] Fix | Delete
[960] Fix | Delete
/**
[961] Fix | Delete
* Filter a credit card field value by card details.
[962] Fix | Delete
*
[963] Fix | Delete
* @since 1.9.5
[964] Fix | Delete
*
[965] Fix | Delete
* @param string $details Card details.
[966] Fix | Delete
* @param Process $process Process object.
[967] Fix | Delete
*/
[968] Fix | Delete
$details = apply_filters( // phpcs:ignore WPForms.PHP.ValidateHooks.InvalidHookName
[969] Fix | Delete
'wpforms_square_process_update_credit_card_field_value',
[970] Fix | Delete
$details,
[971] Fix | Delete
$this
[972] Fix | Delete
);
[973] Fix | Delete
[974] Fix | Delete
wpforms()->obj( 'process' )->fields[ $this->cc_field['id'] ]['value'] = $details;
[975] Fix | Delete
}
[976] Fix | Delete
[977] Fix | Delete
/**
[978] Fix | Delete
* Get card object.
[979] Fix | Delete
*
[980] Fix | Delete
* @since 1.9.5
[981] Fix | Delete
*
[982] Fix | Delete
* @return Card|array
[983] Fix | Delete
*/
[984] Fix | Delete
private function get_card() {
[985] Fix | Delete
[986] Fix | Delete
$resource = $this->api->get_response_resource();
[987] Fix | Delete
[988] Fix | Delete
if ( empty( $resource ) ) {
[989] Fix | Delete
return [];
[990] Fix | Delete
}
[991] Fix | Delete
[992] Fix | Delete
$type = Helpers::array_key_first( $resource );
[993] Fix | Delete
[994] Fix | Delete
return $type === 'subscription' ? $this->api->get_subscription_card( $resource[ $type ] ) : $resource[ $type ]->getCardDetails()->getCard();
[995] Fix | Delete
}
[996] Fix | Delete
[997] Fix | Delete
/**
[998] Fix | Delete
* Update entry details and add meta for a successful payment.
[999] Fix | Delete
It is recommended that you Edit text format, this type of Fix handles quite a lot in one request
Function