在OpenCart中实现手动Checkout API

时间:2014-11-11 02:44:53

标签: php api opencart

我目前正在为OpenCart开发提交订单API。此API的目的不是针对OpenCart的网页部分,而是针对我们的移动应用与OpenCart进行交互。

根据我的研究,似乎有两种方式提交订单:

方法一:

在OpenCart网页上,当您想要实际提交订单时,您需要完成以下工作流程:

  1. 通过checkout/cart/add

  2. 将商品添加到购物车
  3. 通过checkout/payment_address/validate输入payment_address

  4. 通过checkout/shipping_address/validate输入shipping_address

  5. 通过checkout/shipping_method/validate

  6. 输入送货方式
  7. 通过checkout/payment_method/validate

  8. 输入付款方式
  9. 通过确认/提交订单(我不知道实际要求提交订单的网址)。

  10. 这种方法的好处似乎是,鉴于客户已登录的条件,并且有一个API可以将商品添加到购物车,我们需要完成在URL中手动将产品添加到购物车的步骤。您还可以在payment_address和shipping_address中使用existing等字符串来表示现有地址(因此您无需在网址中手动输入任何内容)。

    方法二:

    使用checkout/manual。但是,此方法需要完全手动设置所有内容的输入:

    1. STORE_ID

    2. CUSTOMER_ID

    3. customer_group_id

    4. payment_country_id

    5. payment_zone_id

    6. payment_country_id

    7. order_product []

    8. order_voucher

    9. SHIPPING_METHOD []

    10. ORDER_TOTAL [contains keys such as code, title, text, value, and sort_order]

    11. 付款[]

    12. 可能错过了什么......

    13. checkout / manual的使用似乎是满足我们需求的API,我特别喜欢它会在请求不成功时返回警告/错误消息 - 但是,第一种方法允许客户拥有考虑到他们已登录的条件(我知道存在cart->clear()和{{1}的代码),将产品添加到购物车并访问现有变量(如shipping_address,payment_address等)的界面如果用户已登录)。

      我的问题是 - 有没有人曾经实施过手动检查?你是如何实现它的?

      更新

      目前正在编写一个脚本,将一些虚拟输入发送到customer->logout()

      checkout/manual

      但是,返回数据是:

      public function submit() { # Our new data $data = array( "store_id" => 0, "customer" => "My Name", "customer_id" => 1, "customer_group_id" => 1, "payment_country_id" => 223, "payment_zone_id" => 3663, "order_product[0][product_id]" => 1791, "order_product[0][quantity]" => 1, "order_product[0][price]" => 5.01, "order_total[0][code]" => "sub_total", "order_total[0][title]" => "Sub-Total", "order_total[0][text]" => "$5.01", "order_total[0][value]" => 5.01, "order_total[0][sort_order]" => 1, "order_total[1][code]" => "total", "order_total[1][title]" => "Total", "order_total[1][text]" => "$5.01", "order_total[1][value]" => 5.01, "order_total[1][sort_order]" => 9, "payment_firstname" => "My", "payment_lastname" => "Name", "payment_company" => "SomeCompany", "payment_address_1" => "#123 1234 NameOf street", "payment_address_2" => "", "payment_postcode" => "12345", "payment_city" => "New York", "shipping_firstname" => "My", "shipping_lastname" => "Name", "shipping_company" => "SomeCompany", "shipping_address_1" => "#123 1234 NameOf street", "shipping_address_2" => "", "shipping_postcode" => "12345", "shipping_city" => "New York", "shipping" => "free.free", "shipping_method" => "Free Shipping", "shipping_code" => "free.free", "shipping_country_id" => 223, "shipping_zone_id" => 3663, "payment" => "cod", "payment_method" => "Cash On Delivery", "payment_code" => "cod", "order_status_id" => 1 ); # Create a connection $url = HTTP_SERVER . 'index.php?route=checkout/manual'; $ch = curl_init($url); # Form data string $postString = http_build_query($data, '', '&'); # Setting our options curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $postString); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); # Get the response $response = curl_exec($ch); echo $response; curl_close($ch); }

      更新2

      由于在调用{"error":{"warning":"You do not have permission to access this page, please refer to your system administrator."}}时我无法满足这两个条件,因此抛出了错误:checkout/manual

      我暂时将其替换为$this->user->isLogged() && $this->user->hasPermission('modify', 'sale/order'),因此我可以随时手动添加订单。

      使用我的输入参数,我确实得到了这个JSON:

      true但是,检查管理订单列表时,系统似乎没有添加新订单。

      更新3

      尽管能够创建订单,但我不知道如何提交订单。

1 个答案:

答案 0 :(得分:0)

首先,注释掉代码$this->user->isLogged() && $this->user->hasPermission('modify', 'sale/order')是危险的。而是将某种覆盖添加到引用$this->request->post['customer_id']的部分,以便您根据实际的客户ID设置发布数据。如果没有,那么普通客户可以通过发送他们想要的任何POST数据来欺骗登录和结账数据作为另一个客户。

关于实际的订单创建,您需要注意checkout/manual返回包含所有必要订单数据的json。您需要做的就是在if (!isset($json['error'])) {

之后添加类似的内容
$this->load->model('checkout/order');
$json['order_id'] = $this->model_checkout_order->addOrder($json);

然后将json返回到您的移动应用程序并显示确认信息或对订单数据执行任何操作。无论是否允许请求和/或链接到相应的客户帐户,在验证时发送唯一的移动应用密钥也可能会有所帮助。