无法在magento 2 rest中使用paypal下订单

Posted

技术标签:

【中文标题】无法在magento 2 rest中使用paypal下订单【英文标题】:Not able to place the order using paypal in magento 2 rest 【发布时间】:2017-04-30 16:38:30 【问题描述】:

我正在开发一个仅使用 ma​​gento 2 rest api 的电子商务 mobiloe 应用程序。这是为下订单进行 REST API 调用的流程。

1.Create a cart

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

此 api 将返回一个唯一的购物车 id

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/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/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 plugin支付金额。还在paypal帐户中配置了IPN [url/paypal/ipn/]

这个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/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 将在收到付款后发送 IPN。您应该使用它来下订单...否则您的客户可能会尝试通过对您的应用进行逆向工程来欺骗付款。 【参考方案1】:

Paypal Express 付款方式不支持在线捕获。没有办法像通过 Magento API 接口在 Checkout 上那样获得完整的订单创建流程。无法更改订单状态和处理付款。作为一种解决方法,请尝试以下方法:

    创建自定义付款方式 仅启用 REST API(不在网站结帐页面上) 使用rest api支付时使用此方法(使用android/ios SDK成功支付后) 下订单后,通过 paypal sdk 付款返回发送交易 id(PAY-xxxxx) 以保存交易。(告诉您的服务器端执行此调用)。

我正在逐步撰写有关此内容的完整文章。完成后我会通知你。

【讨论】:

嗨,Manish 有关于您的文章的消息吗? 你可以在这里找到:ipragmatech.com/validate-payment-paypal-magento-rest-api 谢谢!。你有准备好使用代码的 github 存储库吗? 当然,我们会在周末添加这个。或给我发邮件 manish.kumar@ipragmatech.com 以便我将代码发送给您。【参考方案2】:

如果有人仍在寻找解决方案。

在我回答这个问题时,您需要创建一个 Magento 2 模块来处理付款 ID。

收到来自 Paypal android SDK 示例的响应后。

以下是您可以发送到 Magento 端点的 JSON 格式:

对于已登录的用户:PUT /V1/carts/mine/order 为客人:PUT /V1/guest-carts/:cartId/order

参考:http://devdocs.magento.com/swagger

“paypal_express_payment_payload”只是一个自定义属性,用于保存之前来自 android SDK 的 paypal 支付响应。


    "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”数据,您可以在 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

【讨论】:

【参考方案3】:

如果您使用以下内容运行后查询,请将 runPostQuery 替换为您的 curl 请求。这会将一个已经成功的令牌传递给magento 2。

 $payment['paymentMethod'] = ['method' =>'paypal_express',
               'additional_data' => array (
                   'paypal_express_checkout_token' => $request->query->get('token'),
                   'paypal_express_checkout_redirect_required' => false,
                   'paypal_express_checkout_payer_id' => $request->query->get('PayerID')
               )];


           $completedPayment = $this->runPostQuery('carts/mine/payment-information', $headers, json_encode($payment));

您需要创建一个插件来将最后一个交易ID添加到付款中,请参阅上面的注释,但是上面的payload到payment-information将允许您通过Paypal\Model\Express.php中的_placeOrder函数

paypal_express_checkout_token 是从 paypal 传回浏览器的令牌,与 PayerId 相同,这允许检查付款,这将返回成功且不需要重定向,但不是付款参考,只是操作令牌。

【讨论】:

以上是关于无法在magento 2 rest中使用paypal下订单的主要内容,如果未能解决你的问题,请参考以下文章

Magento 2 REST API

用于 PayPal 模块的 Magento 2 REST api

Magento 2 REST API入门

如何在 Magento 中使用 REST API 获取产品信息

REST 资源在 magento 中不可用

Magento 2 FPC 在库存更新后完全清除(REST API)