Поэтому я начал этот маленький класс для того, чтобы делать пустоты PayPal, возврат и отмену подписки. Мой вопрос: какова рекомендуемая практика? Я имею в виду, должен ли я попытаться аннулировать транзакцию, затем проигнорировать ошибку, затем вернуть ее, а затем отменить подписку?
Обратите внимание, что в моем случае транзакция была начата с щелчка на кнопке подписки PayPal, а затем она возобновилась один раз после окончания 6-месячного периода, а затем клиент потребовал возмещение и прекратил дальнейшие подписки.
<?php class Paypp { public static function voidCard($r) { $asData = array( 'METHOD' => 'DoVoid', 'AUTHORIZATIONID' => @ $r['paypal_txn_id'] // tnx_id from subscr_payment IPN ); return self::_sendData($asData); } public static function cancelSubscription($r) { $asData = array( 'METHOD' => 'ManageRecurringPaymentsProfileStatus', 'PROFILEID' => @ $r['paypal_subscr_profile_id'], // subscr_id from subscr_payment IPN 'ACTION' => 'cancel' ); return self::_sendData($asData); } public static function refundCard($r) { $asData = array( 'METHOD' => 'RefundTransaction', 'TRANSACTIONID' => @ $r['paypal_txn_id'], 'REFUNDTYPE' => 'full', 'CURRENCYCODE' => @ $r['currency'], 'AMT' => @ $r['gross'] ); return self::_sendData($asData); } private static function _sendData($asData) { global $config; $sActive = $config->PAYMENT_GATEWAY_DATA->pp->ACTIVE; $sURL = $config->PAYMENT_GATEWAY_DATA->pp->$sActive->NVP_URL; $sVersion = $config->PAYMENT_GATEWAY_DATA->pp->$sActive->NVP_VERSION; $sUser = $config->PAYMENT_GATEWAY_DATA->pp->$sActive->NVP_USER; $sPass = $config->PAYMENT_GATEWAY_DATA->pp->$sActive->NVP_PASS; $sSig = $config->PAYMENT_GATEWAY_DATA->pp->$sActive->NVP_SIG; $asExtra = array( 'VERSION' => $sVersion, 'USER' => $sUser, 'PWD' => $sPass, 'SIGNATURE' => $sSig ); $asData = array_merge($asData,$asExtra); $asOpt = array( CURLOPT_HEADER => FALSE, CURLOPT_POST => TRUE, CURLOPT_RETURNTRANSFER => TRUE, CURLOPT_POSTFIELDS => http_build_query($asData), CURLOPT_VERBOSE => TRUE, ); $hCurl = curl_init($sURL); curl_setopt_array($hCurl, $asOpt); $bVerifySSL = @ $config->VERIFY_SSL; curl_setopt($hCurl, CURLOPT_SSL_VERIFYPEER, $bVerifySSL); $sResponse = curl_exec($hCurl); curl_close($hCurl); return $sResponse; } } // end class
Пропустите шаг пустоты. Пустоты действительны только для авторизаций и заказов, и вы не можете создавать ни подписку. Но да, вам нужно будет отменить подписку и вернуть отдельные платежи.
Через пробную версию и ошибку в песочнице я обнаружил, что должен быть рабочий процесс:
Пропустить пустоту. Согласно репутации PayPal: «Пустоты действительны только для авторизации и заказов, и вы не можете создавать ни подписку».
Да, возмещение. Он запускает снова txn_id, который является уникальным для каждого subscr_payment, который вы получаете в процессе подписки. Таким образом, вы вернете только самую последнюю сумму subscr_payment, которую вы получили в своем IPN.
Да, отмените подписку – только возврат не сделает для вас этого шага.