Разработка сайта

Мы Makklays. Мы помогаем воплотить идею.

Подключить paypal на сайт


Makklays - Статьи image

eye 161

В последнее время всё чаще сайты развиваются именно в этом направлении, нужно что-то продать и на этом заработать для существования. Давайте рассмотрим как это можно реализовать. Допустим у нас уже есть страница с продуктами (список продуктов, описание и цены).

Кто-то может спросить, а что такое Paypal (Пейпел) ?


Paypal - это международная платформа для приема платежей со всего мира (более 2 млн. аккаунтов) в разных валютах мира. Как любая международная платформа paypal имеет собственное API для разработчиков, которые хотят использовать paypal на своем сайте (принимать, отправлять платежи, продавать продукты, организовывать подписки и всё прочее, переводы денег что предоставляет API paypal).

API paypal имеет собственную документацию с разными версиями API на английском языке и я стану претендовать на переводчика этой документации, которая время от времени обновляется (и соответственно устаревает). Минус Paypal в Украине в том, что его можно использовать только для покупки товаров в интернете, но нельзя обналичить деньги от продажи товаров, другими словами, нельзя перевести заработанные деньги от продади товаров скажем на вашу кредитную карточку. В других странах с этим проще, такая возможность есть почти во всех странах мира (Германия, Италия, Испания, Греция, США, Франция, Россия и т.д.). Полный список стран есть в документации paypal и в paypal API. Платежных платформ (e-commerce) подобной paypal в интернете множество, отличаются они только процентом, который берут себе за предоставление услуги оплаты в интернете (часть из них может быть партнером paypal).

А как вообще происходит оплата в интернете?


Оплата в интернете происходит, по большому счету, по одному и тому же набору действий. И набор этих действий такой. Пользователь выберает товар на сайте, кликает на кпопку 'Купить' на странице товара, товар добавляется в 'Корзину'. На сранице сайта 'Корзина' пользователь кликает на кнопку 'Оплатить' и здесь начиается самое интересное в онлайн оплатах в интернете (не имеет значение paypal или ligpay или ещё что-то). После клика на кнопку 'Оплатить' пользователь, как правило в интернет-магазинах, переходит на страницу выбора платформы с помощью которой он будет оплачивать товар. Выбрав paypal из списка предложенных платформ для оплаты платежей, пользователь переходит на страницу данной платформы (сайт paypal если пользователь выбрал его платформу), где заполняет обязательные поля для оплаты и отправляет форму кликнув на кнопку 'Оплатить'. После отправки формы на сайте платформы платежей (собственно оплаты) его перебрасывает (редиректит) обратно на страницу сайта с информацией об успешной оплате товара и возможно дополнительной информацией о товаре/продукте от сайта (сроки доставки товара, линк для перехода к приобретённой услуге / продукту, период который данный товар / продукт доступен для пользователя и т.д. ) Так в целом выглядит процес покупки или процес оплаты товара в интернете. Далее пользователь ожидает доставку товара (очки VR, планшет, телефон) или получает доступ и пользуется преобретённым продуктом (совет психолога, персональный гороскоп). Поздравляем! Вы произвили покупку в интернете!

Всё проще, чем в шутливом рассказе "Что было бы, если бы программисты строили дома"

Checkout (Оформление заказа) - добавим кнопку PayPal


Зарегистрируемся на developer.paypal.com и рассмотрим пункт Checkout (Оформление заказа) с добавлением кнопки PayPal на страницу продукта.
Как кнопка работает? Описано в шагах:
- Добавляем кнопку PayPal для оплаты на веб-страницу продукта.
- Покупатель нажимает кнопку.
- Кнопка вызывает API Orders PayPal для настройки транзакции (для продвинутых программистов можно настроить детальнее обработку на сервере вашего сайта, но об этом далее).
- Кнопка запускает PayPal Checkout.
- Покупатель подтверждает оплату.
- Кнопка вызывает API Orders PayPal для завершения транзакции (также для продвинутых програмистов).
- Вы показываете подтверждение покупки покупателю (сообщение или страница об успешной покупке).

Что нужно для добавления кнопки?
Нам нужно добавить следующий код:


