What do you mean by "it fails at checkout"?
In what way does it fail? Does it direct to the checkout_failure.php page?
if so add the following code on the failure page:
<?php @session_start(); var_dump($_SESSION); ?>
this will write the session contents to the page including the response from the gateway and include details on the cause of the failure,
for the checkbox, you need a new column in the cart object , for example sake lets call it giftAid, in the add to cart button, set that new column to be updatable as a checkbox.
after the add to cart button adds the checkbox to the add to cart form, set the checked value for the checkbox to be 1 and add an if statement around it to use a hidden form element with a value of 0 is the category is not 2, for example:
<?php if($row_recordsetName['categorycolumn'] == "2") { ?>
<checkbox with checked value set to 1>
<?php } else { ?>
<hidden element of the same name, with value set to 0>
<?php } ?>
then in the cart object, create a new calcualation as:
giftAidTotal:
abs([giftAid] == '1')?25:0
type currency
and on the charges tab, create a new charge as:
trigger:
column giftAidTotal > a value of 0
calculation:
subtotal of column giftAidTotal plus 0.