Перейти к содержанию

sadam

Пользователи
  • Постов

    18
  • Зарегистрирован

  • Посещение

Контакты

Посетители профиля

Блок последних пользователей отключён и не показывается другим пользователям.

Достижения sadam

Ученик

Ученик (3/14)

  • Неделя в сообществе
  • One Month Later
  • Год в сообществе
  • Топикстартер
  • Первое сообщение

Последние значки

1

Репутация

  1. Наименование товара: Apple MacBook Air 13.3" - Intel Core i5 - 8GB Memory - 128GB SSD - Gold Описание:( новый под пленкой) не рапоковывали привезен с сша клавиатура english кто профи он и так русские буквы найдет цвет золото 2‑ядерный процессор с тактовой частотой 1,6 ГГц, ускорение Turbo Boost до 3,6 ГГц Накопитель 128 ГБ Touch ID Дисплей Retina с технологией True Tone 2‑ядерный процессор Intel Core i5 8-го поколения с тактовой частотой 1,6 ГГц (ускорение Turbo Boost до 3,6 ГГц) 8 ГБ памяти LPDDR3 2133 МГц SSD-накопитель ёмкостью 128 ГБ1 Графический процессор Intel UHD Graphics 617 Touch ID Трекпад Force Touch Два порта Thunderbolt 3 93 990.00 pyб. оф цена на aплее.ru Цена: руб.70000 Контакты: +79024526412
  2. куплю если подождете недолго буквально. какой цвет? и куплен где?

    1. Показать предыдущие комментарии  Ещё #
    2. Crucial

      Crucial

      ммм,жаль ну если успею куплю))

      да щас свой пока продам ходиком,у меня коцнулся маленько 6ка да и постарел простО))

      люди тоже интересуются но цены предлагают маленькие

    3. sadam

      sadam

      ну звони узнавай я не тороплюсь 

    4. Crucial

      Crucial

      ок попробую ускорить процесс продажи

  3. а что сей час если наколка на теле у человека его так колотить можно ?у нас пол россии вроде сидело и что теперь к чему провокация ? ну я думаю если бы человек был в чем то виноват его бы увезли в полицию возбудили дело следствие итп .такое ощюшения тут уже начали сами полицаи писать которые его колотили )))))))))))) у этих ментов при любом раскладе привышение должностных полномочий парьню нужно адвоката и в суд и пускай ему плотят за увечие и побои тимати нужно тоже поколотить ))))
  4. Введение При создании коммерческих сайтов встает вопрос: как принимать платежи? Одной из наиболее популярных в мире платежных систем является PayPal . Выбор этой системы часто определяется высокой надежностью, простотой открытия аккаунта и использования. Для открытия аккаунта достаточно наличия кредитной карты и/или счета в американском банке. Одним из основных недостатков часто называют очень жесткую политику безопасности. Но практика показывает, что при строгом соблюдении правил использования системы проблемы возникают редко. Я не собираюсь описывать все "за" и "против". Цель этой статьи - показать, как организовать обработку платежей для обеспечения надежности и безопасности. Сразу оговорюсь, что PayPal не открывает аккаунты жителям России (как, впрочем, и других стран бывшего СССР), но, учитывая, что многие российские программисты создают сайты для зарубежных заказчиков, тема интеграции сайта с PayPal является актуальной. Организация собственно оплаты не представляет тудностей. В этой статье я буду уделять больше внимания процессу автоматической проверки платежа с использованием IPN (Instant Payment Notification). Статья основана на собственном опыте, официальной документации PayPal и материалах независимого форума разработчиков PayPal. Виды платежей PayPal поддерживает несколько видов платежей: оплата товаров в корзине, предоставляемой PayPal. В этом случае все операции по поддержке корзины берет на себя PayPal покупка товара "в один клик", без добавления товара в корзину. Этот метод также применяется для оплаты товаров в корзине, сформированной без использования PayPal периодические платежи, или подписка (recurring billing, subscription) В статье будут рассмотрены два последних метода. Также я не рассматриваю метод, при котором корзина формируется на нашем сайте, а затем все содержимое корзины передается PayPal. Процесс оплаты Процесс оплаты очень прост: создается POST-форма с набором hidden полей, содержащих информацию о товаре (идентификатор, наименование, цена), и кнопку отправки формы. Следует отметить, что все цены должны передаваться с двумя знаками после точки. Если стоимость товара $10, то цена должна передаваться как "10.00". После отправки формы покупатель переходит на сайт paypal.com, где он завершает процесс оплаты. Данные формы должны отправляться на https://www.paypal.com/cgi-bin/webscr.'>https://www.paypal.com/cgi-bin/webscr. Покупка "в один клик" Код простейшей формы: Описание основных параметров Параметр Описание cmd Обязательный параметр. Должен иметь значение "_xclick" business Обязательный параметр - e-mail продавца item_number Идентификатор товара. Это значение не будет показано пользователю, однако будет передано вашему скрипту при подтверждении транзакции. Если вы используете PayPal для оплаты товаров из корзины, в этом поле можно передавать идентификатор корзины item_name Наименование товара, которое будет показано покупателю no_shipping Не запрашивать адрес для доставки. "1" - не запрашивать адрес, "0" - запрашивать return URL, куда покупатель будет перенаправлен после успешной оплаты. Если этот параметр не передать, покупатель останется на сайте PayPal rm Этот параметр определяет, как будет передаваться информация об успешно завершенной транзакции скрипту, указанному в параметре return. "1" - никакие параметры передаваться не будут."2" - будет использоваться метод POST. "0" - будет использоваться метод GET. По умолчанию "0". cancel_return URL, куда покупатель будет перенаправлен при отмене им оплаты . Если этот параметр не передать, покупатель останется на сайте PayPal notify_url URL, на который PayPal будет предавать информацию о транзакции (IPN). Если не передавать этот параметр, будет использоваться значение, указанное в настройках аккаунта. Если в настройках аккаунта это также не определено, IPN использоваться не будет custom Значение этого поля не участвует в процессе покупки, оно просто будет передано вашему скрипту при подверждении транзакции invoice Используется для передачи номера счета. Параметр необязательный, но если вы передаете его, он должен быть уникальным для каждой транзакции amount Сумма к оплате. Если этот параметр не передать, покупателю будет предоставлена возможность ввести сумму самостоятельно(используется для donations) currency_code Код валюты. Возможные значения: "USD","EUR","GBP","YEN","CAD". По умолчанию "USD" В таблице приведены лишь наиболее часто используемые параметры. Полный список смотрите в документации (ссылки в конце статьи). Подписка PayPal предоставляет возможность организовать подписку: со счета клиента на ваш счет будет периодически переводиться определенная сумма, причем клиент имеет возможность в любой момент отменить подписку. Вы можете задать периодичность и стоимость подписки, а также пробный период, чтобы клиент мог убедиться в качестве предоставляемых вами услуг. Пробный период может быть как платным, так и бесплатным. Пример формы: Описание основных параметров Параметр Описание cmd Обязательный параметр. Должен иметь значение "_xclick-subscriptions" business Обязательный параметр - e-mail продавца item_number Идентификатор товара. Это значение не будет показано пользователю, однако будет передано вашему скрипту при подтверждении транзакции. item_name Наименование товара, которое будет показано покупателю no_shipping Не запрашивать адрес для доставки. "1" - не запрашивать адрес, "0" - запрашивать return URL, куда покупатель будет перенаправлен после успешной оплаты. Если этот параметр не передать, покупатель останется на сайте PayPal rm Этот параметр определяет, как будет передаваться информация об успешно завершенной транзакции скрипту, указанному в параметре return. "1" - никакие параметры передаваться не будут."2" - будет использоваться метод POST. "0" - будет использоваться метод GET. По умолчанию "0". cancel_return URL, куда покупатель будет перенаправлен при отмене им оплаты . Если этот параметр не передать, покупатель останется на сайте PayPal notify_url URL, на который PayPal будет предавать информацию о транзакции (IPN). Если не передавать этот параметр, будет использоваться значение, указанное в настройках аккаунта. Если в настройках аккаунта это также не определено, IPN использоваться не будет custom Значение этого поля не участвует в процессе покупки, оно просто будет передано вашему скрипту при подверждении транзакции invoice Используется для передачи номера счета. Параметр необязательный, но если вы передаете его, он должен быть уникальным для каждой транзакции a1 Стоимость первого пробного периода. Может быть "0", в этом случае пробный период бесплатен. Если вы не предоставляете пробный период, не передавайте этот параметр p1 Длительность первого пробного периода. Если вы не предоставляете пробный период, не передавайте этот параметр t1 Единица измерения длительности первого пробного периода. Возможные значения: "D"-дни, "W"-недели, "M"-месяцы, "Y"-годы. Если вы не предоставляете пробный период, не передавайте этот параметр a2 Стоимость второго пробного периода. Если вы не предоставляете пробный период, не передавайте этот параметр p2 Длительность второго пробного периода. Если вы не предоставляете пробный период, не передавайте этот параметр t2 Единица измерения длительности второго пробного периода. Возможные значения: "D"-дни, "W"-недели, "M"-месяцы, "Y"-годы. Если вы не предоставляете пробный период, не передавайте этот параметр a3 Стоимость основного цикла подписки. Обязательный параметр p3 Длительность основного цикла подписки. Обязательный параметр t3 Единица измерения длительности основного цикла подписки. Обязательный параметр. Возможные значения: "D"-дни, "W"-недели, "M"-месяцы, "Y"-годы. src Периодические платежи. "1" - платежи будут повторяться периодически. Если параметр не передать, платеж будет произведен однократно. sra Если в этом параметре передать "1", и попытка перевода денег завершается неудачей (например при недостатке средств на счете покупателя), то будет сделано еще до 2 попыток. После 3 неудачных попыток, подписка будет автоматически отменена. Если не передать этот параметр, подписка будет автоматически отменена после первой же неудачной попытки. srt Количество циклов подписки. Если этот параметр передан, подписка будет отменена после указанного количества циклов. Если не передать этот параметр, подписка будет действовать до тех пор, пока не будет отменена покупателем (либо автоматически при ошибке транзакции) modify Возможность модификации. Возможные значения: "0" - форма предназначена только для создания новой подписки "1" - форма предназначена только для изменения параметров существующей подписки "2" - форма предназначена как для создания новой подписки, так и для изменения параметров существующей По умолчанию "0" usr_manage Автоматическая генерация имени пользователя и пароля. Передайте "1", чтобы PayPal автоматически сгенерировал имя пользователя и пароль. currency_code Код валюты. Возможные значения: "USD","EUR","GBP","YEN","CAD". По умолчанию "USD" IPN IPN (Instant Payment Notification) - это технология PayPal, позволяющая автоматизировать процесс обработки платежей. Суть ее заключается в том, что на сервере продавца создается специаальный скрипт, и при возникновении событий, имеющих отношение аккаунту продавца (таких, как платеж, отмена платежа, создание или отмена подписки, и т.д.) сервер PayPal отправляет этому скрипту IPN - POST-запрос с информацией о транзакции. Скрипт в свою очередь посылает запрос серверу PayPal для проверки транзакции. Итак, покупатель завершил оплату. С небольшой задержкой (до нескольких секунд) сервер PayPal отправляет IPN скрипту, указанному в настройках аккаунта или переданному в параметре notify_url. Грамотно написанный IPN-скрипт является ключом к обеспечению безопасности платежей. Если вы слышали о случаях обмана продавцов, использующих PayPal, можете быть уверены: либо они вообще не использовали IPN, либо у них "дырявый" IPN-скрипт В первую очередь скрипт должен убедиться в том, что он действительно был вызван сервером PayPal. Для этого он должен сформировать POST-запрос к https://www.paypal.com/cgi-bin/webscr , передав все полученные переменные без изменения с добавлением параметра cmd со значением _notify-validate. В ответ будет возвращено либо VERIFIED в случае успешной верификациии транзакции, либо INVALID в случае ошибки. В случае ответа INVALID скрипт должен завершить работу. Затем следует проверить получателя платежа, так как потенциальный злоумышленник может изменить форму, чтобы платеж был зачислен на его счет. Получатель платежа определяется по переменным business и receiver_email. Необходимость двух переменных объясняется тем, что PayPal позволяет зарегистрировать для одного аккаунта несколько адресов e-mail. E-mail, указанный при создании аккаунта, является первичным (primary email). Значением receiver_email всегда является primary email. Если платеж был отправлен на дополнительный email, то он передается через business. Если business и/или receiver_email не содержит ожидаемого значения, скрипт немедленно завершает работу. Теперь нужно проверить сумму и валюту платежа. Такая проверка необходима, так как потенциальному злоумышленнику не составляет труда изменить сумму в форме, В случае подписки, следует проверять все параметры подписки (наличие, продолжительность и стоимость пробных периодов, продолжительность и стоимость основного цикла подписки, и т.д.). IPN для одной и той же транзакции может отправляться более одного раза. Например, если платеж по какой-либо причине был задержан, первый IPN будет передан сразу после платежа. После того, как платеж будет завершен или отменен, будет отправлен второй IPN. Если ваш IPN-скрипт не вернул HTTP статус 200, PayPal повторит отправку IPN через некоторое время. Первый повтор будет через 10 секунд, затем при необходимости через 20, потом через 40, 80 и т.д.(до 24 часов). Если в течение 4 суток ожидаемый ответ от вашего скрипта не будет получен, попытки будут прекращены. Это можно использовать для того, чтобы не потерять даные о транзакции в случае возникновения ошибки в вашем IPN скрипте. Например, если скрипту не удалось подключиться к базе данных, в которой он сохраняет данные о транзакциях, он может вернуть HTTP статус 500, и IPN будет повторен позднее. Повторный IPN будет отправлен также, если IPN-скрипт не обращается к серверу PayPal для проверки транзакции. Как видно из описания параметров return, rm и notify_url, IPN может передваться двум скриптам, указанным в параметрах return и notify_url. Между ними 2 различия: IPN для return будет отправлен только однократно, непосредственно после оплаты. notify_url может вызываться несколько раз (см. предыдущий параграф). Вывод скрипта return будет показан пользователю. Заметьте, что если в выводе содержатся ссылки, то они должны быть абсолютными. Вывод скрипта notify_url в браузер пользователя не выводится. В полученых POST переменных содержится информация о транзакции. Наиболее часто используемые переменные: Параметр Описание txn_id Уникальный номер транзакции payment_date Дата платежа в формате "18:30:30 Jan 1, 2000 PST" payer_email e-mail покупателя business e-mail продавца payer_id уникальный идентификатор покупателя. Участники расчетов в PayPal идентифицируются по адресу e-mail, однако, учитывая, что имется возможность изменить e-mail, лучше для идентификации покупателя использовать payer_id item_number Идентификатор товара item_name Наименование товара txn_type Тип транзакции. Возможные значения: "web_accept" - оплата была сделана с использованием кнопки "Buy Now" "cart" - оплата была сделана с использованием встроенной корзины PayPal "send_money" - оплата была сделана с использованием функции "Send money" "reversal" - деньги были возвращены покупателю по его инициативе payment_status Состояние платежа. Возможные значения: "Completed" - транзакция завершена успешно, деньги переведены на счет продавца. В случае txn_type="reversal" означает, что деньги были возвращены на счет покупателя "Pending" - платеж задержан. Причина задержки - в переменной pending_reason. После того, как платеж будет завершен или отменен, PayPal отправит еще одно уведомление. "Failed" - платеж не прошел. Это состояние возможно только если платеж осуществялся с банковского счета "Denied" - платеж был отменен продавцом. Это состояние возникает при отмене продавцом платежа, состояние которого было Pending "Refunded" - деньги были возвращены покупателю. Это состояние возникает при отмене продавцом платежа, состояние которого было Completed pending_reason Причина задержки платежа. Возможные значения: "echeck" - оплата была сделана электронным чеком "multi_currency" - платеж был проведен в валюте, которая не указана в настройках аккаунта продавца. Платеж будет завершен после подтверждения транзакции продавцом "intl" - продавец не является жителем США. Платеж будет завершен после подтверждения транзакции продавцом "verify" - акккаунт продавца находится в состоянии "unverified". Платеж будет завершен после подтверждения личности продавца. "address" - в настройках аккаунта продавца указано, что покупатель должен указать адрес для доставки, но покупатель не указал адрес. Платеж будет завершен после подтверждения транзакции продавцом "upgrade" - платеж был сделан с кредитной карты, при этом аккаунт продавца имеет статус "Personal". Для завершения платежа продавец должен обновить аккаунт до "Business" или "Premier" "unilateral" - e-mail продавца не зарегистрирован в системе. "other" - другая причина. Продавцу следует связаться со службой поддержки для выяснения причины. payment_type Тип платежа. Возможные значения: "echeck" - оплата была сделана электронным чеком "instant" - оплата была сделана с кредитной карты, банковского счета или используя средства на PayPal аккаунте покупателя mc_gross Сумма платежа. mc_fee Сумма коммиссионных. Сумма, зачисленная на счет продавца, определяется как mc_gross–mc_fee mc_currency Валюта платежа first_name Имя покупателя. last_name Фамилия покупателя. address_street Улица address_city Город address_state Штат/Регион address_zip Почтовый индекс address_country Страна verify_sign Цифровая подпись. Используется PayPal при проверке транзакции Дополнительные переменные, используемые с подпиской Параметр Описание txn_type Тип транзакции. Возможные значения: "subscr_signup" - попдиска "subscr_cancel" - отмена подписки "subscr_failed" - попытка платежа завершилась неудачно "subscr_payment" - попытка платежа завершилась удачно "subscr_eot" - окончание цикла подписки "subscr_modify" - изменение параметров подписки subscr_date Дата подписки или отмены подписки subscr_effective Дата вступления в силу изменений параметров подписки. Передается только в случае txn_type=subscr_modify period1 Длительность первого пробного периода. "4 D" - 4 дня, "2 W" - 2 недели, "1 M" - 1 месяц, и т.п. period2 Длительность второго пробного периода. period3 Длительность основного цикла подписки. mc_amount1 Стоимость первого пробного периода. mc_amount2 Стоимость второго пробного периода. mc_amount3 Стоимость основного цикла подписки. mc_currency Валюта recurring Индикатор повторяющихся платежей. Отражает значение параметра src переданного через форму подписки reattempt Отражает значение параметра sra переданного через форму подписки recur_times Отражает значение параметра srt переданного через форму подписки retry_at В случае неудачной попытки платежа (txn_type=subscr_failed), содержит дату следующей попытки. username Автосгенерированное имя пользователя password Автосгенерированный пароль subscr_id Уникальный идентификатор подписчика Следующая таблица показывает, какие переменные передаются для различных IPN при подписке Тип транзакции Переменная Подписка Отмена подписки Изменение подписки Оплата Неудачная оплата Окончание подписки business X X X X X X receiver_email X X X X X X item_name X X X X X X item_number X X X X X X invoice X X X X X X custom X X X X X X payment_status X pending_reason X payment_date X txn_id X txn_type subscr_signup subscr_cancel subscr_modify subscr_payment subscr_failed subscr_eot mc_gross X mc_fee X mc_currency X X X X X X first_name X X X X X X last_name X X X X X X address_street X X X X address_city X X X X address_state X X X X address_zip X X X X address_country X X X X payer_email X X X X X X payer_id X X X X X X payment_type X subscr_date X X X subscr_effective X period1 X X X period2 X X X period3 X X X mc_amount1 X X X mc_amount2 X X X mc_amount3 X X X recurring X X X reattempt X X X recur_times X X X retry_at X username X X X X X X password X X X X X X subscr_id X X X X X X Примеры скриптов Приведу два примера скриптов, использующих PayPal IPN. Я ставлю своей целью не привести готовые скрипты, которые можно использовать методом copy/paste, а лишь проиллюстрировать общие принципы. В первом примере покупатель оплачивает товары, находящиеся в "корзине". После оплаты администратор сайта получает e-mail уведомление о поступлении заказа, и содержимое корзины заносится в базу данных для контроля прохождения заказа. Второй пример показывает, как можно организовать подписку на контент. Оплата товаров в "корзине" Реализацию собственно "корзины" я здесь описывать не буду. Замечу лишь, что в нашем случае сессии для хранения содержимого корзины непригодны, так как мы не сможем восстановить данные сессии в нашем IPN-скрипте. Для определености я считаю что $_COOKIE['cart_id'] содержит идентификатор корзины, по которому мы отличаем корзину одного пользователя от другого. Пусть содержимое корзины у нас хранится в базе данных MySQL, в таблице со следующей структурой: CREATE TABLE cart ( cart_id int(11), # идентификатор корзины item_id int(11), # идентификатор товара price decimal(8,2), # цена единицы товара quantity mediumint(6) # количество ); После оплаты корзина покупателя должна быть очищена, и внесены записи в таблицу заказов. Общая информация о заказах будет храниться в таблице orders CREATE TABLE orders ( order_id int(11) auto_increment, # идентификатор заказа txn_id varchar(20), # номер транзакции order_date datetime, # дата заказа order_total decimal(8,2), # общая сумма заказа email varchar(50), # e-mail покупателя first_name varchar(50), # имя покупателя last_name varchar(50), # фамилия покупателя street varchar(50), # адрес покупателя city varchar(50), # город state varchar(50), # штат zip varchar(15), # почтовый код country varchar(50) # страна PRIMARY KEY (id) ); Детали заказа будем хранить в таблице order_details CREATE TABLE order_details ( order_id int(11), # идентификатор заказа item_id int(11), # идентификатор товара price decimal(8,2), # цена единицы товара quantity mediumint(6) # количество ); Код скрипта, выводящего форму заказа (checkout) <?php // checkout.php $paypalemail = "[email protected]"; // e-mail продавца $currency = "USD"; // валюта $cart_id=intval($_COOKIE['cart_id']); /* здесь код, подключающийся к базе данных и выводящий содержимое корзины */ $r=mysql_query("SELECT sum(price*quantity) FROM cart WHERE cart_id=".$cart_id); list ($total)=mysql_fetch_row($r); mysql_free_result($r); $total=number_format($total,2); echo << FORM; ?> Передача $cart_id в поле item_number позволяет в нашем IPN-скрипте восстановить содержимое корзины. Если покупатель отменит оплату, он будет перенаправлен на http://myhost.com/payment_cancel.html. Если же он произведет оплату, он будет перенаправлен на http://myhost.com/payment_success.php, где мы проверяем, был ли осуществлен платеж, обновляем базу даных и благодарим за покупку. Код скрипта payment_success.php <?php // payment_success.php $paypalemail = "[email protected]"; // e-mail продавца $adminemail = "[email protected]"; // e-mail администратора $currency = "USD"; // валюта /******** запрашиваем подтверждение транзакции ********/ $postdata=""; foreach ($_POST as $key=>$value) $postdata.=$key."=".urlencode($value)."&"; $postdata .= "cmd=_notify-validate"; $curl = curl_init("https://www.paypal.com/cgi-bin/webscr"); curl_setopt ($curl, CURLOPT_HEADER, 0); curl_setopt ($curl, CURLOPT_POST, 1); curl_setopt ($curl, CURLOPT_POSTFIELDS, $postdata); curl_setopt ($curl, CURLOPT_SSL_VERIFYPEER, 0); curl_setopt ($curl, CURLOPT_RETURNTRANSFER, 1); curl_setopt ($curl, CURLOPT_SSL_VERIFYHOST, 1); $response = curl_exec ($curl); curl_close ($curl); if ($response != "VERIFIED") die("You should not do that ..."); /******** проверяем получателя платежа и тип транзакции, и выходим, если не наш аккаунт в $paypalemail - наш primary e-mail, поэтому проверяем receiver_email ********/ if ($_POST['receiver_email'] != $paypalemail || $_POST["txn_type"] != "web_accept") die("You should not be here ..."); /* здесь код, подключающийся к базе данных */ /******** убедимся в том, что эта транзакция не была обработана ранее ********/ $r = mysql_query("SELECT order_id FROM orders WHERE txn_id='".$_POST["txn_id"]."'"); list($duplicate) = mysql_fetch_row($r); mysql_free_result($r); if ($duplicate) die ("I feel like I met you before ..."); /******** проверяем сумму платежа ********/ $cart_id = intval($_POST['item_number']); $r = mysql_query( "SELECT sum(price*quantity), COUNT(cart_id) FROM cart WHERE cart_id=".$cart_id); list ($total,$nitems) = mysql_fetch_row($r); mysql_free_result($r); if (!$nitems) // не удалось восстановить содержимое корзины { mail($adminemail, "IPN error", "Unable to restore cart contents\r\nCart ID: ". $cart_id."\r\nTransaction ID: ".$_POST["txn_id"]); die("I cannot recall what you paid for ... Please contact ".$adminemail); } if ($total != $_POST["mc_gross"] || $_POST["mc_currency"] != $currency) { mail($adminemail, "IPN error", "Payment amount mismatch\r\nCart ID: " . $cart_id."\r\nTransaction ID: ".$_POST["txn_id"]); die("Out of money? Please contact ".$adminemail); } /******** проверки завершены. формируем заказ ********/ $order_date = date("Y-m-d H:i:s",strtotime ($_POST["payment_date"])); mysql_query("INSERT INTO orders SET txn_id = '".$_POST["txn_id"]."', order_date = '$order_date', order_total = $total, email = '".$_POST["payer_email"]."', first_name = '".mysql_escape_string($_POST["first_name"])."', last_name = '".mysql_escape_string($_POST["last_name"])."', street = '".mysql_escape_string($_POST["address_street"])."', city = '".mysql_escape_string($_POST["address_city"])."', state = '".mysql_escape_string($_POST["address_state"])."', zip = '".mysql_escape_string($_POST["address_zip"])."', country = '".mysql_escape_string($_POST["address_country"])."'" ); $order_id = mysql_insert_id(); $r = mysql_query("SELECT * FROM cart WHERE cart_id=".$cart_id); while ($row = mysql_fetch_assoc($r)) { mysql_query("INSERT INTO order_details SET order_id = $order_id, item_id = ".$row['item_id'].", price = ".$row['price'].", quantity = ".$row['quantity']); } mysql_free_result($r); mysql_query("DELETE FROM cart WHERE cart_id=".$cart_id); mail($adminemail, "New order", "New order\r\nOrder ID: ". $order_id."\r\nTransaction ID: " .$_POST["txn_id"]); /* сообщаем, что заказ принят, благодарим за покупку и предлагаем купить еще что-нибудь */ ?> Использование параметра return удобно тем, что позволяет сразу после платежа выдать результат проверки пользователю. Однако такая проверка не дает 100% уверенности в том, что деньги были действительно зачислены на наш счет. Например, если покупатель платит электронным чеком (e-check), деньги будут зачислены только после обработки чека банком, причем зачисление не гарантировано. notify-url лишен этого недостатка, так как позволяет отследить момент фактического поступления денег. В следующем примере я покажу, как можно обрабатывать повторные IPN на примере подписки на контент. Подписка на контент Функция подписки PayPal очень удобна, однако имеет существенный недостаток. Дело в том, что если подписка имеет пробный период, то пользователь может отменить подписку, пока пробный период не закончился, и подписаться снова, получив таким образом еще один пробный период, и так до бесконечности. Возможны два выхода. Первый, самый простой - вообще не использовать пробные периоды. Второй - предоставлять лишь ограниченный доступ в течение пробного периода. Также имейте в виду, что не существует механизма автоматического возврата денег при отмене подписки пользователем в середине цикла. IPN-скрипт для подписки должен обрабатывать несколько видов IPN. Это часто вызывает затруднения. Опишу подробнее различные виды IPN (txn_type) subscr_signup подписка создана. Этот IPN уведомляет лишь о подписке, но не о платеже. subscr_payment осуществлен платеж либо за пробный период (если он не бесплатный), либо за основной цикл подписки. subscr_failed попытка платежа завершилась неудачно. Этот IPN отправляется только как уведомление, обычно никаких действий при этом предпринимать не нужно. subscr_cancel подписка отменена покупателем, продавцом или автоматически (при невозможности осуществить платеж). При получении этого IPN не следует закрывать доступ пользователя к ресурсу, так как подписка может быть отменена в середине цикла, за который уже заплачено. subscr_eot окончание подписки. При получении этого IPN нужно запретить пользователю доступ к ресурсу. subscr_modify изменение параметров подписки. В большинстве случаев достаточно реализовать обработку subscr_signup, subscr_cancel, subscr_payment и subscr_eot. Пусть имеется некий ресурс, к которому мы хотим предоставить платный доступ. Оплата составляет $10 в месяц, предоставляется неделя бесплатного ограниченного доступа. Данные о подписчиках хранятся в таблице subscribers CREATE TABLE subscribers ( subscr_id varchar(20) # уникальный идентификатор подписки subscr_date datetime, # дата подписки payer_id varchar(20), # идентификатор покупателя email varchar(30), # e-mail покупателя username varchar(20), # имя пользователя passhash varchar(32), # хэш пароля limited tinyint(1) # флаг ограниченного доступа PRIMARY KEY (subscr_id) ); Скрипт, проверяющий имя пользователя и пароль, должен будет использовать поле limited, чтобы определить, следует ли предоставить пользователю полный или ограниченный доступ. Код скрипта, выводящего форму подписки <?php // subscribe.php $paypalemail = "[email protected]"; // e-mail продавца $currency = "USD"; // валюта $price = "10.00"; // стоимость подписки $trial = 1; // длительность пробного периода $trialunit = "W"; // 1 неделя echo << FORM; ?> Генерацию имени пользователя и пароля мы предоставим PayPal (usr_manage=1). После подписки, скрипт ipn.php получит IPN (txn_type=subscr_signup). При изменении статуса подписки будут отправлены дополнительные IPN, мы будем обрабатывать лишь subscr_payment и subscr_eot. Код скрипта ipn.php <?php // ipn.php $paypalemail = "[email protected]"; // e-mail продавца $adminemail = "[email protected]"; // e-mail администратора $currency = "USD"; // валюта $price = 10.00; // стоимость подписки $trial = "1 W"; // длительность пробного периода $cycle = "1 M"; // длительность основного цикла /******** запрашиваем подтверждение транзакции ********/ $postdata=""; foreach ($_POST as $key=>$value) $postdata.=$key."=".urlencode($value)."&"; $postdata.="cmd=_notify-validate"; $curl = curl_init("https://www.paypal.com/cgi-bin/webscr"); curl_setopt ($curl, CURLOPT_HEADER, 0); curl_setopt ($curl, CURLOPT_POST, 1); curl_setopt ($curl, CURLOPT_POSTFIELDS, $postdata); curl_setopt ($curl, CURLOPT_SSL_VERIFYPEER, 0); curl_setopt ($curl, CURLOPT_RETURNTRANSFER, 1); curl_setopt ($curl, CURLOPT_SSL_VERIFYHOST, 1); $response = curl_exec ($curl); curl_close ($curl); if ($response != "VERIFIED") exit; /******** проверяем получателя платежа и тип транзакции, и выходим, если не наш аккаунт или IPN не требует обработки в $paypalemail - наш primary e-mail, поэтому проверяем receiver_email ********/ if ($_POST['receiver_email'] != $paypalemail || $_POST["txn_type"] != "subscr_signup" || $_POST["txn_type"] != "subscr_eot" || $_POST["txn_type"] != "subscr_payment") exit; /* здесь код, подключающийся к базе данных */ /******** подписка ? ********/ if ($_POST["txn_type"] == "subscr_signup") { $r = mysql_query("SELECT payer_id FROM subscribers WHERE payer_id='".$_POST["payer_id"]."'"); list($duplicate) = mysql_fetch_row($r); mysql_free_result($r); if ($duplicate) exit; // повторный IPN - игнорируем if (isset($_POST["p2"]) || $_POST["mc_currency"] != $currency || $_POST["mc_amount3"] != $price || $_POST["period1"] != $trial || $_POST["period3"] != $cycle) exit; // неверные параметры подписки $subscr_date = date("Y-m-d H:i:s",strtotime ($_POST["subscr_date"])); mysql_query("INSERT INTO subscribers SET subscr_id = '".$_POST["subscr_id"]."', subscr_date = '$subscr_date', payer_id = '".$_POST["payer_id"]."', email = '".$_POST["payer_email"]."', username = '".$_POST["username"]."', passhash = '".md5($_POST["password"])."', limited = 1"); /* здесь можно отправить e-mail с именем пользователя и паролем, я этого не делаю, так как пароль сгенерирован PayPal и доступен подписчику на сайте PayPal в панели управления аккаунтом */ } /******** оплата ? ********/ elseif ($_POST["txn_type"] == "subscr_payment") { if ($_POST["mc_currency"] != $currency || ($_POST["payment_status"] != "completed" && $_POST["pending_reason"] != "intl") || $_POST["mc_gross"] != $price) exit; // после первого платежа даем полный доступ mysql_query("UPDATE subscribers SET limited=0 WHERE subscr_id='".$_POST["subscr_id"]."'"); } /******** окончание подписки ? ********/ elseif ($_POST["txn_type"] == "subscr_eot") { mysql_query("DELETE FROM subscribers WHERE subscr_id='".$_POST["subscr_id"]."'"); } ?> Заключение В заключение несколько советов Никогда не доверяйте данным, полученным IPN-скриптом, до получения ответа VERIFIED от PayPal. Храните данные об обработанных транзакциях, и после получения ответа VERIFIED проверяйте, не обрабатывалась ли эта транзакция ранее. Для всех возможных IPN определите, какие данные вы предполагаете получить. Любое несовпадение подозрительно. Не используйте для идентификации покупателей payer_email - e-mail может быть изменен. Используйте payer_id Получение txn_type=web_accept или txn_type=subscr_payment еще не означает, что вы получили оплату. Всегда проверяйте payment_status=completed. Единственное исключение: у вас неамериканский аккаунт и pending_reason=intl Ограничивайте размер передаваемого IPN-скрипту POST-запроса на уровне нескольких килобайт # httpd.conf php_admin_value post_max_size 10K В любой системе может произойти сбой, PayPal не является исключением. Если IPN-скрипт получил подозрительные данные, следует писать в лог и уведомлять администратора. Полезно также вывести форму, заполнив которую, пользователь может отправить сообщение о проблеме.
  5. научю делать сайты ан ukoz так же на иностраных системах флеш сайты .помогу и научю прикреплять домены .обучаю за 1000 рублей
  6. слухай а там вроде есть у них сервис они тебе сами все помогут настроиь . Добавлено спустя 9 минут 56 секунд: Введение При создании коммерческих сайтов встает вопрос: как принимать платежи? Одной из наиболее популярных в мире платежных систем является PayPal . Выбор этой системы часто определяется высокой надежностью, простотой открытия аккаунта и использования. Для открытия аккаунта достаточно наличия кредитной карты и/или счета в американском банке. Одним из основных недостатков часто называют очень жесткую политику безопасности. Но практика показывает, что при строгом соблюдении правил использования системы проблемы возникают редко. Я не собираюсь описывать все "за" и "против". Цель этой статьи - показать, как организовать обработку платежей для обеспечения надежности и безопасности. Сразу оговорюсь, что PayPal не открывает аккаунты жителям России (как, впрочем, и других стран бывшего СССР), но, учитывая, что многие российские программисты создают сайты для зарубежных заказчиков, тема интеграции сайта с PayPal является актуальной. Организация собственно оплаты не представляет тудностей. В этой статье я буду уделять больше внимания процессу автоматической проверки платежа с использованием IPN (Instant Payment Notification). Статья основана на собственном опыте, официальной документации PayPal и материалах независимого форума разработчиков PayPal. Виды платежей PayPal поддерживает несколько видов платежей: оплата товаров в корзине, предоставляемой PayPal. В этом случае все операции по поддержке корзины берет на себя PayPal покупка товара "в один клик", без добавления товара в корзину. Этот метод также применяется для оплаты товаров в корзине, сформированной без использования PayPal периодические платежи, или подписка (recurring billing, subscription) В статье будут рассмотрены два последних метода. Также я не рассматриваю метод, при котором корзина формируется на нашем сайте, а затем все содержимое корзины передается PayPal. Процесс оплаты Процесс оплаты очень прост: создается POST-форма с набором hidden полей, содержащих информацию о товаре (идентификатор, наименование, цена), и кнопку отправки формы. Следует отметить, что все цены должны передаваться с двумя знаками после точки. Если стоимость товара $10, то цена должна передаваться как "10.00". После отправки формы покупатель переходит на сайт paypal.com, где он завершает процесс оплаты. Данные формы должны отправляться на https://www.paypal.com/cgi-bin/webscr.'>https://www.paypal.com/cgi-bin/webscr. Покупка "в один клик" Код простейшей формы: Описание основных параметров Параметр Описание cmd Обязательный параметр. Должен иметь значение "_xclick" business Обязательный параметр - e-mail продавца item_number Идентификатор товара. Это значение не будет показано пользователю, однако будет передано вашему скрипту при подтверждении транзакции. Если вы используете PayPal для оплаты товаров из корзины, в этом поле можно передавать идентификатор корзины item_name Наименование товара, которое будет показано покупателю no_shipping Не запрашивать адрес для доставки. "1" - не запрашивать адрес, "0" - запрашивать return URL, куда покупатель будет перенаправлен после успешной оплаты. Если этот параметр не передать, покупатель останется на сайте PayPal rm Этот параметр определяет, как будет передаваться информация об успешно завершенной транзакции скрипту, указанному в параметре return. "1" - никакие параметры передаваться не будут."2" - будет использоваться метод POST. "0" - будет использоваться метод GET. По умолчанию "0". cancel_return URL, куда покупатель будет перенаправлен при отмене им оплаты . Если этот параметр не передать, покупатель останется на сайте PayPal notify_url URL, на который PayPal будет предавать информацию о транзакции (IPN). Если не передавать этот параметр, будет использоваться значение, указанное в настройках аккаунта. Если в настройках аккаунта это также не определено, IPN использоваться не будет custom Значение этого поля не участвует в процессе покупки, оно просто будет передано вашему скрипту при подверждении транзакции invoice Используется для передачи номера счета. Параметр необязательный, но если вы передаете его, он должен быть уникальным для каждой транзакции amount Сумма к оплате. Если этот параметр не передать, покупателю будет предоставлена возможность ввести сумму самостоятельно(используется для donations) currency_code Код валюты. Возможные значения: "USD","EUR","GBP","YEN","CAD". По умолчанию "USD" В таблице приведены лишь наиболее часто используемые параметры. Полный список смотрите в документации (ссылки в конце статьи). Подписка PayPal предоставляет возможность организовать подписку: со счета клиента на ваш счет будет периодически переводиться определенная сумма, причем клиент имеет возможность в любой момент отменить подписку. Вы можете задать периодичность и стоимость подписки, а также пробный период, чтобы клиент мог убедиться в качестве предоставляемых вами услуг. Пробный период может быть как платным, так и бесплатным. Пример формы: Описание основных параметров Параметр Описание cmd Обязательный параметр. Должен иметь значение "_xclick-subscriptions" business Обязательный параметр - e-mail продавца item_number Идентификатор товара. Это значение не будет показано пользователю, однако будет передано вашему скрипту при подтверждении транзакции. item_name Наименование товара, которое будет показано покупателю no_shipping Не запрашивать адрес для доставки. "1" - не запрашивать адрес, "0" - запрашивать return URL, куда покупатель будет перенаправлен после успешной оплаты. Если этот параметр не передать, покупатель останется на сайте PayPal rm Этот параметр определяет, как будет передаваться информация об успешно завершенной транзакции скрипту, указанному в параметре return. "1" - никакие параметры передаваться не будут."2" - будет использоваться метод POST. "0" - будет использоваться метод GET. По умолчанию "0". cancel_return URL, куда покупатель будет перенаправлен при отмене им оплаты . Если этот параметр не передать, покупатель останется на сайте PayPal notify_url URL, на который PayPal будет предавать информацию о транзакции (IPN). Если не передавать этот параметр, будет использоваться значение, указанное в настройках аккаунта. Если в настройках аккаунта это также не определено, IPN использоваться не будет custom Значение этого поля не участвует в процессе покупки, оно просто будет передано вашему скрипту при подверждении транзакции invoice Используется для передачи номера счета. Параметр необязательный, но если вы передаете его, он должен быть уникальным для каждой транзакции a1 Стоимость первого пробного периода. Может быть "0", в этом случае пробный период бесплатен. Если вы не предоставляете пробный период, не передавайте этот параметр p1 Длительность первого пробного периода. Если вы не предоставляете пробный период, не передавайте этот параметр t1 Единица измерения длительности первого пробного периода. Возможные значения: "D"-дни, "W"-недели, "M"-месяцы, "Y"-годы. Если вы не предоставляете пробный период, не передавайте этот параметр a2 Стоимость второго пробного периода. Если вы не предоставляете пробный период, не передавайте этот параметр p2 Длительность второго пробного периода. Если вы не предоставляете пробный период, не передавайте этот параметр t2 Единица измерения длительности второго пробного периода. Возможные значения: "D"-дни, "W"-недели, "M"-месяцы, "Y"-годы. Если вы не предоставляете пробный период, не передавайте этот параметр a3 Стоимость основного цикла подписки. Обязательный параметр p3 Длительность основного цикла подписки. Обязательный параметр t3 Единица измерения длительности основного цикла подписки. Обязательный параметр. Возможные значения: "D"-дни, "W"-недели, "M"-месяцы, "Y"-годы. src Периодические платежи. "1" - платежи будут повторяться периодически. Если параметр не передать, платеж будет произведен однократно. sra Если в этом параметре передать "1", и попытка перевода денег завершается неудачей (например при недостатке средств на счете покупателя), то будет сделано еще до 2 попыток. После 3 неудачных попыток, подписка будет автоматически отменена. Если не передать этот параметр, подписка будет автоматически отменена после первой же неудачной попытки. srt Количество циклов подписки. Если этот параметр передан, подписка будет отменена после указанного количества циклов. Если не передать этот параметр, подписка будет действовать до тех пор, пока не будет отменена покупателем (либо автоматически при ошибке транзакции) modify Возможность модификации. Возможные значения: "0" - форма предназначена только для создания новой подписки "1" - форма предназначена только для изменения параметров существующей подписки "2" - форма предназначена как для создания новой подписки, так и для изменения параметров существующей По умолчанию "0" usr_manage Автоматическая генерация имени пользователя и пароля. Передайте "1", чтобы PayPal автоматически сгенерировал имя пользователя и пароль. currency_code Код валюты. Возможные значения: "USD","EUR","GBP","YEN","CAD". По умолчанию "USD" IPN IPN (Instant Payment Notification) - это технология PayPal, позволяющая автоматизировать процесс обработки платежей. Суть ее заключается в том, что на сервере продавца создается специаальный скрипт, и при возникновении событий, имеющих отношение аккаунту продавца (таких, как платеж, отмена платежа, создание или отмена подписки, и т.д.) сервер PayPal отправляет этому скрипту IPN - POST-запрос с информацией о транзакции. Скрипт в свою очередь посылает запрос серверу PayPal для проверки транзакции. Итак, покупатель завершил оплату. С небольшой задержкой (до нескольких секунд) сервер PayPal отправляет IPN скрипту, указанному в настройках аккаунта или переданному в параметре notify_url. Грамотно написанный IPN-скрипт является ключом к обеспечению безопасности платежей. Если вы слышали о случаях обмана продавцов, использующих PayPal, можете быть уверены: либо они вообще не использовали IPN, либо у них "дырявый" IPN-скрипт В первую очередь скрипт должен убедиться в том, что он действительно был вызван сервером PayPal. Для этого он должен сформировать POST-запрос к https://www.paypal.com/cgi-bin/webscr , передав все полученные переменные без изменения с добавлением параметра cmd со значением _notify-validate. В ответ будет возвращено либо VERIFIED в случае успешной верификациии транзакции, либо INVALID в случае ошибки. В случае ответа INVALID скрипт должен завершить работу. Затем следует проверить получателя платежа, так как потенциальный злоумышленник может изменить форму, чтобы платеж был зачислен на его счет. Получатель платежа определяется по переменным business и receiver_email. Необходимость двух переменных объясняется тем, что PayPal позволяет зарегистрировать для одного аккаунта несколько адресов e-mail. E-mail, указанный при создании аккаунта, является первичным (primary email). Значением receiver_email всегда является primary email. Если платеж был отправлен на дополнительный email, то он передается через business. Если business и/или receiver_email не содержит ожидаемого значения, скрипт немедленно завершает работу. Теперь нужно проверить сумму и валюту платежа. Такая проверка необходима, так как потенциальному злоумышленнику не составляет труда изменить сумму в форме, В случае подписки, следует проверять все параметры подписки (наличие, продолжительность и стоимость пробных периодов, продолжительность и стоимость основного цикла подписки, и т.д.). IPN для одной и той же транзакции может отправляться более одного раза. Например, если платеж по какой-либо причине был задержан, первый IPN будет передан сразу после платежа. После того, как платеж будет завершен или отменен, будет отправлен второй IPN. Если ваш IPN-скрипт не вернул HTTP статус 200, PayPal повторит отправку IPN через некоторое время. Первый повтор будет через 10 секунд, затем при необходимости через 20, потом через 40, 80 и т.д.(до 24 часов). Если в течение 4 суток ожидаемый ответ от вашего скрипта не будет получен, попытки будут прекращены. Это можно использовать для того, чтобы не потерять даные о транзакции в случае возникновения ошибки в вашем IPN скрипте. Например, если скрипту не удалось подключиться к базе данных, в которой он сохраняет данные о транзакциях, он может вернуть HTTP статус 500, и IPN будет повторен позднее. Повторный IPN будет отправлен также, если IPN-скрипт не обращается к серверу PayPal для проверки транзакции. Как видно из описания параметров return, rm и notify_url, IPN может передваться двум скриптам, указанным в параметрах return и notify_url. Между ними 2 различия: IPN для return будет отправлен только однократно, непосредственно после оплаты. notify_url может вызываться несколько раз (см. предыдущий параграф). Вывод скрипта return будет показан пользователю. Заметьте, что если в выводе содержатся ссылки, то они должны быть абсолютными. Вывод скрипта notify_url в браузер пользователя не выводится. В полученых POST переменных содержится информация о транзакции. Наиболее часто используемые переменные: Параметр Описание txn_id Уникальный номер транзакции payment_date Дата платежа в формате "18:30:30 Jan 1, 2000 PST" payer_email e-mail покупателя business e-mail продавца payer_id уникальный идентификатор покупателя. Участники расчетов в PayPal идентифицируются по адресу e-mail, однако, учитывая, что имется возможность изменить e-mail, лучше для идентификации покупателя использовать payer_id item_number Идентификатор товара item_name Наименование товара txn_type Тип транзакции. Возможные значения: "web_accept" - оплата была сделана с использованием кнопки "Buy Now" "cart" - оплата была сделана с использованием встроенной корзины PayPal "send_money" - оплата была сделана с использованием функции "Send money" "reversal" - деньги были возвращены покупателю по его инициативе payment_status Состояние платежа. Возможные значения: "Completed" - транзакция завершена успешно, деньги переведены на счет продавца. В случае txn_type="reversal" означает, что деньги были возвращены на счет покупателя "Pending" - платеж задержан. Причина задержки - в переменной pending_reason. После того, как платеж будет завершен или отменен, PayPal отправит еще одно уведомление. "Failed" - платеж не прошел. Это состояние возможно только если платеж осуществялся с банковского счета "Denied" - платеж был отменен продавцом. Это состояние возникает при отмене продавцом платежа, состояние которого было Pending "Refunded" - деньги были возвращены покупателю. Это состояние возникает при отмене продавцом платежа, состояние которого было Completed pending_reason Причина задержки платежа. Возможные значения: "echeck" - оплата была сделана электронным чеком "multi_currency" - платеж был проведен в валюте, которая не указана в настройках аккаунта продавца. Платеж будет завершен после подтверждения транзакции продавцом "intl" - продавец не является жителем США. Платеж будет завершен после подтверждения транзакции продавцом "verify" - акккаунт продавца находится в состоянии "unverified". Платеж будет завершен после подтверждения личности продавца. "address" - в настройках аккаунта продавца указано, что покупатель должен указать адрес для доставки, но покупатель не указал адрес. Платеж будет завершен после подтверждения транзакции продавцом "upgrade" - платеж был сделан с кредитной карты, при этом аккаунт продавца имеет статус "Personal". Для завершения платежа продавец должен обновить аккаунт до "Business" или "Premier" "unilateral" - e-mail продавца не зарегистрирован в системе. "other" - другая причина. Продавцу следует связаться со службой поддержки для выяснения причины. payment_type Тип платежа. Возможные значения: "echeck" - оплата была сделана электронным чеком "instant" - оплата была сделана с кредитной карты, банковского счета или используя средства на PayPal аккаунте покупателя mc_gross Сумма платежа. mc_fee Сумма коммиссионных. Сумма, зачисленная на счет продавца, определяется как mc_gross–mc_fee mc_currency Валюта платежа first_name Имя покупателя. last_name Фамилия покупателя. address_street Улица address_city Город address_state Штат/Регион address_zip Почтовый индекс address_country Страна verify_sign Цифровая подпись. Используется PayPal при проверке транзакции Дополнительные переменные, используемые с подпиской Параметр Описание txn_type Тип транзакции. Возможные значения: "subscr_signup" - попдиска "subscr_cancel" - отмена подписки "subscr_failed" - попытка платежа завершилась неудачно "subscr_payment" - попытка платежа завершилась удачно "subscr_eot" - окончание цикла подписки "subscr_modify" - изменение параметров подписки subscr_date Дата подписки или отмены подписки subscr_effective Дата вступления в силу изменений параметров подписки. Передается только в случае txn_type=subscr_modify period1 Длительность первого пробного периода. "4 D" - 4 дня, "2 W" - 2 недели, "1 M" - 1 месяц, и т.п. period2 Длительность второго пробного периода. period3 Длительность основного цикла подписки. mc_amount1 Стоимость первого пробного периода. mc_amount2 Стоимость второго пробного периода. mc_amount3 Стоимость основного цикла подписки. mc_currency Валюта recurring Индикатор повторяющихся платежей. Отражает значение параметра src переданного через форму подписки reattempt Отражает значение параметра sra переданного через форму подписки recur_times Отражает значение параметра srt переданного через форму подписки retry_at В случае неудачной попытки платежа (txn_type=subscr_failed), содержит дату следующей попытки. username Автосгенерированное имя пользователя password Автосгенерированный пароль subscr_id Уникальный идентификатор подписчика Следующая таблица показывает, какие переменные передаются для различных IPN при подписке Тип транзакции Переменная Подписка Отмена подписки Изменение подписки Оплата Неудачная оплата Окончание подписки business X X X X X X receiver_email X X X X X X item_name X X X X X X item_number X X X X X X invoice X X X X X X custom X X X X X X payment_status X pending_reason X payment_date X txn_id X txn_type subscr_signup subscr_cancel subscr_modify subscr_payment subscr_failed subscr_eot mc_gross X mc_fee X mc_currency X X X X X X first_name X X X X X X last_name X X X X X X address_street X X X X address_city X X X X address_state X X X X address_zip X X X X address_country X X X X payer_email X X X X X X payer_id X X X X X X payment_type X subscr_date X X X subscr_effective X period1 X X X period2 X X X period3 X X X mc_amount1 X X X mc_amount2 X X X mc_amount3 X X X recurring X X X reattempt X X X recur_times X X X retry_at X username X X X X X X password X X X X X X subscr_id X X X X X X Примеры скриптов Приведу два примера скриптов, использующих PayPal IPN. Я ставлю своей целью не привести готовые скрипты, которые можно использовать методом copy/paste, а лишь проиллюстрировать общие принципы. В первом примере покупатель оплачивает товары, находящиеся в "корзине". После оплаты администратор сайта получает e-mail уведомление о поступлении заказа, и содержимое корзины заносится в базу данных для контроля прохождения заказа. Второй пример показывает, как можно организовать подписку на контент. Оплата товаров в "корзине" Реализацию собственно "корзины" я здесь описывать не буду. Замечу лишь, что в нашем случае сессии для хранения содержимого корзины непригодны, так как мы не сможем восстановить данные сессии в нашем IPN-скрипте. Для определености я считаю что $_COOKIE['cart_id'] содержит идентификатор корзины, по которому мы отличаем корзину одного пользователя от другого. Пусть содержимое корзины у нас хранится в базе данных MySQL, в таблице со следующей структурой: CREATE TABLE cart ( cart_id int(11), # идентификатор корзины item_id int(11), # идентификатор товара price decimal(8,2), # цена единицы товара quantity mediumint(6) # количество ); После оплаты корзина покупателя должна быть очищена, и внесены записи в таблицу заказов. Общая информация о заказах будет храниться в таблице orders CREATE TABLE orders ( order_id int(11) auto_increment, # идентификатор заказа txn_id varchar(20), # номер транзакции order_date datetime, # дата заказа order_total decimal(8,2), # общая сумма заказа email varchar(50), # e-mail покупателя first_name varchar(50), # имя покупателя last_name varchar(50), # фамилия покупателя street varchar(50), # адрес покупателя city varchar(50), # город state varchar(50), # штат zip varchar(15), # почтовый код country varchar(50) # страна PRIMARY KEY (id) ); Детали заказа будем хранить в таблице order_details CREATE TABLE order_details ( order_id int(11), # идентификатор заказа item_id int(11), # идентификатор товара price decimal(8,2), # цена единицы товара quantity mediumint(6) # количество ); Код скрипта, выводящего форму заказа (checkout) <?php // checkout.php $paypalemail = "[email protected]"; // e-mail продавца $currency = "USD"; // валюта $cart_id=intval($_COOKIE['cart_id']); /* здесь код, подключающийся к базе данных и выводящий содержимое корзины */ $r=mysql_query("SELECT sum(price*quantity) FROM cart WHERE cart_id=".$cart_id); list ($total)=mysql_fetch_row($r); mysql_free_result($r); $total=number_format($total,2); echo << FORM; ?> Передача $cart_id в поле item_number позволяет в нашем IPN-скрипте восстановить содержимое корзины. Если покупатель отменит оплату, он будет перенаправлен на http://myhost.com/payment_cancel.html. Если же он произведет оплату, он будет перенаправлен на http://myhost.com/payment_success.php, где мы проверяем, был ли осуществлен платеж, обновляем базу даных и благодарим за покупку. Код скрипта payment_success.php <?php // payment_success.php $paypalemail = "[email protected]"; // e-mail продавца $adminemail = "[email protected]"; // e-mail администратора $currency = "USD"; // валюта /******** запрашиваем подтверждение транзакции ********/ $postdata=""; foreach ($_POST as $key=>$value) $postdata.=$key."=".urlencode($value)."&"; $postdata .= "cmd=_notify-validate"; $curl = curl_init("https://www.paypal.com/cgi-bin/webscr"); curl_setopt ($curl, CURLOPT_HEADER, 0); curl_setopt ($curl, CURLOPT_POST, 1); curl_setopt ($curl, CURLOPT_POSTFIELDS, $postdata); curl_setopt ($curl, CURLOPT_SSL_VERIFYPEER, 0); curl_setopt ($curl, CURLOPT_RETURNTRANSFER, 1); curl_setopt ($curl, CURLOPT_SSL_VERIFYHOST, 1); $response = curl_exec ($curl); curl_close ($curl); if ($response != "VERIFIED") die("You should not do that ..."); /******** проверяем получателя платежа и тип транзакции, и выходим, если не наш аккаунт в $paypalemail - наш primary e-mail, поэтому проверяем receiver_email ********/ if ($_POST['receiver_email'] != $paypalemail || $_POST["txn_type"] != "web_accept") die("You should not be here ..."); /* здесь код, подключающийся к базе данных */ /******** убедимся в том, что эта транзакция не была обработана ранее ********/ $r = mysql_query("SELECT order_id FROM orders WHERE txn_id='".$_POST["txn_id"]."'"); list($duplicate) = mysql_fetch_row($r); mysql_free_result($r); if ($duplicate) die ("I feel like I met you before ..."); /******** проверяем сумму платежа ********/ $cart_id = intval($_POST['item_number']); $r = mysql_query( "SELECT sum(price*quantity), COUNT(cart_id) FROM cart WHERE cart_id=".$cart_id); list ($total,$nitems) = mysql_fetch_row($r); mysql_free_result($r); if (!$nitems) // не удалось восстановить содержимое корзины { mail($adminemail, "IPN error", "Unable to restore cart contents\r\nCart ID: ". $cart_id."\r\nTransaction ID: ".$_POST["txn_id"]); die("I cannot recall what you paid for ... Please contact ".$adminemail); } if ($total != $_POST["mc_gross"] || $_POST["mc_currency"] != $currency) { mail($adminemail, "IPN error", "Payment amount mismatch\r\nCart ID: " . $cart_id."\r\nTransaction ID: ".$_POST["txn_id"]); die("Out of money? Please contact ".$adminemail); } /******** проверки завершены. формируем заказ ********/ $order_date = date("Y-m-d H:i:s",strtotime ($_POST["payment_date"])); mysql_query("INSERT INTO orders SET txn_id = '".$_POST["txn_id"]."', order_date = '$order_date', order_total = $total, email = '".$_POST["payer_email"]."', first_name = '".mysql_escape_string($_POST["first_name"])."', last_name = '".mysql_escape_string($_POST["last_name"])."', street = '".mysql_escape_string($_POST["address_street"])."', city = '".mysql_escape_string($_POST["address_city"])."', state = '".mysql_escape_string($_POST["address_state"])."', zip = '".mysql_escape_string($_POST["address_zip"])."', country = '".mysql_escape_string($_POST["address_country"])."'" ); $order_id = mysql_insert_id(); $r = mysql_query("SELECT * FROM cart WHERE cart_id=".$cart_id); while ($row = mysql_fetch_assoc($r)) { mysql_query("INSERT INTO order_details SET order_id = $order_id, item_id = ".$row['item_id'].", price = ".$row['price'].", quantity = ".$row['quantity']); } mysql_free_result($r); mysql_query("DELETE FROM cart WHERE cart_id=".$cart_id); mail($adminemail, "New order", "New order\r\nOrder ID: ". $order_id."\r\nTransaction ID: " .$_POST["txn_id"]); /* сообщаем, что заказ принят, благодарим за покупку и предлагаем купить еще что-нибудь */ ?> Использование параметра return удобно тем, что позволяет сразу после платежа выдать результат проверки пользователю. Однако такая проверка не дает 100% уверенности в том, что деньги были действительно зачислены на наш счет. Например, если покупатель платит электронным чеком (e-check), деньги будут зачислены только после обработки чека банком, причем зачисление не гарантировано. notify-url лишен этого недостатка, так как позволяет отследить момент фактического поступления денег. В следующем примере я покажу, как можно обрабатывать повторные IPN на примере подписки на контент. Подписка на контент Функция подписки PayPal очень удобна, однако имеет существенный недостаток. Дело в том, что если подписка имеет пробный период, то пользователь может отменить подписку, пока пробный период не закончился, и подписаться снова, получив таким образом еще один пробный период, и так до бесконечности. Возможны два выхода. Первый, самый простой - вообще не использовать пробные периоды. Второй - предоставлять лишь ограниченный доступ в течение пробного периода. Также имейте в виду, что не существует механизма автоматического возврата денег при отмене подписки пользователем в середине цикла. IPN-скрипт для подписки должен обрабатывать несколько видов IPN. Это часто вызывает затруднения. Опишу подробнее различные виды IPN (txn_type) subscr_signup подписка создана. Этот IPN уведомляет лишь о подписке, но не о платеже. subscr_payment осуществлен платеж либо за пробный период (если он не бесплатный), либо за основной цикл подписки. subscr_failed попытка платежа завершилась неудачно. Этот IPN отправляется только как уведомление, обычно никаких действий при этом предпринимать не нужно. subscr_cancel подписка отменена покупателем, продавцом или автоматически (при невозможности осуществить платеж). При получении этого IPN не следует закрывать доступ пользователя к ресурсу, так как подписка может быть отменена в середине цикла, за который уже заплачено. subscr_eot окончание подписки. При получении этого IPN нужно запретить пользователю доступ к ресурсу. subscr_modify изменение параметров подписки. В большинстве случаев достаточно реализовать обработку subscr_signup, subscr_cancel, subscr_payment и subscr_eot. Пусть имеется некий ресурс, к которому мы хотим предоставить платный доступ. Оплата составляет $10 в месяц, предоставляется неделя бесплатного ограниченного доступа. Данные о подписчиках хранятся в таблице subscribers CREATE TABLE subscribers ( subscr_id varchar(20) # уникальный идентификатор подписки subscr_date datetime, # дата подписки payer_id varchar(20), # идентификатор покупателя email varchar(30), # e-mail покупателя username varchar(20), # имя пользователя passhash varchar(32), # хэш пароля limited tinyint(1) # флаг ограниченного доступа PRIMARY KEY (subscr_id) ); Скрипт, проверяющий имя пользователя и пароль, должен будет использовать поле limited, чтобы определить, следует ли предоставить пользователю полный или ограниченный доступ. Код скрипта, выводящего форму подписки <?php // subscribe.php $paypalemail = "[email protected]"; // e-mail продавца $currency = "USD"; // валюта $price = "10.00"; // стоимость подписки $trial = 1; // длительность пробного периода $trialunit = "W"; // 1 неделя echo << FORM; ?> Генерацию имени пользователя и пароля мы предоставим PayPal (usr_manage=1). После подписки, скрипт ipn.php получит IPN (txn_type=subscr_signup). При изменении статуса подписки будут отправлены дополнительные IPN, мы будем обрабатывать лишь subscr_payment и subscr_eot. Код скрипта ipn.php <?php // ipn.php $paypalemail = "[email protected]"; // e-mail продавца $adminemail = "[email protected]"; // e-mail администратора $currency = "USD"; // валюта $price = 10.00; // стоимость подписки $trial = "1 W"; // длительность пробного периода $cycle = "1 M"; // длительность основного цикла /******** запрашиваем подтверждение транзакции ********/ $postdata=""; foreach ($_POST as $key=>$value) $postdata.=$key."=".urlencode($value)."&"; $postdata.="cmd=_notify-validate"; $curl = curl_init("https://www.paypal.com/cgi-bin/webscr"); curl_setopt ($curl, CURLOPT_HEADER, 0); curl_setopt ($curl, CURLOPT_POST, 1); curl_setopt ($curl, CURLOPT_POSTFIELDS, $postdata); curl_setopt ($curl, CURLOPT_SSL_VERIFYPEER, 0); curl_setopt ($curl, CURLOPT_RETURNTRANSFER, 1); curl_setopt ($curl, CURLOPT_SSL_VERIFYHOST, 1); $response = curl_exec ($curl); curl_close ($curl); if ($response != "VERIFIED") exit; /******** проверяем получателя платежа и тип транзакции, и выходим, если не наш аккаунт или IPN не требует обработки в $paypalemail - наш primary e-mail, поэтому проверяем receiver_email ********/ if ($_POST['receiver_email'] != $paypalemail || $_POST["txn_type"] != "subscr_signup" || $_POST["txn_type"] != "subscr_eot" || $_POST["txn_type"] != "subscr_payment") exit; /* здесь код, подключающийся к базе данных */ /******** подписка ? ********/ if ($_POST["txn_type"] == "subscr_signup") { $r = mysql_query("SELECT payer_id FROM subscribers WHERE payer_id='".$_POST["payer_id"]."'"); list($duplicate) = mysql_fetch_row($r); mysql_free_result($r); if ($duplicate) exit; // повторный IPN - игнорируем if (isset($_POST["p2"]) || $_POST["mc_currency"] != $currency || $_POST["mc_amount3"] != $price || $_POST["period1"] != $trial || $_POST["period3"] != $cycle) exit; // неверные параметры подписки $subscr_date = date("Y-m-d H:i:s",strtotime ($_POST["subscr_date"])); mysql_query("INSERT INTO subscribers SET subscr_id = '".$_POST["subscr_id"]."', subscr_date = '$subscr_date', payer_id = '".$_POST["payer_id"]."', email = '".$_POST["payer_email"]."', username = '".$_POST["username"]."', passhash = '".md5($_POST["password"])."', limited = 1"); /* здесь можно отправить e-mail с именем пользователя и паролем, я этого не делаю, так как пароль сгенерирован PayPal и доступен подписчику на сайте PayPal в панели управления аккаунтом */ } /******** оплата ? ********/ elseif ($_POST["txn_type"] == "subscr_payment") { if ($_POST["mc_currency"] != $currency || ($_POST["payment_status"] != "completed" && $_POST["pending_reason"] != "intl") || $_POST["mc_gross"] != $price) exit; // после первого платежа даем полный доступ mysql_query("UPDATE subscribers SET limited=0 WHERE subscr_id='".$_POST["subscr_id"]."'"); } /******** окончание подписки ? ********/ elseif ($_POST["txn_type"] == "subscr_eot") { mysql_query("DELETE FROM subscribers WHERE subscr_id='".$_POST["subscr_id"]."'"); } ?> Заключение В заключение несколько советов Никогда не доверяйте данным, полученным IPN-скриптом, до получения ответа VERIFIED от PayPal. Храните данные об обработанных транзакциях, и после получения ответа VERIFIED проверяйте, не обрабатывалась ли эта транзакция ранее. Для всех возможных IPN определите, какие данные вы предполагаете получить. Любое несовпадение подозрительно. Не используйте для идентификации покупателей payer_email - e-mail может быть изменен. Используйте payer_id Получение txn_type=web_accept или txn_type=subscr_payment еще не означает, что вы получили оплату. Всегда проверяйте payment_status=completed. Единственное исключение: у вас неамериканский аккаунт и pending_reason=intl Ограничивайте размер передаваемого IPN-скрипту POST-запроса на уровне нескольких килобайт # httpd.conf php_admin_value post_max_size 10K В любой системе может произойти сбой, PayPal не является исключением. Если IPN-скрипт получил подозрительные данные, следует писать в лог и уведомлять администратора. Полезно также вывести форму, заполнив которую, пользователь может отправить сообщение о проблеме. Добавлено спустя 3 минуты 48 секунд: http://phpclub.ru/detail/article/paypal вот кстати здесь почитай
  7. помогу доставлять китай шмот с сингапура дешовые цены Добавлено спустя 1 минуту 12 секунд: электроника и шмотки идут от 2 до трех недель кто хочет заниматься могу заказывать за ваши денгьи Добавлено спустя 1 минуту 10 секунд: пишите есть все от солнечных батарей до ниток цены разные но гараздо дешевле чем тут Добавлено спустя 24 секунды: заказываю через инет
  8. кому нужно тот напишет Добавлено спустя 48 секунд: прошу без коментарий Добавлено спустя 1 минуту 15 секунд: продам мср606 20000тыс рубликов Добавлено спустя 3 минуты 2 секунды: плакать или смеяться будеш потом
  9. Предлагаю сервис от атак хакеров полный манеторинг сайтов от дос нападений
×
×
  • Создать...