Невозможно разместить заказ, используя paypal в magento 2 rest

Я разрабатываю мобильное приложение электронной коммерции, используя только magento 2 rest apis. Это поток для вызова API REST для размещения заказов.

1.Create a cart

api -> {{url}}/index.php/rest/V1/carts/mine

Этот api вернет уникальный идентификатор корзины

2.Add products to cart

api -> {{url}}/index.php/rest/V1/carts/mine/items

тело ->

 { "cart_item": { "quote_id": cartId, "sku": skuName, "qty": 1 } } 

3. Estimate Shipping Methods

url -> {{url}}/index.php/rest/V1/carts/mine/estimate-shipping-methods

тело ->

 { "address": { "region": "Trivandrum", "region_id": 12, "region_code": "CA", "country_id": "IN", "street": [ "Amstor house", "Eramam" ], "telephone": "5656565454", "postcode": "670390", "city": "Kazhakuttam", "firstname": "Peter", "lastname": "K", "same_as_billing": 0, "save_in_address_book": 0 } } 

Это вернет все возможные методы доставки, основанные на адресе доставки. В моем случае результат

 [ { "carrier_code": "freeshipping", "method_code": "freeshipping", "carrier_title": "Free Shipping", "method_title": "Free", "amount": 0, "base_amount": 0, "available": true, "error_message": "", "price_excl_tax": 0, "price_incl_tax": 0 } ] 

4)Save shipping information

url -> {{url}}/index.php/rest/V1/carts/mine/shipping-information

данные тела ->

 { "addressInformation": { "shipping_address": { "region": "Trivandrum", "region_id": 12, "region_code": "CA", "country_id": "IN", "street": [ "Amstor house", "Eramam" ], "telephone": "5656565454", "postcode": "670390", "city": "Kazhakuttam", "firstname": "Peter", "lastname": "K", }, "billing_address": { "region": "Trivandrum", "region_id": 12, "region_code": "CA", "country_id": "IN", "street": [ "Amstor house", "Eramam" ], "telephone": "5656565454", "postcode": "670390", "city": "Kazhakuttam", "firstname": "Peter", "lastname": "K", }, "shipping_method_code": "freeshipping", "shipping_carrier_code": "freeshipping" } } 

Это вернет все возможные способы оплаты. Здесь я использую paypal_express для оплаты.

5. Payment using paypal plugin

Здесь я буду платить сумму, используя плагин paypal cordova. Также настроил IPN [{{url}} / paypal / ipn /] в учетной записи PayPal

Этот api вернет следующие данные,

 { "client": { "environment": "sandbox", "paypal_sdk_version": "2.14.4", "platform": "Android", "product_name": "PayPal-Android-SDK" }, "response": { "create_time": "2016-11-19T05:25:46Z", "id": "PAY-5VS11410F5341972MLAX6ETA", "intent": "sale", "state": "approved" }, "response_type": "payment" } 

5.Save payment and place order

url -> {{url}}/index.php/rest/V1/carts/mine/payment-information

данные ->

 { "cartId": 3, "billingAddress‌​": { "region": "Trivandrum", "region_id": 12, "region_code": "CA", "country_id": "IN", "street": [ "Amstor house", "Eramam" ], "telephone": "5656565454", "postcode": "670390", "city": "Kazhakuttam", "firstname": "Peter", "lastname": "K" }, "paymentMethod": { "method": "paypal_express" } } 

Но этот api вернется

 { "message": "PayPal gateway has rejected request. Invalid token (#10410: Invalid token)." } 

Есть ли какой-либо api, отсутствующий в вышеуказанном потоке для сбора платежей. Пожалуйста, помогите мне.

Метод оплаты Paypal Express не поддерживает онлайн-захват. Невозможно получить поток создания полного заказа, например, в Checkout через интерфейс API Magento. Невозможно изменить состояние заказа и оплатить процесс. В качестве обходного решения попробуйте следующее:

  1. Создание пользовательского способа оплаты
  2. Включить только API REST (не на странице проверки веб-сайта)
  3. При совершении платежа с использованием rest api используйте этот метод (после успешной оплаты с помощью SDK для Android android / ios)
  4. После размещения заказа выполните отправку идентификатора транзакции (PAY-xxxxx) с помощью платежа paypal sdk, чтобы сохранить trasaction. (Сообщите серверной стороне tio об этом вызове).

Я пишу полную статью об этом шаг за шагом. Я сообщу вам, когда это будет сделано.

В случае, если кто-то все еще ищет решение.

В то время, когда я отвечаю на это, вам нужно будет создать модуль Magento 2 для обработки идентификатора платежа.

После того, как вы получите ответ из примера SDK Paypal android.

Ниже представлен формат JSON, который вы можете отправить конечной точке Magento:

  • для зарегистрированного пользователя: PUT / V1 / carts / mine / order
  • для гостей: PUT / V1 / гостевые тележки /: cartId / order

Ссылка: http://devdocs.magento.com/swagger

«Paypal_express_payment_payload» – это просто настраиваемый атрибут для хранения ответа на платеж PayPal ранее от SDK android.

 { "paymentMethod": { "method": "paypal_express", "additional_data": { "paypal_express_payment_payload": "{\"create_time\":\"2017-06-15T23:13:52Z\",\"id\":\"PAY-2LB41725NU654612TLFBRIUQ\",\"intent\":\"sale\",\"state\":\"approved\"}" } } } 

Для обработки данных «paypal_express_payment_payload» вы можете реализовать Interceptor в своем модуле Magento 2:

di.xml

 <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd"> <type name="Magento\Paypal\Model\Express"> <plugin name="mymodule_magento_paypal_model_express_plugin" type="Mycompanyorpersonal\Mymodule\Plugin\Paypal\Model\Express" sortOrder="99999" disabled="false" /> </type> </config> 

Mycompanyorpersonal \ MyModule \ Plugin \ Paypal \ Model \ Express.php

Вы можете найти полные коды PHP в моем следующем виде: https://gist.github.com/feelinc/de817030e00adc7ff7001de1807c1835