Cannot create order Woocommerce rest Api php - php

I tried the following code and tried to post values from android to place an order but every time i test it on chrome it give http 500 error, and Android gives volly server error. Dont know where i am messing up, serious help would be appriciated. Thank You
Ask me if you need to take a look at the android Code, but i think that doesnot matter here because i am giving hard coded values in $data.
<?php
require_once( 'lib/woocommerce-api.php' );
$pageNum=1;
$pageNum=$_GET['page_num'];
$options = array(
'debug' => true,
'return_as_array' => false,
'validate_url' => false,
'timeout' => 30,
'ssl_verify' => false,
);
try {
$client = new WC_API_Client( 'https://www.move2mart.com/', 'ck_0afa3a49305683160fe34189553a660053bd4e6239', 'cs_7dc38a7b52c3fdd34qw61e34090be636ae3364b196', $options );
//$data=array();
$data=[
'payment_method' => 'cod',
'payment_method_title' => 'Cash on Delivery',
'set_paid' => false,
'billing' => [
'first_name' => 'John',
'last_name' => 'Doe',
'address_1' => '969 Market',
'city' => 'Karachi',
'email' => 'princeali#testing.com',
'phone' => '03123121995'
], 'line_items' => [
[
'product_id' => 779,
'quantity' => 1
]
]
];
print_r($client->post('orders', $data));
if($_POST !=null) {
}
else{
echo "Null POST Request";
}
} catch ( WC_API_Client_Exception $e ) {
echo $e->getMessage() . PHP_EOL;
echo $e->getCode() . PHP_EOL;
if ( $e instanceof WC_API_Client_HTTP_Exception ) {
print_r( $e->get_request() );
print_r( $e->get_response() );
}
}

$orderData = array(
"order" => array(
"billing_address" => array(
array(
"first_name" => "",
"last_name" => "",
"company" => "",
"address_1" => "",
"address_2" => "",
"city" => "",
"state" => "",
"postcode" => "",
"country" => "",
"email" => "",
"phone" => "",
)
),
"shipping_address" => array(
array(
"first_name" => "",
"last_name" => "",
"company" => "",
"address_1" => "",
"address_2" => "",
"city" => "",
"state" => "",
"postcode" => "",
"country" => "",
)
),
"customer_id" => 1,
"line_items" => array(
array(
"product_id" => 1,
"quantity" => 1
)
)
)
);
$client->orders->create($orderData);
Would you please try above code?

