关于停止和退款订阅的 PayPal NVP API 的推荐做法是什么?
What is the Recommended Practice on PayPal NVP API with Stopping and Refunding Subscriptions?
所以我开始了这个小小的 class 处理 PayPal 无效、退款和订阅取消。我的问题是,推荐的做法是什么?我的意思是,我是否应该尝试取消交易,然后忽略错误,然后退款,然后取消订阅?
请注意,在我的案例中,交易是从点击 PayPal 订阅按钮开始的,然后在 6 个月期限结束后续订一次,然后客户想要退款并停止进一步订阅。
<?php
class Paypp {
public static function voidCard($r) {
$asData = array(
'METHOD' => 'DoVoid',
'AUTHORIZATIONID' => @ $r['paypal_txn_id'] // tnx_id from subscr_payment IPN
);
return self::_sendData($asData);
}
public static function cancelSubscription($r) {
$asData = array(
'METHOD' => 'ManageRecurringPaymentsProfileStatus',
'PROFILEID' => @ $r['paypal_subscr_profile_id'], // subscr_id from subscr_payment IPN
'ACTION' => 'cancel'
);
return self::_sendData($asData);
}
public static function refundCard($r) {
$asData = array(
'METHOD' => 'RefundTransaction',
'TRANSACTIONID' => @ $r['paypal_txn_id'],
'REFUNDTYPE' => 'full',
'CURRENCYCODE' => @ $r['currency'],
'AMT' => @ $r['gross']
);
return self::_sendData($asData);
}
private static function _sendData($asData) {
global $config;
$sActive = $config->PAYMENT_GATEWAY_DATA->pp->ACTIVE;
$sURL = $config->PAYMENT_GATEWAY_DATA->pp->$sActive->NVP_URL;
$sVersion = $config->PAYMENT_GATEWAY_DATA->pp->$sActive->NVP_VERSION;
$sUser = $config->PAYMENT_GATEWAY_DATA->pp->$sActive->NVP_USER;
$sPass = $config->PAYMENT_GATEWAY_DATA->pp->$sActive->NVP_PASS;
$sSig = $config->PAYMENT_GATEWAY_DATA->pp->$sActive->NVP_SIG;
$asExtra = array(
'VERSION' => $sVersion,
'USER' => $sUser,
'PWD' => $sPass,
'SIGNATURE' => $sSig
);
$asData = array_merge($asData,$asExtra);
$asOpt = array(
CURLOPT_HEADER => FALSE,
CURLOPT_POST => TRUE,
CURLOPT_RETURNTRANSFER => TRUE,
CURLOPT_POSTFIELDS => http_build_query($asData),
CURLOPT_VERBOSE => TRUE,
);
$hCurl = curl_init($sURL);
curl_setopt_array($hCurl, $asOpt);
$bVerifySSL = @ $config->VERIFY_SSL;
curl_setopt($hCurl, CURLOPT_SSL_VERIFYPEER, $bVerifySSL);
$sResponse = curl_exec($hCurl);
curl_close($hCurl);
return $sResponse;
}
} // end class
通过沙盒中的反复试验,我发现工作流应该是什么:
跳过无效。根据 PayPal 代表的说法:“无效仅对授权和订单有效,您不能通过订阅创建任何一个。”
是的,退款。它针对 txn_id 运行,它对于您在订阅过程中收到的每个 subscr_payment 都是唯一的。因此,您只会退还您在 IPN 上收到的最近 subscr_payment。
是的,取消订阅 -- 仅靠退款无法为您完成这一步。
跳过无效步骤。无效仅对授权和订单有效,您不能通过订阅创建任何一个。但是,是的,您需要取消订阅并退还个人付款。
所以我开始了这个小小的 class 处理 PayPal 无效、退款和订阅取消。我的问题是,推荐的做法是什么?我的意思是,我是否应该尝试取消交易,然后忽略错误,然后退款,然后取消订阅?
请注意,在我的案例中,交易是从点击 PayPal 订阅按钮开始的,然后在 6 个月期限结束后续订一次,然后客户想要退款并停止进一步订阅。
<?php
class Paypp {
public static function voidCard($r) {
$asData = array(
'METHOD' => 'DoVoid',
'AUTHORIZATIONID' => @ $r['paypal_txn_id'] // tnx_id from subscr_payment IPN
);
return self::_sendData($asData);
}
public static function cancelSubscription($r) {
$asData = array(
'METHOD' => 'ManageRecurringPaymentsProfileStatus',
'PROFILEID' => @ $r['paypal_subscr_profile_id'], // subscr_id from subscr_payment IPN
'ACTION' => 'cancel'
);
return self::_sendData($asData);
}
public static function refundCard($r) {
$asData = array(
'METHOD' => 'RefundTransaction',
'TRANSACTIONID' => @ $r['paypal_txn_id'],
'REFUNDTYPE' => 'full',
'CURRENCYCODE' => @ $r['currency'],
'AMT' => @ $r['gross']
);
return self::_sendData($asData);
}
private static function _sendData($asData) {
global $config;
$sActive = $config->PAYMENT_GATEWAY_DATA->pp->ACTIVE;
$sURL = $config->PAYMENT_GATEWAY_DATA->pp->$sActive->NVP_URL;
$sVersion = $config->PAYMENT_GATEWAY_DATA->pp->$sActive->NVP_VERSION;
$sUser = $config->PAYMENT_GATEWAY_DATA->pp->$sActive->NVP_USER;
$sPass = $config->PAYMENT_GATEWAY_DATA->pp->$sActive->NVP_PASS;
$sSig = $config->PAYMENT_GATEWAY_DATA->pp->$sActive->NVP_SIG;
$asExtra = array(
'VERSION' => $sVersion,
'USER' => $sUser,
'PWD' => $sPass,
'SIGNATURE' => $sSig
);
$asData = array_merge($asData,$asExtra);
$asOpt = array(
CURLOPT_HEADER => FALSE,
CURLOPT_POST => TRUE,
CURLOPT_RETURNTRANSFER => TRUE,
CURLOPT_POSTFIELDS => http_build_query($asData),
CURLOPT_VERBOSE => TRUE,
);
$hCurl = curl_init($sURL);
curl_setopt_array($hCurl, $asOpt);
$bVerifySSL = @ $config->VERIFY_SSL;
curl_setopt($hCurl, CURLOPT_SSL_VERIFYPEER, $bVerifySSL);
$sResponse = curl_exec($hCurl);
curl_close($hCurl);
return $sResponse;
}
} // end class
通过沙盒中的反复试验,我发现工作流应该是什么:
跳过无效。根据 PayPal 代表的说法:“无效仅对授权和订单有效,您不能通过订阅创建任何一个。”
是的,退款。它针对 txn_id 运行,它对于您在订阅过程中收到的每个 subscr_payment 都是唯一的。因此,您只会退还您在 IPN 上收到的最近 subscr_payment。
是的,取消订阅 -- 仅靠退款无法为您完成这一步。
跳过无效步骤。无效仅对授权和订单有效,您不能通过订阅创建任何一个。但是,是的,您需要取消订阅并退还个人付款。