Как отменить подписку PayPal без учетной записи PayPal?

Мой текущий проект позволяет пользователям подписаться на членство без регистрации учетной записи PayPal.

Имя пользователя и пароль пользователя создаются и управляются моим собственным приложением, а не PayPal.

Может кто-нибудь сказать мне, как создать форму hTMl, которая отменит эту подписку? Могу ли я отменить подписку, отправив txn_id??

Я полагаю, что могу захватить эту информацию с IPN.

Я должен также упомянуть, что я администратор баз данных, а не разработчик, поэтому терпите меня, если я немного новичок.

Заранее спасибо.

1

Решение

Вот что я в итоге сделал.

<?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;
}
?>
1

Другие решения

Используйте API-интерфейс PayPal ManageRecurringPaymentsProfileStatus (API Operation NVP), используя параметр ACTION, который вы можете:

  • Отмена — только профили в активном или приостановленном состоянии могут быть отменены.
  • Приостановить — только профили в активном состоянии могут быть приостановлены.
  • Reactivate — только профили в приостановленном состоянии могут быть повторно активированы.

Документация Paypal — https://developer.paypal.com/docs/classic/api/merchant/ManageRecurringPaymentsProfileStatus_API_Operation_NVP/

Чтобы создать повторяющийся профиль, следуйте этому примеру (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;
}

Другой способ отменить это внутри учетной записи пользователя:

  1. Войдите в свою учетную запись PayPal.
  2. Нажмите «Профиль» в верхней части страницы.
  3. Нажмите Мои деньги.
  4. Нажмите Обновить в разделе Мои предварительно утвержденные платежи.
  5. Нажмите Отмена, Отмена автоматического выставления счетов или Отмена подписки и следуйте инструкциям.
0

По вопросам рекламы [email protected]