无法在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 【问题描述】:我正在开发一个仅使用 magento 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下订单的主要内容,如果未能解决你的问题,请参考以下文章
用于 PayPal 模块的 Magento 2 REST api