Мой текущий проект позволяет пользователям подписаться на членство без регистрации учетной записи PayPal.
Имя пользователя и пароль пользователя создаются и управляются моим собственным приложением, а не PayPal.
Может кто-нибудь сказать мне, как создать форму hTMl, которая отменит эту подписку? Могу ли я отменить подписку, отправив txn_id
??
Я полагаю, что могу захватить эту информацию с IPN.
Я должен также упомянуть, что я администратор баз данных, а не разработчик, поэтому терпите меня, если я немного новичок.
Заранее спасибо.
Вот что я в итоге сделал.
<?php
require 'core/init.php';
require 'core/conn.php';
/*The paypal_transactions table is a table I'm using to store the IPN data. This is necessary to capture the Profile_ID/Subscr_ID. The Custom parameter is being used to pass the username.*/
$profileid_sql = "select subscr_id from paypal_transactions where custom ='". escape($user->data()->username)."'";
$result=mysql_query($profileid_sql);
while($row=mysql_fetch_array($result)){
$profileid = $row['subscr_id'];
}
include 'functions/change_subscription_status.php';
change_subscription_status( $profileid, 'Cancel' );
header('Location: Cancelled.php');
?>
Функция change_subscription_status находится здесь …
<?php
/**
* Performs an Express Checkout NVP API operation as passed in $action.
*
* Although the PayPal Standard API provides no facility for cancelling a subscription, the PayPal
* Express Checkout NVP API can be used.
*/
function change_subscription_status( $profile_id, $action ) {
$api_request = 'USER=' . urlencode( 'API_username' )
. '&PWD=' . urlencode( 'API_Password' )
. '&SIGNATURE=' . urlencode( 'API_Signature' )
. '&VERSION=76.0'
. '&METHOD=ManageRecurringPaymentsProfileStatus'
. '&PROFILEID=' . urlencode( $profile_id )
. '&ACTION=' . urlencode( $action )
. '&NOTE=' . urlencode( 'Profile cancelled at store' );
$ch = curl_init();
curl_setopt( $ch, CURLOPT_URL, 'https://api-3t.sandbox.paypal.com/nvp' ); // For live transactions, change to 'https://api-3t.paypal.com/nvp'
curl_setopt( $ch, CURLOPT_VERBOSE, 1 );
// Uncomment these to turn off server and peer verification
// curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, FALSE );
// curl_setopt( $ch, CURLOPT_SSL_VERIFYHOST, FALSE );
curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1 );
curl_setopt( $ch, CURLOPT_POST, 1 );
// Set the API parameters for this transaction
curl_setopt( $ch, CURLOPT_POSTFIELDS, $api_request );
// Request response from PayPal
$response = curl_exec( $ch );
// If no response was received from PayPal there is no point parsing the response
if( ! $response )
die( 'Calling PayPal to change_subscription_status failed: ' . curl_error( $ch ) . '(' . curl_errno( $ch ) . ')' );
curl_close( $ch );
// An associative array is more usable than a parameter string
parse_str( $response, $parsed_response );
return $parsed_response;
}
?>
Используйте API-интерфейс PayPal ManageRecurringPaymentsProfileStatus (API Operation NVP), используя параметр ACTION, который вы можете:
Чтобы создать повторяющийся профиль, следуйте этому примеру (PHP):
// Параметры для SetExpressCheckout, который будет отправлен в PayPal
$ padata ['L_BILLINGAGREEMENTDESCRIPTION0'] = 'Описание продукта'; $ padata ['L_BILLINGAGREEMENTDESCRIPTION0'] = $ padata ['L_BILLINGAGREEMENTDESCRIPTION0']. '$'. $ product-> price. '/ month'; $ padata ['L_PAYMENTREQUEST_0_DESC0'] = $ padata ['L_BILLINGAGREEMENTDESCRIPTION0']. '$'. $ product-> price. '/ month';
$ padata ['PAYMENTREQUEST_0_NOTIFYURL'] = 'http: // site_url / paypal / ipn'; $ padata ['PAYMENTREQUEST_0_DESC'] = $ product-> name; $ padata ['RETURNURL'] = 'http: // site_url / paypal / returnurl'; $ padata ['CANCELURL'] = 'http: // site_url / paypal / cancelurl';
$ padata ['PAYMENTREQUEST_0_CURRENCYCODE'] = 'USD'; $ padata ['PAYMENTREQUEST_0_PAYMENTACTION'] = 'SALE'; $ padata ['PAYMENTREQUEST_0_ITEMAMT'] = $ product-> price;
$ padata ['PAYMENTREQUEST_0_AMT'] = $ product-> price;
$ padata ['L_BILLINGTYPE0'] = 'RecurringPayments';
$ padata ['L_PAYMENTREQUEST_0_NAME0'] = $ product-> name;
$ padata ['L_PAYMENTREQUEST_0_NUMBER0'] = '322';
$ padata ['L_PAYMENTREQUEST_0_QTY0'] = '1';
$ padata ['L_PAYMENTREQUEST_0_AMT0'] = $ product-> price;
$ paypal_data = http_build_query ($ padata); $ httpParsedResponseAr = $ this-> PPHttpPost ('SetExpressCheckout', $ paypal_data); // Отвечаем согласно сообщению, которое мы получаем от Paypal if ("SUCCESS" == strtoupper ($ httpParsedResponseAr ["ACK"]) || "SUCCESSWITHWARNING" == strtoupper ($ httpParsedResponseAr ["ACK"])) { // Перенаправить пользователя в магазин PayPal с полученным токеном. $ paypalurl = 'https: //www.paypal.com/cgi-bin/webscr? cmd = _express-checkouttoken ='. $ httpParsedResponseAr ["TOKEN"]. ''; header ('Location:'. $ paypalurl); } Еще { эхоОшибка : ».Urldecode ($ httpParsedResponseAr [ "L_LONGMESSAGE0"]). '';
}
Возврат страницы:
$ hosteddata ['L_BILLINGAGREEMENTDESCRIPTION0'] = 'Повторяющееся описание';
$ hosteddata ['L_BILLINGAGREEMENTDESCRIPTION0'] = $ hosteddata ['L_BILLINGAGREEMENTDESCRIPTION0']. '$'. $ pr-> price. '/ month';
$ hosteddata ['L_PAYMENTREQUEST_0_NAME0'] = $ pr-> name;
$ hosteddata ['PROFILEREFERENCE'] = $ GetExpressCheckoutDetails ['L_PAYMENTREQUEST_0_NUMBER0'];
$ hosteddata ['PROFILESTARTDATE'] = дата ('Y-m-d'). «Т». Дата ( 'H: I: S'). 'Z';
$ hosteddata ['SUBSCRIBERNAME'] = $ GetExpressCheckoutDetails ['FIRSTNAME']. ''. $ GetExpressCheckoutDetails [ 'LASTNAME'];
$ hosteddata ['TOKEN'] = urlencode ($ _ POST ['token']);
$ hosteddata ['DESC'] = $ hosteddata ['L_BILLINGAGREEMENTDESCRIPTION0'];
$ hosteddata ['AMT'] = $ pr-> цена;
$ hosteddata ['BILLINGPERIOD'] = 'Месяц';
$ hosteddata ['BILLINGFREQUENCY'] = '1';
$ hosteddata ['TOTALBILLINGCYCLES'] = '12';
$ hosteddata ['REGULARTOTALBILLINGCYCLES'] = '1';
$ hosteddata ['VERSION'] = '74 .0 ';
$ hosteddata ['MAXFAILEDPAYMENTS'] = '1';
$ hosteddata ['L_PAYMENTREQUEST_0_QTY0'] = '1';
$ hosteddata ['L_BILLINGTYPE0'] = 'RecurringPayments';
$ hosteddata ['L_PAYMENTREQUEST_0_ITEMCATEGORY0'] = 'Digital';
$ hosteddata ['L_PAYMENTREQUEST_0_AMT0'] = $ pr-> цена;
$ hosteddata ['INITAMT'] = $ pr-> цена;
$ hosteddata ['L_PAYMENTREQUEST_0_NUMBER0'] = $ pr-> id;
$ hosteddata ['PAYMENTREQUEST_0_NOTIFYURL'] = 'http: // site_url / paypal / ipn';
$ paypal_data = http_build_query ($ hosteddata); $ hosted_saas_response = $ this-> PPHttpPost ('CreateRecurringPaymentsProfile', $ paypal_data);
Я использовал отдельный метод для публикации параметров в PayPal
приватная функция PPHttpPost ($ methodName_, $ nvpStr_) {
$ api_username = '[email protected]'; $ api_password = 'QWEQWEWQEQWEQEQWE';
$ api_signature = 'WQEQWEQWEQWEWQEQWEQWEQWEQWEQWE.cT';
$ api_endpoint = "https://api-3t.paypal.com/nvp";
$ version = '124.0'; $ ch = curl_init ();
curl_setopt ($ ch, CURLOPT_URL, $ api_endpoint);
curl_setopt ($ ch, CURLOPT_VERBOSE, 1);
curl_setopt ($ ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt ($ ch, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt ($ ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt ($ ch, CURLOPT_POST, 1);
$ nvpreq = "METHOD = $ methodName_VERSION = $ versionPWD = $ api_passwordUSER = $ api_usernameSIGNATURE = $ api_signature $ nvpStr_";
curl_setopt ($ ch, CURLOPT_POSTFIELDS, $ nvpreq);
$ httpResponse = curl_exec ($ ch); if (! $ httpResponse) { выход («$ methodName_ failed:» .curl_error ($ ch). '('. curl_errno ($ ch). ')');
} // Извлекаем детали ответа. $ httpResponseAr = explode ("", $ httpResponse);
$ httpParsedResponseAr = array (); foreach ($ httpResponseAr as $ i => $ value) { $ tmpAr = explode ("=", $ value); if (sizeof ($ tmpAr)> 1) { $ httpParsedResponseAr [$ tmpAr [0]] = $ tmpAr [1]; } } if ((0 == sizeof ($ httpParsedResponseAr)) ||! array_key_exists ('ACK', $ httpParsedResponseAr)) {
exit («Неверный HTTP-ответ для запроса POST ($ nvpreq) на $ api_endpoint.»);
} return $ httpParsedResponseAr;
}
Другой способ отменить это внутри учетной записи пользователя: