Skip to content

Commit 3c874b5

Browse files
author
Craig Christenson
committed
Fix for recurring IPN on inline and hosted
- identify the correct recurring invoice due when adding payment
1 parent 1ac61ed commit 3c874b5

5 files changed

Lines changed: 89 additions & 71 deletions

File tree

modules/gateways/callback/twocheckoutapi.php

Lines changed: 28 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -87,33 +87,37 @@
8787
$externalRef = $_POST["ORIGINAL_REFNOEXT"][0];
8888
$serviceId = $_POST["IPN_EXTERNAL_REFERENCE"][0];
8989
$serviceId = preg_replace('/\D/', '', $serviceId);
90-
checkCbTransID($transactionId);
91-
$newInvoiceItem = (array)Capsule::table('tblinvoiceitems')
92-
->join('tblinvoices', 'tblinvoiceitems.invoiceid', '=', 'tblinvoices.id')
93-
->where('tblinvoiceitems.relid', $serviceId)
94-
->where('tblinvoices.status', 'Unpaid')
95-
->first();
96-
$invoiceId = $newInvoiceItem['invoiceid'];
97-
98-
$orderData = TwocheckoutApi::callAPI("GET", "orders/" . $transactionId . "/", $twocheckoutConfig);
99-
100-
$paymentAmount = 0;
101-
if (!empty($_POST['IPN_PRICE']))
102-
{
103-
foreach ($_POST['IPN_PRICE'] as $priceAdd)
90+
if (!empty($externalRef) && !empty($serviceId)) {
91+
checkCbTransID($transactionId);
92+
$newInvoiceItem = (array)Capsule::table('tblinvoiceitems')
93+
->join('tblinvoices', 'tblinvoiceitems.invoiceid', '=', 'tblinvoices.id')
94+
->where('tblinvoiceitems.relid', $serviceId)
95+
->where('tblinvoices.status', 'Unpaid')
96+
->first();
97+
$invoiceId = $newInvoiceItem['invoiceid'];
98+
99+
$orderData = TwocheckoutApi::callAPI("GET", "orders/" . $transactionId . "/", $twocheckoutConfig);
100+
101+
$paymentAmount = 0;
102+
if (!empty($_POST['IPN_PRICE']))
104103
{
105-
$paymentAmount = $paymentAmount + $priceAdd;
104+
foreach ($_POST['IPN_PRICE'] as $priceAdd)
105+
{
106+
$paymentAmount = $paymentAmount + $priceAdd;
107+
}
106108
}
107-
}
108109

109-
if (!empty($invoiceId) && in_array($orderData['Status'], array('AUTHRECEIVED', 'COMPLETE'))) {
110-
addInvoicePayment(
111-
$invoiceId,
112-
$transactionId,
113-
$paymentAmount,
114-
null,
115-
$twocheckoutConfig['name']
116-
);
110+
if (!empty($invoiceId) && in_array($orderData['Status'], array('AUTHRECEIVED', 'COMPLETE'))) {
111+
addInvoicePayment(
112+
$invoiceId,
113+
$transactionId,
114+
$paymentAmount,
115+
null,
116+
$twocheckoutConfig['name']
117+
);
118+
}
119+
} else {
120+
logModuleCall($gatewayModuleName, 'error', '', 'Recurring 2Checkout transaction ' . $transactionId . ' IPN with no item external reference');
117121
}
118122
// IPN for any case other than recurring
119123
} else if (isset($_POST["REFNOEXT"]) && !empty($_POST["REFNOEXT"]) && $_POST["FRAUD_STATUS"] == 'APPROVED') {

modules/gateways/callback/twocheckoutconvertplus.php

Lines changed: 28 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -67,32 +67,36 @@
6767
$externalRef = $_POST["ORIGINAL_REFNOEXT"][0];
6868
$serviceId = $_POST["IPN_EXTERNAL_REFERENCE"][0];
6969
$serviceId = preg_replace( '/\D/', '', $serviceId );
70-
checkCbTransID( $transactionId );
71-
$newInvoiceItem = (array) Capsule::table( 'tblinvoiceitems' )
72-
->join( 'tblinvoices', 'tblinvoiceitems.invoiceid', '=', 'tblinvoices.id' )
73-
->where( 'tblinvoiceitems.relid', $serviceId )
74-
->where( 'tblinvoices.status', 'Unpaid' )
75-
->first();
76-
$invoiceId = $newInvoiceItem['invoiceid'];
77-
78-
$orderData = TwocheckoutApiConvertPlus::callAPI( "GET", "orders/" . $transactionId . "/",
79-
$twocheckoutConfig );
80-
81-
$paymentAmount = 0;
82-
if ( ! empty( $_POST['IPN_PRICE'] ) ) {
83-
foreach ( $_POST['IPN_PRICE'] as $priceAdd ) {
84-
$paymentAmount = $paymentAmount + $priceAdd;
70+
if (!empty($externalRef) && !empty($serviceId)) {
71+
checkCbTransID( $transactionId );
72+
$newInvoiceItem = (array) Capsule::table( 'tblinvoiceitems' )
73+
->join( 'tblinvoices', 'tblinvoiceitems.invoiceid', '=', 'tblinvoices.id' )
74+
->where( 'tblinvoiceitems.relid', $serviceId )
75+
->where( 'tblinvoices.status', 'Unpaid' )
76+
->first();
77+
$invoiceId = $newInvoiceItem['invoiceid'];
78+
79+
$orderData = TwocheckoutApiConvertPlus::callAPI( "GET", "orders/" . $transactionId . "/",
80+
$twocheckoutConfig );
81+
82+
$paymentAmount = 0;
83+
if ( ! empty( $_POST['IPN_PRICE'] ) ) {
84+
foreach ( $_POST['IPN_PRICE'] as $priceAdd ) {
85+
$paymentAmount = $paymentAmount + $priceAdd;
86+
}
8587
}
86-
}
8788

88-
if ( ! empty( $invoiceId ) && in_array( $orderData['Status'], [ 'AUTHRECEIVED', 'COMPLETE' ] ) ) {
89-
addInvoicePayment(
90-
$invoiceId,
91-
$transactionId,
92-
$paymentAmount,
93-
null,
94-
$twocheckoutConfig['paymentmethod']
95-
);
89+
if ( ! empty( $invoiceId ) && in_array( $orderData['Status'], [ 'AUTHRECEIVED', 'COMPLETE' ] ) ) {
90+
addInvoicePayment(
91+
$invoiceId,
92+
$transactionId,
93+
$paymentAmount,
94+
null,
95+
$twocheckoutConfig['paymentmethod']
96+
);
97+
}
98+
} else {
99+
logModuleCall($gatewayModuleName, 'error', '', 'Recurring 2Checkout transaction ' . $transactionId . ' IPN with no item external reference');
96100
}
97101
// IPN for any case other than recurring
98102
} else {

modules/gateways/callback/twocheckoutinline.php

Lines changed: 20 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -94,23 +94,27 @@
9494
$externalRef = $_POST["ORIGINAL_REFNOEXT"][0];
9595
$serviceId = $_POST["IPN_EXTERNAL_REFERENCE"][0];
9696
$serviceId = preg_replace( '/\D/', '', $serviceId );
97-
checkCbTransID( $transactionId );
98-
$newInvoiceItem = (array) Capsule::table( 'tblinvoiceitems' )
99-
->join( 'tblinvoices', 'tblinvoiceitems.invoiceid', '=', 'tblinvoices.id' )
100-
->where( 'tblinvoiceitems.relid', $serviceId )
101-
->where( 'tblinvoices.status', 'Unpaid' )
102-
->first();
103-
$invoiceId = $newInvoiceItem['invoiceid'];
104-
$orderData = TwocheckoutApiInline::callAPI( "GET", "orders/" . $transactionId . "/",
105-
$twocheckoutConfig );
106-
$paymentAmount = 0;
107-
if ( ! empty( $_POST['IPN_PRICE'] ) ) {
108-
foreach ( $_POST['IPN_PRICE'] as $priceAdd ) {
109-
$paymentAmount = $paymentAmount + $priceAdd;
97+
if (!empty($externalRef) && !empty($serviceId)) {
98+
checkCbTransID( $transactionId );
99+
$newInvoiceItem = (array) Capsule::table( 'tblinvoiceitems' )
100+
->join( 'tblinvoices', 'tblinvoiceitems.invoiceid', '=', 'tblinvoices.id' )
101+
->where( 'tblinvoiceitems.relid', $serviceId )
102+
->where( 'tblinvoices.status', 'Unpaid' )
103+
->first();
104+
$invoiceId = $newInvoiceItem['invoiceid'];
105+
$orderData = TwocheckoutApiInline::callAPI( "GET", "orders/" . $transactionId . "/",
106+
$twocheckoutConfig );
107+
$paymentAmount = 0;
108+
if ( ! empty( $_POST['IPN_PRICE'] ) ) {
109+
foreach ( $_POST['IPN_PRICE'] as $priceAdd ) {
110+
$paymentAmount = $paymentAmount + $priceAdd;
111+
}
110112
}
111-
}
112-
if ( ! empty( $invoiceId ) && in_array( $orderData['Status'], [ 'AUTHRECEIVED', 'COMPLETE' ] ) ) {
113-
addInvoicePayment( $invoiceId, $transactionId, $paymentAmount, null, $twocheckoutConfig['name'] );
113+
if ( ! empty( $invoiceId ) && in_array( $orderData['Status'], [ 'AUTHRECEIVED', 'COMPLETE' ] ) ) {
114+
addInvoicePayment( $invoiceId, $transactionId, $paymentAmount, null, $twocheckoutConfig['name'] );
115+
}
116+
} else {
117+
logModuleCall($gatewayModuleName, 'error', '', 'Recurring 2Checkout transaction ' . $transactionId . ' IPN with no item external reference');
114118
}
115119
// IPN for any case other than recurring
116120
} else {

modules/gateways/twocheckoutconvertplus.php

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,7 @@ function twocheckoutconvertplus_link( $params ) {
131131
$buyLinkParams['city'] = $client['city'];
132132

133133
if ( isset( $client['companyname'] ) ) {
134-
$buyLinkParams['company-name'] = $client['companyname'];
134+
$buyLinkParams['company-name'] = $client['companyname'];
135135
}
136136

137137
$buyLinkParams['ship-name'] = $client['firstname'] . ' ' . $client['lastname'];
@@ -162,15 +162,16 @@ function twocheckoutconvertplus_link( $params ) {
162162

163163
$itemsArray["duration"][] = ( isset( $item['recurringCyclePeriod'] ) && isset( $item['recurringCycleUnits'] ) ) ? '1:' . 'FOREVER' : '';
164164
$itemsArray['renewal-price'][] = abs( $lineItemAmount );
165-
165+
$itemsArray['item-ext-ref'][] = $item['itemId'];
166166
}
167167
}
168168

169-
$buyLinkParams['prod'] = implode( ';', $itemsArray["prod"] );
170-
$buyLinkParams['price'] = implode( ';', $itemsArray["price"] );
171-
$buyLinkParams['qty'] = implode( ';', $itemsArray["qty"] );
172-
$buyLinkParams['type'] = implode( ';', $itemsArray["type"] );
173-
$buyLinkParams['tangible'] = implode( ';', $itemsArray["tangible"] );
169+
$buyLinkParams['prod'] = implode( ';', $itemsArray["prod"] );
170+
$buyLinkParams['item-ext-ref'] = implode( ';', $itemsArray["item-ext-ref"] );
171+
$buyLinkParams['price'] = implode( ';', $itemsArray["price"] );
172+
$buyLinkParams['qty'] = implode( ';', $itemsArray["qty"] );
173+
$buyLinkParams['type'] = implode( ';', $itemsArray["type"] );
174+
$buyLinkParams['tangible'] = implode( ';', $itemsArray["tangible"] );
174175

175176
if ( isset( $itemsArray["recurrence"] ) ) {
176177
$buyLinkParams['recurrence'] = implode( ';', $itemsArray["recurrence"] );

modules/gateways/twocheckoutinline.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,7 @@ function twocheckoutinline_link( $params ) {
145145
$lineItem["tangible"] = 0;
146146
$lineItem["type"] = "PRODUCT";
147147
$lineItem["price"] = abs( $lineItemAmount );
148+
$lineItem["reference"]["external"]["item"] = $item['itemId'];
148149
if ( $item['recurringCyclePeriod'] && $item['recurringCyclePeriod'] > 0 ) {
149150
$lineItem["recurrence"] = [
150151
'unit' => _mapRecurringUnitInline( $item['recurringCycleUnits'] ),
@@ -218,6 +219,10 @@ function _prepareProducts( $products ) {
218219
$product['renewalPrice'] = $product['renewal-price'];
219220
unset( $product['renewal-price'] );
220221
}
222+
if ( isset( $product["reference"]["external"]["item"] ) ) {
223+
$product['externalReference'] = $product["reference"]["external"]["item"];
224+
unset( $product["reference"] );
225+
}
221226
$items[] = $product;
222227
}
223228

0 commit comments

Comments
 (0)