< head >
< !-- Ensures optimal rendering on mobile devices. -- >
< meta name="viewport" content="width=device-width, initial-scale=1" />
< !-- Optimal Internet Explorer compatibility -- >
< meta http-equiv="X-UA-Compatible" content="IE=edge" />
< / head >

< script src="https://www.paypal.com/sdk/js?client-id=SB_CLIENT_ID"> / / Обязательно. замените SB_CLIENT_ID на ваш sandbox client ID (песочница) или на live client ID (для продакшен сервера).
< / script>
< div id="paypal-button-container">< / div>
< script>
/ / добавьте ваш client ID и secret
var PAYPAL_CLIENT = 'PAYPAL_LIVE_CLIENT'; // указать ваши PAYPAL_LIVE_CLIENT значения для продакшен.
var PAYPAL_SECRET = 'PAYPAL_LIVE_SECRET'; // указать ваши PAYPAL_LIVE_SECRET значения для продакшен.

/ / Направьте свой сервер на PayPal API
var PAYPAL_ORDER_API = 'https://api.paypal.com/v2/checkout/orders/';

paypal.Buttons({
createOrder: function(data, actions) {
/ / Эта функция настраивает детали транзакции, включая сумму и детали товаров.
return actions.order.create({
purchase_units: [{
description: "Some description",
amount: {
currency_code: "USD",
value: '300.00'
},
items: [{
name: "Product 1",
description: "Description of product",
sku: "gol-1253",
unit_amount: {
currency_code: "USD",
value: "100.00"
},
quantity: "1"
}, {
name: "Product 2",
description: "Description for Product 2 ba-bla-bla",
sku: "loh-5321",
unit_amount: {
currency_code: "USD",
value: "40.00"
},
quantity: "5"
}
],
}]
});
},
onApprove: function(data, actions) {
/ / This function captures the funds from the transaction.
return actions.order.capture().then(function(details) {
/ / This function shows a transaction success message to your buyer.
alert('Transaction completed by ' + details.payer.name.given_name);
});
}
}).render('#paypal-button-container');
< / script>


Закоментированный код javascript является примером того так можно организовать добавление нескольких товаров.

Если используете и тестируете только в песочнице, то стоит убрать строки:

/ / добавьте ваш client ID и secret
var PAYPAL_CLIENT = 'PAYPAL_LIVE_CLIENT'; / / указать ваши PAYPAL_LIVE_CLIENT значения для продакшен.
var PAYPAL_SECRET = 'PAYPAL_LIVE_SECRET'; / / указать ваши PAYPAL_LIVE_SECRET значения для продакшен.
/ / Направьте свой сервер на PayPal API
var PAYPAL_ORDER_API = 'https://api.paypal.com/v2/checkout/orders/';

Вот собственно и всё, что нужно для добавления кнопки (формы) оплаты PayPal на сайте.
Поздравляю! Вы справились с добавлением на сайт оплаты PayPal.

Для дизайна и общего интереса можно посмотреть на предоставляемый PayPal интерактивный дизан кнопок на странице:
https://www.paypal.com/buttons/smart

Мы изучили подключение оплаты с помощью кнопки paypal. Если Вам этого мало и Вы хотите разобраться, например, как работает выставление счёта PayPal - тогда двигаемся дальше.

Invoicing PayPal - Выставление счёта PayPal


Итак, как продавец, Вы можете использовать PayPal API выставления счетов для того, чтобы сделать счёт и отправить счёт с данными по email покупателю.

Вернемся к нашей странице со списком продуктов и попробуем разобраться с документацией paypal и PayPal API. Для этого зарегистрируемся на сайте paypal при регистрации выбераем аккаунт 'корпоративный' его ещё иногда называют 'бизнес' (так как мы будем предоставлять товары и услуги для продажи), а не 'личный' (который выбирают только для покупок в интернете на международных сайтах). Проверяем вводимые данные, которые после нас проверит PayPal через несколько месяцев или недель, и если указанные данные будут не корректны - аккаунт может быть заблокирован, об этом тоже нужно помнить при регистрации.

