Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

MemberPress does not display gateway exceptions/errors on payment form #3

Open
remcotolsma opened this issue Nov 3, 2022 · 0 comments

Comments

@remcotolsma
Copy link
Member

The exceptions/errors from gateways are stored in $_POST['errors']:

public function process_payment_form() {
if(isset($_POST['mepr_process_payment_form']) && isset($_POST['mepr_transaction_id']) && is_numeric($_POST['mepr_transaction_id'])) {
$txn = new MeprTransaction($_POST['mepr_transaction_id']);
if($txn->rec != false) {
$mepr_options = MeprOptions::fetch();
if(($pm = $mepr_options->payment_method($txn->gateway)) && $pm instanceof MeprBaseRealGateway) {
$errors = $pm->validate_payment_form(array());
if(empty($errors)) {
// process_payment_form either returns true
// for success or an array of $errors on failure
try {
$pm->process_payment_form($txn);
}
catch(Exception $e) {
MeprHooks::do_action('mepr_payment_failure', $txn);
$errors = array($e->getMessage());
}
}
if(empty($errors)) {
//Reload the txn now that it should have a proper trans_num set
$txn = new MeprTransaction($txn->id);
$product = new MeprProduct($txn->product_id);
$sanitized_title = sanitize_title($product->post_title);
$query_params = array('membership' => $sanitized_title, 'trans_num' => $txn->trans_num, 'membership_id' => $product->ID);
if($txn->subscription_id > 0) {
$sub = $txn->subscription();
$query_params = array_merge($query_params, array('subscr_id' => $sub->subscr_id));
}
MeprUtils::wp_redirect($mepr_options->thankyou_page_url(build_query($query_params)));
}
else {
// Artificially set the payment method params so we can use them downstream
// when display_payment_form is called in the 'the_content' action.
$_REQUEST['payment_method_params'] = array(
'method' => $pm->id,
'amount' => $txn->amount,
'user' => new MeprUser($txn->user_id),
'product_id' => $txn->product_id,
'transaction_id' => $txn->id
);
$_REQUEST['mepr_payment_method'] = $pm->id;
$_POST['errors'] = $errors;
return;
}
}
}
}
$_POST['errors'] = array(__('Sorry, an unknown error occurred.', 'memberpress'));
}

Only errors in $_REQUEST['errors'] are displayed:

// Called in the 'the_content' hook ... used to display a signup form
public function display_payment_form() {
$mepr_options = MeprOptions::fetch();
if(isset($_REQUEST['payment_method_params'])) {
extract($_REQUEST['payment_method_params'], EXTR_SKIP);
if(isset($_REQUEST['errors']) && !empty($_REQUEST['errors'])) {
$errors = $_REQUEST['errors'];
MeprView::render('/shared/errors', get_defined_vars());
}
if(($pm = $mepr_options->payment_method($method)) &&
($pm instanceof MeprBaseRealGateway)) {
$pm->display_payment_form($amount, $user, $product_id, $transaction_id);
}
}
}

I did notice some 'Deprecated?' comments:

$_POST['errors'] = $errors; //Deprecated?
$_REQUEST['errors'] = $errors;

catch(MeprCreateException $e) {
$_POST['errors'] = array(__( 'The user was unable to be saved.', 'memberpress')); //Deprecated?
$_REQUEST['errors'] = array(__( 'The user was unable to be saved.', 'memberpress'));
return;
}

Sigh, MemberPress... 😞

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
Status: External
Status: Deferred
Status: Deferred
Development

No branches or pull requests

1 participant