【问题标题】:Not able to place the order using paypal in magento 2 rest无法在magento 2 rest中使用paypal下订单
【发布时间】: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。您应该使用它来下订单...否则您的客户可能会尝试通过对您的应用进行逆向工程来欺骗付款。

标签: php rest cordova paypal magento2


【解决方案1】:

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

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

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

【讨论】:

  • 嗨,Manish 有关于您的文章的消息吗?
  • 谢谢!。你有准备好使用代码的 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 相同,这允许检查付款,这将返回成功且不需要重定向,但不是付款参考,只是操作令牌。

    【讨论】:

      猜你喜欢
      • 2014-02-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-28
      • 2019-02-19
      • 1970-01-01
      • 2020-07-23
      • 1970-01-01
      相关资源
      最近更新 更多