После регистрации у нас появляется возможность читать документацию paypal API, а самое главное, Вы преобретаете Ваш персональный ID (token) который Вам предоставляет Paypal для того, чтобы знать что Вы - это Вы. Предоставленный вам ID token является уникальным. В кратце, документация API Paypal описывает набор полей, которые передаются от Вашего сайта к сайту paypal и обратно (от сайта paypal к Вашему сайту) в процесе оплаты, а также несколько правил и возможность использовать 3D secure для безопасности проведения платежей в интернете. Ибо да, мы забыли о хакерах! Которые никуда не исчезают. Ежегодно от действий хакеров, которые воруют деньги в интернете, страдает множество сайтов. Если Вы программист - помните об этом при разработке любого Вашего кода, не забывайте защищать Ваш код от зловредных действий и тестировать код на безопасность его использования в интернете.

После регистрации на сайте paypal как разработчик, переходим в аккаунт разработчика по адресу developer.paypal.com и из представленных нам 6 услуг, нас будет интересовать пока только одна Invoicing (Счета). Именно Invoicing (Выставление счетов) нужно для того, чтобы нам, как продавцу сделать счёт-фактуру и выставить его покупателю для оплаты. А поможет нам в этом Invoicing API paypal .
Как это работает? По следущим шагам:
1. Продавец делает счёт
2. Отправляет ссылку на счёт в электронном письме покупатетелю
3. Покупатель нажимает на счёт-фактуру в электронном письме
4. Покупатель осуществляет безопастную оплату с помощью кредитной карты, дебетовой карты, PayPal или PayPal Credit.

Рассмотрим простую интерцию с версией 2 ( PayPal v2 ) (версия вступила в силу c апреля 2019 года) чтобы сделать и отправить счёт-фактуру по email, рассмотрим минимум необходимых шагов для этого:

1. Перед тем как мы начнем делать счёт-фактуры нам нужно настроить рабочее окружение, настроить песочницу для тестирования нашей работы с REST PayPal API и конечно же получить token - наш уникальный идентификатор в REST PayPal API. Для этого мы зарегистрировались на сайте paypal c аккаунтом 'корпоративный' и сделали в песочнице тестовый APP и тестовые аккаунты. Теперь, когда у нас есть token, двигаемся дальше.

2. Делаем счет фактуру. То есть отправляем JSON запрос на url песочницы с нашими данными описывающие заказ товара и проверенным при регистрации email адресом (получателя платежа). Запрос отправляем с token на url https://api.sandbox.paypal.com/v2/invoicing/ (песочница)
Пример отправляемого JSON запроса:


{
"detail": {
"invoice_number": "#12345",
"reference": "deal-ref",
"currency_code": "USD",
"note": "Thank you for your business.",
"term": "No refunds after 30 days.",
"memo": "This is a long contract",
"payment_term": {
"term_type": "NET_10"
}
},
"invoicer": {
"name": {
"given_name": "David",
"surname": "Larusso"
},
"address": {
"address_line_1": "1234 First Street",
"admin_area_2": "Anytown",
"admin_area_1": "CA",
"postal_code": "98765",
"country_code": "US"
},
"phones": [{
"country_code": "001",
"national_number": "4085551234",
"phone_type": "MOBILE"
}],
"website": "www.test.com",
"tax_id": "ABcNkWSfb5ICTt73nD3QON1fnnpgNKBy- Jb5SeuGj185MNNw6g",
"logo_url": "https://example.com/logo.png",
"additional_notes": "2-4"
},
"primary_recipients": [{
"billing_info": {
"name": {
"given_name": "Stephanie",
"surname": "Meyers"
},
"address": {
"address_line_1": "1234 Main Street",
"admin_area_2": "Anytown",
"admin_area_1": "CA",
"postal_code": "98765",
"country_code": "US"
},
"email_address": "bill-me@example.com",
"phones": [{
"country_code": "001",
"national_number": "4884551234",
"phone_type": "HOME"
}],
"additional_info_value": "add-info"
},
"shipping_info": {
"name": {
"given_name": "Stephanie",
"surname": "Meyers"
},
"address": {
"address_line_1": "1234 Main Street",
"admin_area_2": "Anytown",
"admin_area_1": "CA",
"postal_code": "98765",
"country_code": "US"
}
}
}],
"items": [{
"name": "Yoga Mat",
"description": "Elastic mat to practice yoga.",
"quantity": "1",
"unit_amount": {
"currency_code": "USD",
"value": "50.00"
},
"tax": {
"name": "Sales Tax",
"percent": "7.25"
},
"discount": {
"percent": "5"
},
"unit_of_measure": "QUANTITY"
}, {
"name": "Yoga t-shirt",
"quantity": "1",
"unit_amount": {
"currency_code": "USD",
"value": "10.00"
},
"tax": {
"name": "Sales Tax",
"percent": "7.25"
},
"discount": {
"amount": {
"currency_code": "USD",
"value": "5.00"
}
},
"unit_of_measure": "QUANTITY"
}],
"configuration": {
"partial_payment": {
"allow_partial_payment": true,
"minimum_amount_due": {
"currency_code": "USD",
"value": "20.00"
}
},
"allow_tip": true,
"tax_calculated_after_discount": true,
"tax_inclusive": false
},
"amount": {
"breakdown": {
"custom": {
"label": "Packing Charges",
"amount": {
"currency_code": "USD",
"value": "10.00"
}
},
"shipping": {
"amount": {
"currency_code": "USD",
"value": "10.00"
},
"tax": {
"name": "Sales Tax",
"percent": "7.25"
}
},
"discount": {
"invoice_discount": {
"percent": "5"
}
}
}
}
}

