function finalize_paypal_AutoBill_then_transaction_auth_capture_Transaction_Items($vid)
{
    $autobill = new Autobill();
    $response = $autobill->finalizePayPalAuth($vid, true);
    if ($response['returnCode'] != '200') {
        print 'Error finalizing autobill' . PHP_EOL;
        print 'Soap Id = ' . $response['data']->return->soapId . PHP_EOL;
        print 'Return Code = ' . $response['returnCode'] . PHP_EOL;
        print 'Return String = ' . $response['returnString'] . PHP_EOL;
    } else {
        // You can obtain the paypal payer email address from the return object if you desire to persist this.
        $response_object = $response['data'];
        $auth_status = $response_object->authStatus;
        $payPalEmail = $auth_status->payPalStatus->paypalEmail;
        print 'Successfully paid for by ' . $payPalEmail;
        //Get info from autobill transaction for use processing remaining cart items
        $autobill = $response['data']->autobill;
        $account = $autobill->account;
        $paymentMethod = $autobill->paymentMethod;
        $transaction = new Transaction();
        $transaction->setCurrency('USD');
        $transaction->setSourcePaymentMethod($paymentMethod);
        $transaction->setAccount($account);
        $transaction->setShippingAddress($account->shippingAddress);
        // loop through the cart on server side to add items.
        $transaction_lineitem1 = new TransactionItem();
        $transaction_lineitem1->setSku('club cover');
        $transaction_lineitem1->setName('club cover');
        $transaction_lineitem1->setPrice('4.99');
        $transaction_lineitem1->setQuantity('1');
        $transaction_lineitem2 = new TransactionItem();
        $transaction_lineitem2->setSku('shipping');
        $transaction_lineitem2->setName('shipping');
        $transaction_lineitem2->setPrice('5.00');
        $transaction_lineitem2->setQuantity('1');
        $transaction_lineitem2->setTaxClassification('NT');
        $lineitems = array($transaction_lineitem1, $transaction_lineitem2);
        $transaction->setTransactionItems($lineitems);
        $billPayPalImmediately = new NameValuePair();
        $billPayPalImmediately->setName('vin:BillPayPalImmediately');
        $billPayPalImmediately->setValue('true');
        $autobillVID = new NameValuePair();
        $autobillVID->setName('vin:AutoBillVID');
        $autobillVID->setValue('none');
        $transaction->setNameValues(array($billPayPalImmediately, $autobillVID));
        $sendEmailNotification = false;
        $ignoreAvsPolicy = true;
        $ignoreCvnPolicy = true;
        $campaign = NULL;
        $dryrun = false;
        $response = $transaction->authCapture($sendEmailNotification, $ignoreAvsPolicy, $ignoreCvnPolicy, $campaign, $dryrun);
        if ($response['returnCode'] != '200') {
            print $response['returnCode'] . PHP_EOL;
            print $response['returnString'] . PHP_EOL;
        } else {
            print "returnCode=" . $response['returnCode'] . PHP_EOL;
            print "returnString=" . $response['returnString'] . PHP_EOL;
            if ($response['returnCode'] == "200") {
                $returnTransaction = $response['data']->transaction;
                if ($returnTransaction->statusLog[0]->status == 'Authorized') {
                    print "Transaction approved\n";
                    print "Transaction with id " . $returnTransaction->merchantTransactionId . " was successfully captured";
                    return $returnTransaction->merchantTransactionId;
                } else {
                    if ($returnTransaction->statusLog[0]->status == 'Cancelled') {
                        print "Transaction not approved \n";
                        print "Reason code is: ";
                        print $returnTransaction->statusLog[0]->creditCardStatus->authCode;
                        print "\n";
                    } else {
                        print "Error: Unexpected transaction status\n";
                    }
                }
            } else {
                if ($response['returnCode'] == "202") {
                    print "Transaction cannot be processed due to taxes being temporarily unavailable\n";
                } else {
                    if ($response['returnCode'] == "400") {
                        print "Transaction cannot be processed due to data validation error\n";
                    } else {
                        if ($response['returnCode'] == "402") {
                            print "Transaction cannot be processed due to transaction error\n";
                        } else {
                            if ($response['returnCode'] == "409") {
                                print "Transaction cannot be processed due to Failed AVS and CVN policy evaluation\n";
                            } else {
                                if ($response['returnCode'] == "410") {
                                    print "Transaction cannot be processed due to not being able to perform AVS and CVN policy evaluation\n";
                                } else {
                                    print "Error while making call to Vindicia CashBox\n";
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
$hostedPageInfo->setPaymentProvider($provider);
$pm->setHostedPage($hostedPageInfo);
$transaction = new Transaction();
$transaction->setCurrency('MYR');
// Unique transaction ID, use prefix to tell transactions apart from the subscription transactions
$transaction->setMerchantTransactionId('VINTEST-' . rand(10000, 99999));
$transaction->setAccount($account);
$transaction->setSourcePaymentMethod($pm);
//Create purchase line items. This can also be created by looking up a CashBox Product
$transaction_lineItem0 = new TransactionItem();
$transaction_lineItem0->setSku('MYPRODUCT001');
// If using a CashBox Product, specify the Product's ID here
$transaction_lineItem0->setName('Digital Magazine');
$transaction_lineItem0->setPrice('4.99');
$transaction_lineItem0->setQuantity('1');
$transaction_lineItem0->setTaxClassification('DM010100');
// Specify appropriate Avalara TaxCode here
// Campaign Code can be specified for each individual line item:
//$transaction_lineItem0->setCampaignCode('promo2');
$lineitems = array($transaction_lineItem0);
$transaction->setTransactionItems($lineitems);
// we can choose to send email for one-time transactions, or not
$sendEmailNotification = 1;
// use the default CashBox AVS and CVN policy
$ignoreAvsPolicy = true;
// Does not apply to MOLPay payment method
$ignoreCvnPolicy = true;
// Does not apply to MOLPay payment method
$sparseReturnDescriptor = '';
// we want the whole Transaction object back
// Campaign Code can also be passed in to the call as a param to apply to all eligible items
// existing customer account ID
$tx->setAccount($acct);
$tx->setCurrency('USD');
$txItem1 = new TransactionItem();
$txItem1->setSku('ppv-movie-us-prem');
$txItem1->setName('Premium Pay-per-view movie (English)');
$txItem1->setPrice(5.99);
$txItem1->setQuantity(1);
$txItem1->setTaxClassification('DM030000');
$txItem1->setCampaignCode('PPV2015US');
$txItem2 = new TransactionItem();
$txItem2->setSku('smAccess2015');
$txItem2->setName('Social Media Chat Access');
$txItem2->setPrice(2.0);
$txItem2->setQuantity(1);
$txItem2->setTaxClassification('D0000000');
$tx->setTransactionItems(array($txItem1, $txItem2));
$addr = new Address();
$addr->setAddr1('809 Cuesta Dr');
$addr->setCity('Mountain View');
$addr->setDistrict('CA');
$addr->setPostalCode('94040');
$addr->setCountry('US');
$tx->setShippingAddress($addr);
// for tax calculation purposes
$response = $tx->auth(100, false, null, true);
// dry run
if ($response['returnCode'] == 200) {
    print "Successfully dry ran transaction. Call SOAP ID" . $response['data']->return->soapId . "\n";
    // Present order summary to the customer
    $retTx = $response['data']->transaction;