Итак, я интегрировал Paypal в свой поток платежей, и вот что происходит:
- Пользователь заходит на страницу. Кликает кнопку оплаты
- Пользователь сначала перенаправляется на страницу, которая вызывает
SetExpressCheckout
и перенаправляется на Paypal. (Он должен быть выставлен один раз, скажем, на 77 долларов, а затем каждый месяц на 1 год на одну и ту же сумму. Поэтому я не устанавливаю первоначальную сумму, вместо этого вычитаю ее напрямую.)
- По возвращении он нажимает кнопку подтверждения, и один раз платеж удерживается с помощью
DoExpressCheckout
и создается профиль выставления счета.
Все отлично работает. Я получаю оплату каждый месяц. Пользователь не оплачивается дважды при запуске.
ПРОБЛЕМА: Когда пользователь был перенаправлен на Paypal, он видит только ИМЯ ПУНКТА и ОПИСАНИЕ Я установил. То есть Paypal не описывает, является ли транзакция однократной или подпиской, как при использовании простой кнопки подписки для оплаты. Paypal указывает только сумму, но не тип транзакции.
NVPEncoder encoder = new NVPEncoder();
encoder.add("METHOD","SetExpressCheckout");
encoder.add("RETURNURL",returnURL);
encoder.add("CANCELURL",cancelURL);
encoder.add("CURRENCYCODE","USD");
encoder.add("AMT",amt);
encoder.add("BILLINGPERIOD", "Month");
encoder.add("BILLINGFREQUENCY", "1");
encoder.add("PROFILESTARTDATE",dateFormatGmt.format(new Date()));
encoder.add("L_BILLINGTYPE0", "RecurringPayments");
encoder.add("L_BILLINGAGREEMENTDESCRIPTION0",package_name);
encoder.add("L_NAME0",package_name);
encoder.add("L_AMT0",amt);
encoder.add("L_QTY0","1");
String strNVPRequest = encoder.encode();
String ppresponse = (String) caller.call(strNVPRequest);
NVPDecoder resultValues = new NVPDecoder();
resultValues.decode(ppresponse);
String strAck = resultValues.get("ACK");
if (strAck !=null && !(strAck.equals("Success") ||
strAck.equals("SuccessWithWarning"))) {
response.sendRedirect("APIError.jsp");
} else {
response.sendRedirect(redirectUrl);
}