Я работаю над периодическим платежом для PayPal в php. Я видел несколько примеров, и ниже приведен код, который мне кажется простым для понимания.
<form action="https://www.sandbox.paypal.com/cgi-bin/webscr" method="post">
<!-- Identify your business so that you can collect the payments. -->
<input type="hidden" name="business" value="[email protected]">
<!-- Specify a Subscribe button. -->
<input type="hidden" name="cmd" value="_xclick-subscriptions">
<!-- Identify the subscription. -->
<input type="hidden" name="item_name" value="Alice's Weekly Digest">
<input type="hidden" name="item_number" value="DIG Weekly">
<!-- Set the terms of the regular subscription. -->
<input type="hidden" name="currency_code" value="USD">
<input type="hidden" name="a3" value="5.00">
<input type="hidden" name="p3" value="1">
<input type="hidden" name="t3" value="M">
<!-- Display the payment button. -->
<input type="image" name="submit" border="0" src="https://www.paypal.com/en_US/i/btn/btn_subscribe_LG.gif" alt="PayPal - The safer, easier way to pay online">
<img alt="" border="0" width="1" height="1" src="https://www.paypal.com/en_US/i/scr/pixel.gif" >
</form>
Согласно приведенному выше коду, он будет взимать 5 долларов каждый месяц. Я действительно не знаю, будет ли этот код работать или нет. Я также хочу знать, что в приведенном выше коде нет никакой опции для имени пользователя Paypal API, пароля и секретного ключа, он только получил бизнес, который является идентификатором электронной почты, зарегистрированным в PayPal. Я полностью сбит с толку, будет ли он работать или нет, или как сделать это правильно. Пожалуйста, предложите мне что-нибудь и как я могу получить данные после того, как пользователь отменил или успешно перечислил деньги на мой счет PayPal?
Чтобы избежать двойного тестирования, вы можете использовать цену для тестирования, например 0,01. Для создания регулярного платежа используйте эту HTML-форму:
<form method="post" name="formName" id="submitThisForm" action="https://www.paypal.com/cgi-bin/webscr" >
<input type="hidden" name="cmd" value="_xclick-subscriptions">
<input type="hidden" name="business" value="[email protected]" />
<input type="hidden" name="item_name" value="Your Membership" />
<input type="hidden" name="a3" value="0.01">
<input type="hidden" name="p3" value="1">
<input type="hidden" name="t3" value="M">
<input type="hidden" name="src" value="1">
<input type="hidden" name="sra" value="1">
<input type="hidden" name="item_number" value="2" />
<input type="hidden" name="custom" value="SECURITYCODE" />
<input type="hidden" name="currency_code" value="USD" />
<input type="hidden" name="quantity" value="1" />
<input type="hidden" name="no_shipping" value="1" />
<input type="hidden" name="return" value="page going after payment" />
<input type="hidden" name="cancel_return" value="" />
<input type="hidden" name="cbt" value="ITEM DESCRIPTION" />
<input type="hidden" name="rm" value="2" />
<input type="hidden" name="notify_url" value="your_listener_file.php" />
Когда пользователь отменяет членство, PayPal уведомит об этом «notify_url» — в вашем случае это будет файл your_listener_file.php. Внутри этого файла вы должны проверить POST-переменную PayPal ‘txn_type’ = ‘subscr_cancel’. Есть несколько важных моментов:
Вы должны проверить транзакцию IPN:
$post = array( 'cmd' => '_notify-validate' );
foreach($_POST as $key=>$value){
$post[$key] = $value;
}
$c = curl_init();
curl_setopt_array($c, array(
CURLOPT_FOLLOWLOCATION => TRUE,
CURLOPT_RETURNTRANSFER => TRUE,
CURLOPT_CONNECTTIMEOUT => 15,
CURLOPT_MAXREDIRS => 15,
CURLOPT_TIMEOUT => 15,
CURLOPT_URL => 'https://www.paypal.com/cgi-bin/webscr',
CURLOPT_POST => TRUE,
CURLOPT_POSTFIELDS => $post,
));
$res = curl_exec($c);
curl_close($c);
$res = trim($res);
if( $res != 'VERIFIED' ) {
exit();
}
Второе — проверьте, существует ли транзакция в вашей базе данных с использованием уникального ключа. Вы должны использовать переменную PayPal POST ‘custom’.
Если транзакция существует, просто сделайте несколько простых проверок:
if( !empty($_POST['txn_type']) && $_POST['txn_type'] == 'subscr_cancel' )
$paypalData['approved'] = 0;
Других решений пока нет …