Intereting Posts
php POST-переменная с заголовками PHPExcel – как сделать часть текста полужирным шрифтом как написать zpl-код внутри php-скрипта и как отправить его на принтер Zebra для печати Ошибка CakePHP: Таблица данных acos для модели Aco не найдена Много-To-One с несколькими целевыми объектами PHP: Как удалить все непечатаемые символы в строке? Получение имени текущей функции в php Захват хэша (#) из URL-адреса в CodeIgniter «Неустранимая ошибка: вызов неопределенного метода PHPUnit_Util_Filter :: addfiletofilter () в / usr / bin / phpunit в строке 48» cronjob. запускать php только в заданный промежуток времени как добавить динамический активный класс на выбранную страницу Php Search_Array с использованием подстановочного знака Тип «application / json» предотвращает отправку почтовых переменных Bootstrap Отзывчивый редактор WYSWIG не отправляет входные данные в php Codeigniter – получать связанные строки данных как структуры / объекты, а не массивы

Какова рекомендуемая практика для API-интерфейса PayPal NVP с остановкой и возвратом подписки?

Поэтому я начал этот маленький класс для того, чтобы делать пустоты 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 

Пропустите шаг пустоты. Пустоты действительны только для авторизаций и заказов, и вы не можете создавать ни подписку. Но да, вам нужно будет отменить подписку и вернуть отдельные платежи.

Через пробную версию и ошибку в песочнице я обнаружил, что должен быть рабочий процесс:

  1. Пропустить пустоту. Согласно репутации PayPal: «Пустоты действительны только для авторизации и заказов, и вы не можете создавать ни подписку».

  2. Да, возмещение. Он запускает снова txn_id, который является уникальным для каждого subscr_payment, который вы получаете в процессе подписки. Таким образом, вы вернете только самую последнюю сумму subscr_payment, которую вы получили в своем IPN.

  3. Да, отмените подписку – только возврат не сделает для вас этого шага.