Подключите стандартную кассу PayPal В этом руководстве последовательно описан мой опыт внедрения PayPal Standard Checkout с использованием Java на платформе Google App Engine. Эта статья предназначена для людей, уже имеющих опыт работы с облачной платформой GAE.
Задача
Мне нужно было интегрировать платежную систему PayPal в сайт собственного проекта, который будет предоставлять услугу подписки.Начав работать с API PayPal Express Checkout, через некоторое время я понял, что система приема платежей становится слишком громоздкой, а готовым кнопкам Standard Checkout не хватает необходимой гибкости, которая требуется при интеграции сайта с другими платежными системами.
Решение было найдено в использовании инструментов Standard Checkout, которые PayPal предоставляет разработчикам сторонних «корзин» для сайта.
Изменение типа учетной записи
Чтобы начать принимать платежи с помощью платежной системы PayPal, нам сначала необходимо изменить тип счета.При первой регистрации в PayPal нам предоставляется стандартный тип счета – «Личный», который можно использовать только для оплаты товаров и услуг.
Для автоматизации приема платежей необходим тип счета «Премьер» или «Бизнес».
Различия между типами счетов можно найти в Сравнительная таблица .
В целом разница в том, что учетная запись «Бизнес» позволяет использовать учетную запись разным пользователям.
Поскольку данная функция необходима только крупным предприятиям, выбираем тип «Премьер».
Тип аккаунта указан в левом верхнем углу под словами «Добро пожаловать.
»
Уведомление о полученном платеже
Существует два способа уведомления о платеже — передача платежных данных (PDT) и мгновенное уведомление о платеже (IPN).Поскольку у IPN есть такое преимущество, как асинхронная работа, мы выбираем этот метод. Более подробную информацию можно найти в Руководство по интеграции управления заказами Отключение PDT: «PayPal» — «Профиль» — «Мои инструменты продаж» — «Настройки веб-сайта» — «Отправить данные платежа (необязательно)» — Выкл.
Активация IPN: «PayPal» — «Профиль» — «Мои инструменты продаж» — «Уведомления о мгновенных платежах» — «Изменить настройки» — «Принимать сообщения IPN (включено)» и добавить «URL-адрес уведомления».
Возврат покупателя на сайт продавца
После оплаты покупки в магазине PayPal рекомендуется автоматически отправить покупателя на страницу уведомления об успешном платеже или на сайт продавца.«PayPal» — «Профиль» — «Мои инструменты продаж» — «Настройки сайта».
«Автоматический возврат» — Вкл.
и укажите «обратный URL».
Создание учетных записей в песочнице PayPal
Для тестирования процесса приема платежей существует так называемая песочница.За операциями в «песочнице» не стоят реальные деньги; мы просто оперируем цифрами на созданных виртуальных тестовых аккаунтах.
После регистрации на Песочница PayPal перейдите в раздел «Тестовые аккаунты» и создайте две «Предварительно настроенные» учетные записи — одна представляет покупателя (Buyer), другая — продавца (Seller).
Когда вы создаете учетную запись продавца, ее тип по умолчанию — «Бизнес».
При тестировании разницы между Премьер и Бизнес нет. При создании счета рекомендуется вводить любую сумму в валюте открываемого счета.
Эта сумма будет потрачена или добавлена в зависимости от транзакций между созданными аккаунтами.
Рекомендуется записать автоматически сгенерированный адрес электронной почты и пароль, поскольку эти данные обеспечивают доступ к учетным записям в песочнице по адресу www.sandbox.paypal.com
Указание типа кодировки
Мы работаем с данными в кодировке UTF-8. Чтобы изменить подчеркивание, перейдите по адресу https://www.sandbox.paypal.com/cgi-bin/webscrЭcmd=_profile-language-encoding Далее выберите язык сайта, сохраните его, вернитесь назад и после нажатия кнопки «Дополнительные параметры» выберите нужную кодировку.
Получение документации
Работать с мерчантом PayPal возможно двумя способами: Использование API PayPal Express Checkout и стандартная проверка.Последний проще и лучше всего подходит для приема платежей за небольшой набор фиксированных товаров или услуг.
мы выбираем его.
Чтобы узнать больше об этом методе, желательно скачать Руководство по интеграции стандартной кассы
Кроме того, абсолютно вся документация в формате PDF и HTML находится по адресу связь
Получать платеж
Принцип работы PayPal Standard Chechout показан на изображении.
- Страница JSP содержит форму запроса POST как минимум с четырьмя параметрами:
- sum_1 — цена одной единицы товара
- business — адрес электронной почты PayPal-аккаунта продавца (аккаунт продавца в песочнице)
- item_name_1 — название продукта
- загрузить - уведомление о том, что данная «корзина» создана сторонним поставщиком
- После нажатия на кнопку формы покупатель перенаправляется на сайт песочницы PayPal по адресу https://www.sandbox.paypal.com/cgi-bin/webscr где ему необходимо просмотреть счет и войти в систему (аккаунт покупателя в песочнице)
- Покупателю предлагается оплатить счет, нажав соответствующую кнопку.
- Покупатель автоматически переходит на сайт продавца по URL-адресу, указанному в профиле продавца или URL-адресу, указанному в возвращаемом параметре формы POST.
- Продавец PayPal отправляет запрос IPN POST на URL-адрес, указанный в профиле.
Уведомления о поступлениях платежей (IPN)
Принцип работы IPN показан на изображении.
- Ожидание POST-запроса от продавца PayPal
- Создаем запрос к PayPal, содержащий точно такие же переменные IPN с полученными значениями, добавляя в запрос заголовок cmd=_notify-validate
- Отправляем запрос на песочница.
paypal.com
- Продавец PayPal должен ответить сообщением VERIFIED или INVALID.
- Проверяем статус ответа, который должен быть кодом 200.
- Если ответом является слово VERIFIED, делаем следующие проверки:
- Если проверенный ответ продавца PayPal прошел все проверки, мы обрабатываем действие на основе значения переменной txn_type, если она существует. В противном случае мы обрабатываем действие на основе значения переменной Reason_code. Значения, которые могут принимать эти переменные, указаны в Руководство по интеграции управления заказами
- Если ответ НЕДЕЙСТВИТЕЛЬНЫЙ или код ответа не 200, мы сохраняем сообщение для дальнейшего изучения.
Работаем с ГА?
JSP-код для страницы order.jsp:IPN-код процессора в пакете paypal.Ipn.java<%@ page contentType="text/html; charset=UTF-8" language="java" %> // information about values of parameters please see at url // https://www.paypal.com/en_US/pdf/PP_WebsitePaymentsStandard_IntegrationGuide.pdf <% // final String strMerchantUrl = " https://www.paypal.com/cgi-bin/webscr "; final String strMerchantUrl = " https://www.sandbox.paypal.com/cgi-bin/webscr "; final String strEmail = "email_of_seller"; final String strDescription = "my item description"; final String strAmount = "1.3"; final String strCurrencyCode = "USD"; // your counter of invoice String strInvoice = "234234234"; final String returnUrl = "site_of_seller"; %> <form action=<%= strMerchantUrl %> method="post" accept-charset="UTF-8"> <input type="hidden" name="cmd" value="_cart" /> <input type="hidden" name="upload" value="1" /> <input type="hidden" name="business" value="<%= strEmail %>" /> <input type="hidden" name="item_name_1" value="<%= strDescription %>" /> <input type="hidden" name="amount_1" value="<%= strAmount %>" /> <input type="hidden" name="currency_code" value="<%= strCurrencyCode %>" /> <input type="hidden" name="no_shipping" value="1" /> <input type="hidden" name="invoice" value="<%= strInvoice %>" /> <input type="hidden" name="return" value="<%= returnUrl %>" /> <input type="image" value="PayPal" src=" https://www.paypal.com/en_US/i/btn/btn_xpressCheckout.gif " alt="Кнопка «Отправить»" align="left" style=" margin-right:7px ;" /> </form>
package payment.paypal;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.logging.Logger;
import java.util.Enumeration;
import java.net.URLEncoder;
import java.net.URL;
import java.net.URLConnection;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@SuppressWarnings("serial")
public class Ipn extends HttpServlet {
private static final Logger log = Logger.getLogger(Ipn.class.getName());
public void doPost(HttpServletRequest req, HttpServletResponse resp)
throws IOException {
try {
// read post from PayPal system and add 'cmd'
Enumeration<?> en = req.getParameterNames();
String str = "cmd=_notify-validate";
while (en.hasMoreElements()) {
String paramName = (String) en.nextElement();
String paramValue = req.getParameter(paramName);
str = str + "&" + paramName + "=" + URLEncoder.encode(paramValue, "UTF-8");
}
// test log IPN string
log.info("[Paypal IPN string] " + str);
// post back to PayPal system to validate
// URL url = new URL(" https://www.paypal.com/cgi-bin/webscr ");
URL url = new URL(" https://www.sandbox.paypal.com/cgi-bin/webscr ");
URLConnection conn = url.openConnection();
conn.setDoOutput(true);
conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
OutputStreamWriter wr = new OutputStreamWriter(
conn.getOutputStream());
wr.write(str);
wr.flush();
// response from PayPal - VERIFIED or INVALID
BufferedReader br = new BufferedReader(new InputStreamReader(
conn.getInputStream()));
String line = br.readLine();
// test log check string
log.info("[PayPal check string] " + line);
wr.close();
br.close();
// assign posted variables to local variables
String itemName = req.getParameter("item_name");
String itemNumber = req.getParameter("item_number");
String paymentStatus = req.getParameter("payment_status");
String paymentAmount = req.getParameter("mc_gross");
String paymentCurrency = req.getParameter("mc_currency");
String txnId = req.getParameter("txn_id");
String receiverEmail = req.getParameter("receiver_email");
String payerEmail = req.getParameter("payer_email");
// check notification validation
if (line.equals("VERIFIED")) {
// check that txnId has not been previously processed
// check that receiverEmail is your Primary PayPal email
// check that paymentAmount/paymentCurrency are correct
// process payment
} else if (line.equals("INVALID")) {
// log for investigation
log.warning(line);
} else {
// error
}
} catch (Exception e) {
log.warning("[ipn] " + e);
}
}
}
Сопоставление путей в файле /war/WEB-INF/web.xml
<!-- payment paypal -->
<servlet>
<servlet-name>Ipn</servlet-name>
<servlet-class>payment.paypal.Ipn</servlet-class>
</servlet>
<!-- -->
<!-- payment paypal mapping -->
<servlet-mapping>
<servlet-name>Ipn</servlet-name>
<url-pattern>/payment/paypal/ipn</url-pattern>
</servlet-mapping>
<!-- -->
Создайте конфигурацию журнала в файле /war/WEB-INF/appengine-web.xml.
<!-- Configure java.util.logging -->
<system-properties>
<property name="java.util.logging.config.file" value="WEB-INF/logging.properties"/>
</system-properties>
Статья написана по теме http://habrahabr.ru/blogs/php/128198/ , а также после долгих поисков в Интернете простого и удобного способа получения оплаты с помощью PayPal. Конечно, не вся информация охвачена; например, код не проверяет сумму платежа.
Без этой проверки злоумышленник может сохранить html-страницу формы, отредактировать цену в сторону уменьшения и получить, скажем, цифровой товар или подписку по цене ниже цены покупки.
Проверки зависят от реализации сервиса и требуют индивидуального подхода при интеграции платежной системы на сайт продавца.
Пример кода, использованного в этой работе Java/JSP предоставлено PayPal Данным способом можно оплатить услуги, продать подписки на сервис, товары, а также пополнить баланс аккаунта пользователя на сайте.
upd: указание кодировки, спасибо за мысль Winbackgo Теги: #paypal API #PayPal #стандартная проверка PayPal #paypal ipn #Google App Engine
-
Основы Доски Объявлений 101
19 Oct, 24 -
Ericsson Hpm-10: Нежелательный Mp3-Плеер
19 Oct, 24 -
Нужен Ли Php Новый Логотип?
19 Oct, 24 -
Opera Software Заговорила По-Русски!
19 Oct, 24 -
Радио-Э №14
19 Oct, 24