Finally, I figured it out after some research. Below is working code of woocommerce checkout webservice that may Help you -
/*** Just Copy & Paste and change your varriables **/
//do your initial stuff
header('Content-type: application/json');
$json_file=file_get_contents('php://input');
$jsonvalue= json_decode($json_file,true);
$user_id = $jsonvalue['user_id'];
$product_id = $jsonvalue['product_id'];
$quantity = $jsonvalue['quantity'];
//start order data
$orderData = array(
"order" => array(
'payment_method' => 'paypal',
'payment_method_title' => 'Paypal',
'set_paid' => true,
"billing_address" => array(
"first_name" => "bfname",
"last_name" => "blname",
"company" => "testcompanybilling",
"address_1" => "sec8",
"address_2" => "e32",
"city" => "noida",
"state" => "Noida",
"postcode" => "99999",
"country" => "IN",
"email" => "test#gmail.com",
"phone" => "888899999999"
),
"shipping_address" => array(
"first_name" => "sfname",
"last_name" => "slname",
"company" => "testcompanyshipping",
"address_1" => "shakkarpur",
"address_2" => "laxminigar",
"city" => "New Delhi",
"state" => "Delhi",
"postcode" => "110092",
"country" => "IN",
"email" => "testsh#gmail.com",
"phone" => "11009999"
),
"customer_id" => $user_id,
"line_items" => array(
array(
"product_id" => $product_id,
"quantity" => $quantity
)
),
'shipping_lines' => array(
array(
'method_id' => 'flat_rate',
'method_title' => 'Flat Rate',
'total' => 10
)
)
)
);
//Create order usind order data
$data = $client->orders->create($orderData);
//echo '<pre>';
//print_r($data);
$result['success']='true';
$result['error']="0";
$result['msg']='Your order has been successfully placed.';
$result['data']=$data;
echo json_encode($result); `
cheers!!!

Related

Construct an associative array from 2 other arrays, and linked by a common key

Problem:
I would like to combine 2 associative arrays to make one. To link these arrays, the ID key is present in both.
Input:
To retrieve my contacts with api call, I have to do 2 requests :
First to retrieve contacts with Id, and email adresse
Second to get some informations like name, city etc.
The first one return an array like this :
$contactArray = array(
array(
"CreatedAt" => "2019-04-12T11:53:26Z",
"DeliveredCount" => 0,
"Email" => "terry#example.org",
"ExclusionFromCampaignsUpdatedAt" => "2019-04-28T09:21:35Z",
"ID" => 1864410583,
"IsExcludedFromCampaigns" => false,
"IsOptInPending" => false,
"IsSpamComplaining" => false,
"LastActivityAt" => "2019-04-28T09:21:35Z",
"LastUpdateAt" => "2019-04-28T09:21:35Z",
"Name" => "",
"UnsubscribedAt" => "",
"UnsubscribedBy" => ""
),
array(
"CreatedAt" => "2019-04-12T12:39:30Z",
"DeliveredCount" => 0,
"Email" => "duane#example.org",
"ExclusionFromCampaignsUpdatedAt" => "",
"ID" => 1864410588,
"IsExcludedFromCampaigns" => false,
"IsOptInPending" => false,
"IsSpamComplaining" => false,
"LastActivityAt" => "2019-04-12T12:39:30Z",
"LastUpdateAt" => "2019-04-12T12:39:30Z",
"Name" => "",
"UnsubscribedAt" => "",
"UnsubscribedBy" => ""
)
);
The second call, return an array like
$contactDataArray =
array(
array(
"ContactID" => 1864410583,
"Data" => array(
array(
"Name" => "firstname",
"Value" => "Mark"
),
array(
"Name" => "city",
"Value" => "Miami"
),
array(
"Name" => "name",
"Value" => "Terry"
),
array(
"Name" => "phone",
"Value" => "555-5555"
)
),
"ID" => 1864410583
),
array(
"ContactID" => 1864410588,
"Data" => array(
array(
"Name" => "firstname",
"Value" => "Jane"
),
array(
"Name" => "city",
"Value" => "New York"
),
array(
"Name" => "name",
"Value" => "Duane"
),
array(
"Name" => "phone",
"Value" => "555-5555"
)
),
"ID" => 1864410588
)
);
In $contactArray, the ID key matches with ContactID key and ID key in $contactDataArray
Attempt:
I want an array formatted like this :
$output = array(
array(
"Email" => "terry#example.org",
"ID" => 1864410583,
"firstname" => "Mark",
"city" => "Miami",
"name" => "Terry",
"phone" => "555-5555"
),
array(
"Email" => "duane#example.org",
"ID" => 1864410588,
"firstname" => "Jane",
"city" => "New York",
"name" => "Duane",
"phone" => "555-5555"
)
);
I'm trying to achieve this with array_walk, but no succeed.
You can do this with foreach,
$result = [];
foreach ($contactDataArray as $key => $value) {
$ids = array_column($contactArray, "ID"); // fetching all values from contactArray
if (!empty(array_intersect([$value['ContactID'], $value['ID']], $ids))) { // checking if both satisfy the condition
$result[$key] = array_column($value['Data'], 'Value', 'Name'); // combining name and value
// searchng for key with matched ContactID
$result[$key]['Email'] = $contactArray[array_search($value["ContactID"], $ids)]['Email'];
$result[$key]['ID'] = $value["ContactID"];
}
}
Demo.
Can you please try with this?
$output = [];
for($i = 0; $i < count($contactDataArray); $i++) {
$arrIDandEmail = [
'Email' => isset($contactArray[$i]['Email']) ? $contactArray[$i]['Email'] : '',
'ID' => isset($contactDataArray[$i]['ID']) ? $contactDataArray[$i]['ID'] : ''
];
$arrData = array_column($contactDataArray[$i]["Data"], "Value", "Name");
$newArray = array_merge($arrIDandEmail, $arrData);
$output[] = $newArray;
}
For PHP >= 7.1 you can use array destructuring using list()
<?php
$output = [];
foreach ($contactDataArray as [
'ID' => $id,
'Data' => [
['Name' => $firstnameKey, 'Value' => $firstnameValue],
['Name' => $cityKey, 'Value' => $cityValue],
['Name' => $nameKey, 'Value' => $nameValue],
['Name' => $phoneKey, 'Value' => $phoneValue]
]
]) {
$output[] = [
"Email" => $contactArray[array_search($id, array_column($contactArray, 'ID'))]['Email'],
"ID" => $id,
$firstnameKey => $firstnameValue,
$cityKey => $cityValue,
$nameKey => $nameValue,
$phoneKey => $phoneValue
];
}
var_dump($output);
Demo
You can use array_walk,array_combine,array_column for the desired array as a result
$res = [];
array_walk($contactArray, function($v, $k) use ($contactDataArray,&$res)
{
$res[] = array_merge(['Email'=>$v['Email'],'ID'=>$v['ID']],
array_combine(
array_column($contactDataArray[$k]['Data'],'Name'),
array_column($contactDataArray[$k]['Data'],'Value')
)
);
});
echo '<pre>';
print_r($res);
DEMO

Push Array into another Array PHP

I would like to push this:
"serialNumber" => $serial,
Inside product array of $postArray and
"note" => array(
"text" => $note
),
before reservationDate Inside $postArray.
$postArray = array(
"reservationDate" => $timeData,
"emailLanguageCode" => "it_it",
"shipToCode" => $_POST['ship'],
"customer" => array(
"firstName" => $_POST['firstName'],
"lastName" => $_POST['lastName'],
"emailId" => $_POST['emailId'],
"phoneNumber" => $_POST['phoneNumber'],
"address" => array(
"addressLine1" => $_POST['addressLine1'],
"city" => $_POST['city'],
"state" => $_POST['state'],
"country" => $_POST['country'],
"postalCode" => $_POST['postalCode']
)
),
"product" => array(
"productCode" => $_POST['productCode'],
"issueReported" => $_POST['issueReported']
)
);
And result that I would like:
$postArray = array(
"note" => array(
"text" => $note
),
"reservationDate" => $timeData,
"emailLanguageCode" => "it_it",
"shipToCode" => $_POST['ship'],
"customer" => array(
"firstName" => $_POST['firstName'],
"lastName" => $_POST['lastName'],
"emailId" => $_POST['emailId'],
"phoneNumber" => $_POST['phoneNumber'],
"address" => array(
"addressLine1" => $_POST['addressLine1'],
"city" => $_POST['city'],
"state" => $_POST['state'],
"country" => $_POST['country'],
"postalCode" => $_POST['postalCode']
)
),
"product" => array(
"serialNumber" => $serial,
"productCode" => $_POST['productCode'],
"issueReported" => $_POST['issueReported']
)
);
I tried this:
array_push($postArray["product"][],$numeroSerie);
Please help.
Just simply do this
$postArray['product']['serialNumber'] = $serial;
Make First Array that which array you want in product array after use array_merge
$postArray1 = array(
"note" => array(
"text" =>15
));
$postArray = array(
"reservationDate" =>1,
"emailLanguageCode" => 2,
"shipToCode" => 3,
"customer" => array(
"firstName" => 4,
"lastName" => 5,
"emailId" => 6,
"phoneNumber" => 7,
"address" => array(
"addressLine1" => 8,
"city" =>9,
"state" => 10,
"country" => 11,
"postalCode" => 12
)
),
"product" => array(
"productCode" => 13,
"issueReported" => 14
)
);
array_merge($postArray1,$postArray);
very simple, add this two line code :
// insert "serialNumber" into "product" array
$postArray['product']['serialNumber'] = $serial;
// insert "note" into begining array element
$postArray = array('note'=>array("text" => $note))+$postArray;
These two lines,
$postArray['product'] = $serial + $postArray['product'];
$postArray = $numeroSerie + $postArray ;
And that's it,
+ operator gives union of both array and offcourse will satisfy your requirement.
Give it a try, this will work.
You will Try this i think its working fine.
$data=array("note" => array("text" => $note));
$postArray= array_merge($data,$postArray);
$postArray["product"]=array_merge(array("serialNumber"=> $serial),$postArray["product"]);

2checkout api call for create sale

I am using 2checkout api for my website product sale. Hence I am calling 2checkout api to create sale where I can call api with total amount with a single product.It's look like flowing:
try {
$charge = Twocheckout_Charge::auth(array(
"merchantOrderId" => "123",
"token" => $_POST['token'],
"currency" => 'USD',
"total" => $first_bill['amount'],
"billingAddr" => array(
"name" => $_POST['b_name'],
"addrLine1" => $_POST['b_address'],
"city" => 'Columbus',
"state" => 'OH',
"zipCode" => '43123',
"country" => $_POST['b_country'],
"email" => $_POST['b_emaill'],
"phoneNumber" => $_POST['b_phone']
),
"shippingAddr" => array(
"name" => 'Testing Tester',
"addrLine1" => '123 Test St',
"city" => 'Columbus',
"state" => 'enter code hereOH',
"zipCode" => '43123',
"country" => 'USA',
"email" => 'example#2co.com',
"phoneNumber" => '555-555-5555'
)
));
if ($charge['response']['responseCode'] == 'APPROVED') {
echo $response;exit;
// echo "Thanks for your Order!";
// echo "<h3>Return Parameters:</h3>";
// echo "<pre>";
// print_r($charge);
// echo "</pre>";
}
else
{
$this->Registrationmodel->delete_account($accounts_id);
echo $charge['response']['responseCode'];
exit;
}
}
catch (Twocheckout_Error $e)
{
echo $e->getMessage();
exit;
}
}
hence when i try to set line items individual like following:
try {
$charge = Twocheckout_Charge::auth(array(
"merchantOrderId" => "123",
"token" => $_POST['token'],
"currency" => 'USD',
//"total" => $first_bill['amount'],
"billingAddr" => array(
"name" => $_POST['b_name'],
"addrLine1" => $_POST['b_address'],
"city" => 'Columbus',
"state" => 'OH',
"zipCode" => '43123',
"country" => $_POST['b_country'],
"email" => $_POST['b_emaill'],
"phoneNumber" => $_POST['b_phone']
),
"LineItem" => array(
"duration" => 'Forever',
"price" => '10',
"productId" =>'1235',
"quantity" => '1',
"recurrence" => '1 Month',
"tangible" => 'N',
"type"=>'product'
),
"shippingAddr" => array(
"name" => 'Testing Tester',
"addrLine1" => '123 Test St',
"city" => 'Columbus',
"state" => 'OH',
"zipCode" => '43123',
"country" => 'USA',
"email" => 'example#2co.com',
"phoneNumber" => '555-555-5555'
)
));
if ($charge['response']['responseCode'] == 'APPROVED') {
$response = $this->return_information($charge['response']['orderNumber']);
echo $response;exit;
// echo "Thanks for your Order!";
// echo "<h3>Return Parameters:</h3>";
// echo "<pre>";
// print_r($charge);
// echo "</pre>";
}
else
{
$this->Registrationmodel->delete_account($accounts_id);
echo $charge['response']['responseCode'];
exit;
}
}
catch (Twocheckout_Error $e)
{
$this->Registrationmodel->delete_account($accounts_id);
echo $e->getMessage();
exit;
}
}
It is giving me parameter error. Please can anyone help ? how to set line items using api call?
Your lineitem array is missing the 'name' param, which is a required parameter. A full list of required params can be located here .
Also your shipping array is unnecessary as your product is intangible, therefore you could remove the shipping array.
Here's a working example I use:
try {
$charge = Twocheckout_Charge::auth(array(
"sellerId" => "xxxxxxxxx",
"li_0_merchant_order_id" => "1",
"type" => "product",
"token" => $_POST['token'],
"currency" => "USD",
// "total" => "1.00", //Only use when lineitems are not passed in
"lineItems" => array(
"0" => array(
"name" => $_POST['name'],
"price" => $_POST['price'],
"quantity" => $_POST['quantity'],
"startupFee" => $_POST['startupFee'],
"tangible" => $_POST['tangible']
)
),
"billingAddr" => array(
"name" => $_POST['customer'],
"addrLine1" => $_POST['addrLine1'],
"city" => $_POST['city'],
"state" => $_POST['state'],
"zipCode" => $_POST['zipCode'],
"country" => $_POST['country'],
"email" => $_POST['email'],
"phoneNumber" => ''
)
));
if ($charge['response']['responseCode'] == 'APPROVED') {
To better fit your app, add the "duration" & "recurrence" keys & their respective values to the lineItem array in the code I provided above. The example I provided contains all required parameters for a non-tangible sale.

Dolibarr soap web service usage with php

I am trying to use a Dolibarr soap web service with php
Dolibarr web service
this is what i got for the moment:
$url = "http://localhost/seko/dollibar/dolibarr-3.7.1/htdocs/webservices/server_invoice.php?wsdl";
$client = new SoapClient($url);
$authentication = array(
"dolibarrkey" => "xxxxx",
"sourceapplication" => "",
"login" => "xxxx",
"password" => "xxxxxx",
"entity" => "1"
);
$line = array(
"id" => "57",
"type" => 0,
"desc" => "SEKO",
"vat_rate" => 16.000,
"qty" => 03,
"unitprice" => 10500.00000000,
"total_net" => 10500.0000000,
"total_vat" => 1680.00000000,
"total" => 12180.0000000,
"date_start" => "",
"date_end" => "",
"payment_mode_id" => "efectivo",
"product_id" => 1,
"product_ref" => "",
"product_label" => "",
"product_desc" => ""
);
$invoice = array(
"id" => "57",
"ref" => "0007",
"ref_ext" => "test",
"thirdparty_id" => 3,
"fk_user_author" => "1",
"fk_user_valid" => "1",
"date" => date("Y-m-d"),
"date_due" => date("Y-m-d"),
"date_creation" => date("Y-m-d h:i:sa"),
"date_validation" => date("Y-m-d h:i:sa"),
"date_modification" => "",
"type" => 0,
"total_net" => 10500.00000000,
"total_vat" => 1680.00000000,
"total" => 12180.0000000,
"note_private" => "",
"note_public" => "",
"status" => 2,
"close_code" => "",
"close_note" => "",
"project_id" => "",
"lines" => $lines
);
$res = $client->createInvoice($authentication, $invoice);
var_dump($res);
I get the following error:
An uncaught Exception was encountered
Type: SoapFault
Message: looks like we got no XML document
When I use the getInvoice method of the service it works fine. But not the creatInvoice method. I am sure the problem is with my $line array but I do not know how to fix it.
According to XML documentation (open this http://localhost/seko/dollibar/dolibarr-3.7.1/htdocs/webservices/server_invoice.php?wsdl in your webbrowser)
please note that you need to remove the "payment_mode_id" field from the $line array and move it to your $invoice array
Like this :
$line = array(
"id" => "57",
"type" => 0,
"desc" => "SEKO",
"vat_rate" => 16.000,
"qty" => 03,
"unitprice" => 10500.00000000,
"total_net" => 10500.0000000,
"total_vat" => 1680.00000000,
"total" => 12180.0000000,
"date_start" => "",
"date_end" => "",
"product_id" => 1,
"product_ref" => "",
"product_label" => "",
"product_desc" => ""
);
$invoice = array(
"id" => "57",
"ref" => "0007",
"ref_ext" => "test",
"thirdparty_id" => 3,
"fk_user_author" => "1",
"fk_user_valid" => "1",
"date" => date("Y-m-d"),
"date_due" => date("Y-m-d"),
"date_creation" => date("Y-m-d h:i:sa"),
"date_validation" => date("Y-m-d h:i:sa"),
"date_modification" => "",
"payment_mode_id" => "efectivo",
"type" => 0,
"total_net" => 10500.00000000,
"total_vat" => 1680.00000000,
"total" => 12180.0000000,
"note_private" => "",
"note_public" => "",
"status" => 2,
"close_code" => "",
"close_note" => "",
"project_id" => "",
"lines" => $lines
);
Hoping help
Regards

PHP and SOAP data loss when sending to client

I have an array of data that I want to send to a SOAP client.
It all works, but one piece of data isn't transmitted, as revealed by __getLastRequest().
Here's my code
<?php
$test_array = array(
"request" => array(
"dateTime" => "2011-12-05T11:37:06.0000000+00:00",
"brandId" => 2,
"extSysId" => 11,
"extSysPassword" => "xxxxx",
"customer" => array(
"title" => "Mr",
"firstName" => "Dec",
"lastName" => "Test-Two",
"address" => array(
"type" => "Residential",
"pafValidated" => TRUE,
"houseNumber" => "xx",
"houseName" => "",
"line1" => "xx xx",
"line2" => "",
"line3" => "xx",
"line4" => "",
"line5" => "",
"postcode" => "xxx xxx"
),
"phones" => array(
0 => array(
"type" => "Home",
"_" => "xxx xxxxxx"
),
1 => array(
"type" => "Work",
"preferred" => TRUE,
"_" => ""
),
2 => array(
"type" => "Mobile",
"preferred" => TRUE,
"_" => ""
)
),
"email" => "xxxx.xxxx#gmail.com"
),
"nextPurchase" => array(
"date" => "2014-05-01"
),
"dataProtection" => array(
"group" => FALSE,
"thirdParty" => FALSE
),
"futureContactChannels" => array(
0 => array(
"type" => "Whitemail",
"option" => FALSE
),
1 => array(
"type" => "Email",
"option" => FALSE
),
2 => array(
"type" => "Phone",
"option" => FALSE
),
3 => array(
"type" => "SMS",
"option" => FALSE
)
),
"vehicleRequests" => array(
0 => array(
"derivativeCode" => "xxxxx",
"type" => "T"
)
),
"Retailer" => array(
0 => array (
"dealerCode" => "00082"
)
),
"company" => array(
"companyName" => "",
"jobTitle" => ""
),
"campaign" => array(
"code" => "xxxxxxxxx",
"source" => 69
),
"notes" => "blah balh: ."
)
);
$client = new SoapClient("/xxx/xxxx/xxxxxx/xxxxx.wsdl", array(
"login" => "xxx",
"password" => "xxx",
"location" => "http://xxx.xxx.xxx.xxx/xxxxxx/Some.asmx",
"uri" => "urn:xmethods-delayed-quotes",
'trace' => 1,
'exceptions' => 1,
'soap_version' => 'SOAP_1_1',
'encoding' => 'UTF-8',
'features' => 'SOAP_USE_XSI_ARRAY_TYPE'
));
$client->CallComeFunction($test_array);
echo "REQUEST:\n" . $client->__getLastRequest() . "\n";
echo "*************************************************\n";
echo "Response:\n" . $client->__getLastResponse() . "\n";
The Retailed[0]['dealerCode'] is the only piece of info that is omitted from the sent XML.
Any ideas?
Many thanks.
As mac says, formatting the code would be nice, but one thing I notice is the 'Retailer' field is the only one that's capitalized. Not sure if the WSDL has any influence on what is sent by the client but it might.
Double check the WSDL and see if the field should be 'retailer' instead. Any chance you can share the WSDL, btw?
EDIT
After reviewing the WSDL, 'retailer' is the way to go:
<s:element minOccurs="0" maxOccurs="1" name="retailer" type="tns:Retailer"/>
The payload should be formatted differently as well, it should be
"retailer" => array(
"dealerCode" => "00082"
)
per the WSDL
<s:complexType name="Retailer">
<s:attribute name="dealerCode" type="s:string"/>
</s:complexType>

Categories