payapl nvp api (возврат) работает при использовании через форму, но не работает с curl

Я пытаюсь использовать API возврата Paypal. Я в настоящее время использую учетные записи песочницы. оплата работает нормально. Возврат работает нормально, когда я использую поля формы для публикации данных в PayPal, как показано ниже

 <form action="https://api-3t.sandbox.paypal.com/nvp" METHOD="GET">
        <input type="text" name="USER" value="**********"/>
        <input type="text" name="PWD" value="**********"/>
        <input type="text" name="SIGNATURE" value="**********"/>
        <input type="text" name="METHOD" value="RefundTransaction"/>
        <input type="text" name="VERSION" value="94"/>
        <input type="text" name="TRANSACTIONID" value="<?php echo $data['transaction_id']; ?>"/>
        <input type="text" name="REFUNDTYPE" value="Partial"/>
        <input type="text" name="AMT" value="<?php echo $amount; ?>"/>
        <input type="text" name="CURRENCYCODE" value="GBP"/>
        <input type="text" name="NOTE"  value="refund"/>
        <input type="submit" value="pay"/>
    </form>

ответ распечатывается на экране автоматически и показывает успешное возмещение. но мне нужно сравнить ACK ответа, чтобы сделать другие действия после возврата. поэтому я попытался использовать curl, как показано ниже.

$req = array(
    'USER' => urlencode('**************'),
    'PWD' => urlencode('***************'),
    'SIGNATURE' => ************'),
    'METHOD' => 'RefundTransaction',
    'VERSION' => urlencode(119),
    'TRANSACTIONID' => $data[transaction_id],
    'REFUNDTYPE' => 'Partial',
    'AMT' => urlencode($amount),
    'CURRENCYCODE' => 'GBP',
    'NOTE' => urlencode('test'),
    );
$ch = curl_init('https://api-3t.sandbox.paypal.com/nvp');
curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $req);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
curl_setopt($ch, CURLOPT_FORBID_REUSE, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Connection: Close'));
if(!($res = curl_exec($ch)) ) {
    error_log("Got " . curl_error($ch) . " when processing IPN data");
    curl_close($ch);
    exit;
}
curl_close($ch);
echo "response is : ".urldecode($res);

вызов curl сделан успешно, но ответ всегда является внутренней ошибкой (10001) от PayPal. что я делаю не так Пожалуйста помоги

ПРИМЕЧАНИЕ. Я просто заменил учетные данные звездочками.

1 ответ

Решение

Я не верю, что вам нужно urlencode значения AMT. Он должен быть отправлен как правильно отформатированный десятичный. Кроме того, номер версии также не обязательно должен быть закодирован, и, насколько я знаю, текущая самая высокая версия - 95, а не 119.

Другие вопросы по тегам