2015-10-22 4 views
1

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

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

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

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

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

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

+1

Возможный дубликат [Paypal - оплата без учета] (http://stackoverflow.com/questions/1783832/paypal-payment-without-) –

ответ

0

Использование PayPal метод апи ManageRecurringPaymentsProfileStatus (API Операция НВП), используя параметр ACTION вы можете:

  • Отмена - только профили в активном или приостановленном состоянии может быть отменено.
  • Suspend - только профили в активном состоянии могут быть подвешены.
  • Reactivate - активировать только профили в состоянии ожидания.

Paypal Documentation - https://developer.paypal.com/docs/classic/api/merchant/ManageRecurringPaymentsProfileStatus_API_Operation_NVP/

Для создания повторяющегося профиля проследуйте (PHP) пример:

 
// Parameters for SetExpressCheckout, which will be sent to PayPal
$padata['L_BILLINGAGREEMENTDESCRIPTION0'] = 'Product description'; $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); //Respond according to message we receive from Paypal if("SUCCESS" == strtoupper($httpParsedResponseAr["ACK"]) || "SUCCESSWITHWARNING" == strtoupper($httpParsedResponseAr["ACK"])){ //Redirect user to PayPal store with Token received. $paypalurl ='https://www.paypal.com/cgi-bin/webscr?cmd=_express-checkout&token='.$httpParsedResponseAr["TOKEN"].''; header('Location: '.$paypalurl); }else{ echo 'Error :'.urldecode($httpParsedResponseAr["L_LONGMESSAGE0"]).'';
}

Page ReturnUrl:

 
$hosteddata['L_BILLINGAGREEMENTDESCRIPTION0'] = 'Recurring Description';
$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'] = date('Y-m-d') . 'T' . date('H:i:s').'Z';
$hosteddata['SUBSCRIBERNAME'] = $GetExpressCheckoutDetails['FIRSTNAME'] . ' ' . $GetExpressCheckoutDetails['LASTNAME'];
$hosteddata['TOKEN'] = urlencode($_POST['token']);
$hosteddata['DESC'] = $hosteddata['L_BILLINGAGREEMENTDESCRIPTION0'];
$hosteddata['AMT'] = $pr->price;
$hosteddata['BILLINGPERIOD'] = 'Month';
$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->price;
$hosteddata['INITAMT'] = $pr->price;
$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

 
private function 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=$version&PWD=$api_password&USER=$api_username&SIGNATURE=$api_signature&$nvpStr_";
curl_setopt($ch, CURLOPT_POSTFIELDS, $nvpreq);
$httpResponse = curl_exec($ch); if(!$httpResponse) { exit("$methodName_ failed: ".curl_error($ch).'('.curl_errno($ch).')');
} // Extract the response details. $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("Invalid HTTP Response for POST request($nvpreq) to $api_endpoint.");
} return $httpParsedResponseAr;
}

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

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

Спасибо за информацию! У меня просто небольшая проблема после этого рабочего процесса. До этого я просто использовал управляемые кнопки paypal для подписки. – speaker

+0

Я тестировал его, но получил ошибку при ошибке. «Использование $ this, если не в контексте объекта в« Ошибка произошла в этой строке: «$ httpParsedResponseAr = $ this -> PPhttpPost ('SetExpressCheckout', $ paypal_data); Я продолжу работать над этим, но любая другая помощь, которую вы можете предоставить, будет очень благодарна. – speaker

+0

$ this-> PPHttpPost (потому что вся эта функциональность находится в одном классе, если вы используете другой способ только метод вызова PPHttpPost (без $ this-> – Pavel

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; 
} 
?> 
Смежные вопросы