Успешный запрос вернет HTTP 201 Created статус и JSON c деталями о счёте-фактуре.
Пример ответа JSON:

{
"id": "INV2-PXSC-LFZ3-FDAX-HR3E",
"status": "DRAFT",
"detail": {
"reference": "deal-ref",
"currency_code": "USD",
"note": "Thank you for your business.",
"memo": "This is a long contract",
"additional_data": "2-4",
"category_code": "SHIPPABLE",
"invoice_number": "#12345",
"invoice_date": "2020-01-28",
"payment_term": {
"term_type": "NET_10",
"due_date": "2020-02-07"
},
"viewed_by_recipient": false,
"metadata": {
"create_time": "2020-01-28T20:54:48Z",
"last_update_time": "2020-01-28T20:54:48Z",
"created_by_flow": "REGULAR_SINGLE",
"recipient_view_url": "https://www.sandbox.paypal.com/invoice/p/#PXSCLFZ3FDAXHR3E",
"invoicer_view_url": "https://www.sandbox.paypal.com/invoice/details/INV2-PXSC-LFZ3-FDAX-HR3E"
},
"archived": false
},
"invoicer": {
"name": {
"given_name": "David",
"surname": "Larusso",
"full_name": "David Larusso"
},
"address": {
"address_line_1": "1234 First Street",
"admin_area_2": "Anytown",
"admin_area_1": "CA",
"postal_code": "98765",
"country_code": "US"
},
"phones": [{
"country_code": "001",
"national_number": "4085551234",
"phone_type": "MOBILE"
}],
"website": "www.test.com",
"tax_id": "ABcNkWSfb5ICTt73nD3QON1fnnpgNKBy- Jb5SeuGj185MNNw6g",
"additional_notes": "2-4",
"logo_url": "https://example.com/logo.png"
},
"primary_recipients": [{
"billing_info": {
"name": {
"given_name": "Stephanie",
"surname": "Meyers",
"full_name": "Stephanie Meyers"
},
"address": {
"address_line_1": "1234 Main Street",
"admin_area_2": "Anytown",
"admin_area_1": "CA",
"postal_code": "98765",
"country_code": "US"
},
"email_address": "bill-me@example.com"
},
"shipping_info": {
"name": {
"given_name": "Stephanie",
"surname": "Meyers",
"full_name": "Stephanie Meyers"
},
"address": {
"address_line_1": "1234 Main Street",
"admin_area_2": "Anytown",
"admin_area_1": "CA",
"postal_code": "98765",
"country_code": "US"
}
}
}],
"items": [{
"id": "ITEM-97V00660JE381301E",
"name": "Yoga Mat",
"description": "Elastic mat to practice yoga.",
"quantity": "1",
"unit_amount": {
"currency_code": "USD",
"value": "50.00"
},
"tax": {
"id": "TAX-7FC79953CG799523R",
"name": "Sales Tax",
"percent": "7.25",
"amount": {
"currency_code": "USD",
"value": "3.27"
}
},
"discount": {
"percent": "5",
"amount": {
"currency_code": "USD",
"value": "-2.50"
}
},
"unit_of_measure": "QUANTITY"
}, {
"id": "ITEM-9NY92987V15309140",
"name": "Yoga t-shirt",
"quantity": "1",
"unit_amount": {
"currency_code": "USD",
"value": "10.00"
},
"tax": {
"id": "TAX-7FC79953CG799523R",
"name": "Sales Tax",
"percent": "7.25",
"amount": {
"currency_code": "USD",
"value": "0.34"
}
},
"discount": {
"amount": {
"currency_code": "USD",
"value": "-5.00"
}
},
"unit_of_measure": "QUANTITY"
}],
"configuration": {
"tax_calculated_after_discount": true,
"tax_inclusive": false,
"allow_tip": true,
"partial_payment": {
"allow_partial_payment": true,
"minimum_amount_due": {
"currency_code": "USD",
"value": "20.00"
}
},
"template_id": "TEMP-2DD658352B363453P"
},
"amount": {
"breakdown": {
"item_total": {
"currency_code": "USD",
"value": "60.00"
},
"discount": {
"invoice_discount": {
"percent": "5",
"amount": {
"currency_code": "USD",
"value": "-2.63"
}
},
"item_discount": {
"currency_code": "USD",
"value": "-7.50"
}
},
"tax_total": {
"currency_code": "USD",
"value": "4.34"
},
"shipping": {
"amount": {
"currency_code": "USD",
"value": "10.00"
},
"tax": {
"id": "TAX-128425447T036552L",
"name": "Sales Tax",
"percent": "7.25",
"amount": {
"currency_code": "USD",
"value": "0.73"
}
}
},
"custom": {
"label": "Packing Charges",
"amount": {
"currency_code": "USD",
"value": "10.00"
}
}
},
"currency_code": "USD",
"value": "74.21"
},
"due_amount": {
"currency_code": "USD",
"value": "74.21"
},
"links": [{
"href": "https://api.sandbox.paypal.com/v2/invoicing/invoices/INV2-PXSC-LFZ3-FDAX-HR3E",
"rel": "self",
"method": "GET"
}, {
"href": "https://api.sandbox.paypal.com/v2/invoicing/invoices/INV2-PXSC-LFZ3-FDAX-HR3E/send",
"rel": "send",
"method": "POST"
}, {
"href": "https://api.sandbox.paypal.com/v2/invoicing/invoices/INV2-PXSC-LFZ3-FDAX-HR3E",
"rel": "replace",
"method": "PUT"
}, {
"href": "https://api.sandbox.paypal.com/v2/invoicing/invoices/INV2-PXSC-LFZ3-FDAX-HR3E",
"rel": "delete",
"method": "DELETE"
}, {
"href": "https://api.sandbox.paypal.com/v2/invoicing/invoices/INV2-PXSC-LFZ3-FDAX-HR3E/payments",
"rel": "record-payment",
"method": "POST"
}]
}

3. Отправка счёта
После того как вы отправляете счёт Вашему покупателю, счёт перемещается в кредиторскую задолженость и происходит следующие:
- Вы и ваш клиент получите уведомление по email.
- Статус счета обновляется до SENT (Отправлен).
- Клиент видит счет-фактуру с кнопкой онлайн-оплаты.

Пример запроса, который отправляет счёт покупателю (не забываем про token):

curl -v -X POST \
https://api.sandbox.paypal.com/v2/invoicing/invoices/INV2-Z56S-5LLA-Q52L-CPZ5/send \
-H "Content-Type: application/json" \
-H "Authorization: Bearer Access-Token"

Успешный запрос вернет HTTP 200 OK статус кода без JSON в ответе.

Для перехода в продакшен (live) версию используйте соответственно продакшен live урлы, замените https://api.sandbox.paypal.com/v2/ на https://api.paypal.com/v2/...

Вот собственно и всё. Мы рассмотрели простой способ отправки счёт-фактуры для оплаты PayPal (выставление счёта).
Поздравляю! Вы умеете высталять и отправлять счёт-фактуру PayPal покупателям.

Продолжение следует...

Автор: Александр Кузив и инфо из интернета)