新建一个文件 DaDaSdk.class.php
<?php
namespace O2OSender;
/**
* 达达开放平台sdk
*/
class DaDaSdk
{
private $URL = 'http://newopen.qa.imdada.cn'; //正式环境
// private $URL = 'http://newopen.imdada.cn'; //测试环境
private $APP_KEY = '';
private $VERSION = '1.0';
private $APP_SECRET = '';
private $API_ADDORDER = '/api/order/addOrder';
private $API_FETCHORDER = '/api/order/fetch';
private $API_CITY_LIST = "/api/cityCode/list";
private $API_FINISHORDER = '/api/order/finish';
private $API_CANCELORDER = '/api/order/cancel';
private $API_EXPIREORDER = '/api/order/expire';
private $API_FORMALCANCEL = '/api/order/formalCancel';
private $API_CANCELREASONS = '/api/order/cancel/reasons';
private $API_ACCEPTORDER = '/api/order/accept';
private $API_ADDTIP = '/api/order/addTip';
private $API_READDORDER = '/api/order/reAddOrder';
private $API_QUERYDELIVERFEE = '/api/order/queryDeliverFee';
private $API_ADDAFTERQUERY = '/api/order/addAfterQuery';
private $API_ADDSHOP = '/api/shop/add';
private $API_ADDMERCHANT = '/merchantApi/merchant/add';
private $API_QueryOrder='api/order/status/query';
private $SOURCE_ID = '73753'; //商户编号
private $SHOP_NO = '11047059'; //门店编号
private $SUCCESS = "success";
private $FAIL = "fail";
public function __construct($appkey,$appsec,$source_id,$shop_no)
{
$this->APP_KEY = $appkey;
$this->APP_SECRET = $appsec;
$this->SHOP_NO = $shop_no;
$this->SOURCE_ID = $source_id;
}
//查询订单详情
public function query($orderid)
{
return self::getResult($this->API_QueryOrder,$orderid);
}
/** 新增订单
* @return bool
*/
public function addOrder($data)
{
$data['shop_no'] = $this->SHOP_NO;
// $data['origin_id'] = "12321";
// $data['city_code'] = "029";
// $data['cargo_price'] = "11.2";
// $data['is_prepay'] = "0";
// $data['expected_fetch_time'] = time()+3600;
// $data['receiver_name'] = "";
// $data['receiver_address'] = "";
// $data['receiver_phone'] = "";
// $data['receiver_lat'] = "";
// $data['receiver_lng'] = "";
// $data['callback'] = "http://www.weilai517.com/index.php/Home/Test/callback/id/12321";
return self::getResult($this->API_ADDORDER,$data);
}
/**
* 重新发布订单
* 在调用新增订单后,订单被取消、过期或者投递异常的情况下,调用此接口,可以在达达平台重新发布订单。
* @return bool
*/
public function reAddOrder($data)
{
// $data['shop_no'] = $this->SHOP_NO;
// $data['origin_id'] = "12321";
// $data['city_code'] = "029";
// $data['cargo_price'] = "11.2";
// $data['is_prepay'] = "0";
// $data['expected_fetch_time'] = time()+3600;
// $data['receiver_name'] = "仝帅";
// $data['receiver_address'] = "南稍门中贸广场";
// $data['receiver_phone'] = "13572420121";
// $data['receiver_lat'] = "108.952931";
// $data['receiver_lng'] = "34.248759";
// $data['callback'] = "http://www.weilai517.com/index.php/Home/Test/callback/id/12321";
return self::getResult($this->API_READDORDER,$data);
}
/**
* 查询订单运费接口
* @return bool
*/
public function queryDeliverFee($data)
{
// $data['shop_no'] = $this->SHOP_NO;
// $data['origin_id'] = "12321";
// $data['city_code'] = "029";
// $data['cargo_price'] = "11.2";
// $data['is_prepay'] = "0";
// $data['expected_fetch_time'] = time()+3600;
// $data['receiver_name'] = "";
// $data['receiver_address'] = "";
// $data['receiver_phone'] = "";
// $data['receiver_lat'] = "";
// $data['receiver_lng'] = "";
// $data['callback'] = "http://www.weilai517.com/index.php/Home/Test/callback/id/12321";
return self::getResult($this->API_QUERYDELIVERFEE,$data);
}
/**
* 查询运费后发单接口
*/
public function addAfterQuery($data)
{
// $data['deliveryNo'] = '';
return self::getResult($this->API_ADDAFTERQUERY,$data);
}
/**
* 取消订单(线上环境)
* 在订单待接单或待取货情况下,调用此接口可取消订单。注意:订单接单后1-15分钟取消订单,会扣除相应费用补贴给接单达达
* @return bool
*/
public function formalCancel($data)
{
// $data['order_id'] = '12321';
// $data['cancel_reason_id'] = '1';
// $data['cancel_reason'] = "";
return self::getResult($this->API_FORMALCANCEL,$data);
}
/**
* 增加小费
* 可以对待接单状态的订单增加小费。需要注意:订单的小费,以最新一次加小费动作的金额为准,故下一次增加小费额必须大于上一次小费额。
* @return bool
*/
public function addTip($data)
{
// $data['order_id'] = '12321';
// $data['tips'] = '2.5';
// $data['city_code'] = '029';
// $data['info'] = '';
return self::getResult($this->API_ADDTIP,$data);
}
/**
* 新增门店
* @return bool
*/
public function addShop($data)
{
// $data['origin_shop_id'] = '';
// $data['station_name'] = '';
// $data['business'] = '';
// $data['city_name'] = '';
// $data['area_name'] = '';
// $data['station_address'] = '';
// $data['lng'] = '';
// $data['lat'] = '';
// $data['contact_name'] = '';
// $data['phone'] = '';
// $data['username'] = '';
// $data['password'] = '';
return self::getResult($this->API_ADDSHOP,$data);
}
public function addMerchant($data)
{
// $data['mobile'] = '';
// $data['city_name'] = '';
// $data['enterprise_name'] = '';
// $data['enterprise_address'] = '';
// $data['contact_name'] = '';
// $data['contact_phone'] = '';
$this->SOURCE_ID = '';
return self::getResult($this->API_ADDMERCHANT,$data);
}
/**
* 获取取消订单原因列表
* array {0 =>array{'reason' =>'没有达达接单','id' =>1},....}
*/
public function cancelReasons()
{
$res = self::getResult($this->API_CANCELREASONS);
var_dump($res);
}
/**
* 接单(仅在测试环境供调试使用)
* @return bool
*/
public function acceptOrder($data)
{
// $data['order_id'] = '12321';
return self::getResult($this->API_ACCEPTORDER,$data);
}
/**
* 完成取货(仅在测试环境供调试使用)
* @return bool
*/
public function fetchOrder($data)
{
// $data['order_id'] = '12321';
return self::getResult($this->API_FETCHORDER,$data);
}
/**
* 完成订单(仅在测试环境供调试使用)
* @return bool
*/
public function finishOrder($data)
{
// $data['order_id'] = '12321';
return self::getResult($this->API_FINISHORDER,$data);
}
/**
* 取消订单(仅在测试环境供调试使用)
* @return bool
*/
public function cancelOrder($data)
{
// $data['order_id'] = '12321';
return self::getResult($this->API_CANCELORDER,$data);
}
/**
* 订单过期(仅在测试环境供调试使用)
* @return bool
*/
public function expireOrder($data)
{
// $data['order_id'] = '12321';
return self::getResult($this->API_EXPIREORDER,$data);
}
/**
* 订单状态变化后,达达回调我们
*/
public function processCallback()
{
$content = file_get_contents("php://input");
//{"order_status":2,"cancel_reason":"","update_time":1482220973,"dm_id":666,"signature":"7a177ae4b1cf63d13261580e4f721cb9","dm_name":"测试达达","order_id":"12321","client_id":"","dm_mobile":"13546670420"}
if($content){
$arr = json_decode($content,true);
}
}
/** 获取城市信息
* @return bool
*/
public function cityCode(){
return self::getResult($this->API_CITY_LIST);
}
/**
*
* @param $param
* @param $time
* @return string
*/
private function sign($param,$time)
{
$tmpArr = array(
"app_key"=>$this->APP_KEY,
"body"=>$param,
"format"=>"json",
"source_id"=>$this->SOURCE_ID,
"timestamp"=>$time,
"v"=>$this->VERSION,
);
if(empty($this->SOURCE_ID)){
unset($tmpArr['source_id']);
}
$str = '';
foreach ($tmpArr as $k=>$v){
$str .= $k.$v;
}
$str = $this->APP_SECRET.$str.$this->APP_SECRET;
$signature = md5($str);
return strtoupper($signature);
}
private function getParam($data='')
{
if(empty($data)){
$param = '';
}else{
$param = json_encode($data);
}
$time = time();
$sign = self::sign($param,$time);
$tmpArr = array(
"app_key"=>$this->APP_KEY,
"body"=>$param,
"format"=>"json",
"signature"=>$sign,
"source_id"=>$this->SOURCE_ID,
"timestamp"=>$time,
"v"=>$this->VERSION,
);
if(empty($this->SOURCE_ID)){
unset($tmpArr['source_id']);
}
return json_encode($tmpArr);
}
/** 根据参数获取结果信息
* @param $api
* @param string $data
* @return bool
*/
private function getResult($api,$data=''){
$param = self::getParam($data);
$url = $this->URL.$api;
$res = self::http_post($url,$param);
if($res){
$res = json_decode($res,true);
// if($res['status'] == $this->SUCCESS){
return $res;
// }
}
return false;
}
/**
* POST 请求
* @param string $url
* @param array $param
* @param boolean $post_file 是否文件上传
* @return string content
*/
private function http_post($url,$param,$post_file=false){
$oCurl = curl_init();
if(stripos($url,"https://")!==FALSE){
curl_setopt($oCurl, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($oCurl, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($oCurl, CURLOPT_SSLVERSION, 1); //CURL_SSLVERSION_TLSv1
}
if (is_string($param) || $post_file) {
$strPOST = $param;
} else {
$aPOST = array();
foreach($param as $key=>$val){
$aPOST[] = $key."=".urlencode($val);
}
$strPOST = join("&", $aPOST);
}
curl_setopt($oCurl, CURLOPT_URL, $url);
curl_setopt($oCurl, CURLOPT_RETURNTRANSFER, 1 );
curl_setopt($oCurl, CURLOPT_POST,true);
curl_setopt($oCurl, CURLOPT_POSTFIELDS,$strPOST);
$header = array(
'Content-Type: application/json',
);
curl_setopt($oCurl, CURLOPT_HTTPHEADER, $header);
$sContent = curl_exec($oCurl);
$aStatus = curl_getinfo($oCurl);
curl_close($oCurl);
if(intval($aStatus["http_code"])==200){
return $sContent;
}else{
return false;
}
}
}
调用达达
//调用达达
function dadafun1($id='')
{
$link = mysqli_connect("127.0.0.1","xlyj_dayu1_netzs","6836RZe3mtDdtBY4","xlyj_dayu1_netzs");
$sql='select order_toaddressxy,order_money,toubaomoney,order_to_member_name,order_toaddress,order_to_member_mobile,order_packageweight from web_order where order_no='.$id;
$res=mysqli_query($link,$sql);
$orderinfo=mysqli_fetch_assoc($res);
// echo '<pre>';
// print_r($orderinfo);
file_put_contents('./2.txt',var_export($orderinfo,true));
$appkey='';
$appsec='';
$source_id='';
$shop_no='';
include('./DaDaSdk.class.php');
$dadaobj=new \DaDaSdk($appkey,$appsec,$source_id,$shop_no);
//获取城市code
// $res=$dadaobj->cityCode();
// file_put_contents('./3.txt',var_export($res,true));
//print_r($res);
// $city_code='';
// foreach($res['result'] as $key=>$val)
// {
// if(strpos('西安',$val['cityName'])!==false)
// {
// $city_code=$val['cityCode'];
// }
// }
$arrxy=explode(',',$orderinfo['order_toaddressxy']);
$jingdu=$arrxy[0];
$weidu=$arrxy[1];
$order_money=$orderinfo['order_money'];//订单金额
$toubaomoney=$orderinfo['toubaomoney'];//订单投保费
$order_money=round($order_money+$toubaomoney,2);
$data['origin_id'] = $id;
$data['city_code'] = '029';
$data['cargo_price'] =$order_money;
$data['is_prepay'] = "0";
$data['receiver_name'] = $orderinfo['order_to_member_name'] ;
$data['receiver_address'] = $orderinfo['order_toaddress'] ;
$data['receiver_lat'] = $weidu;
$data['receiver_lng'] = $jingdu;
$data['receiver_phone'] =$orderinfo['order_to_member_mobile'];
$data['callback'] = "https://****.net/wxprogramapi/payback/dadacallback.html?id=".$id;
$data['cargo_weight']=$orderinfo['order_packageweight'];
if(!empty($orderinfo['toubaomoney']) && $orderinfo['toubaomoney']>0)
{
$data['is_use_insurance']=1;//是否使用保价
}
file_put_contents('./3.txt',var_export($data,true));
$res=$dadaobj->addOrder($data);
file_put_contents('./4.txt',var_export($res,true));
//关闭数据库
mysqli_close($link);
}
达达回调文件路径:域名/wxprogramapi/payback/dadacallback.html
相当于在域名/wxprogramapi/payback文件的dadacallback方法
//达达回调
public function dadacallback()
{
$orderno=input('id');
//设置订单是达达
db('order')->where(['order_no'=>$orderno])->update(['order_exptype'=>1]);
$status=input('order_status');//订单状态(待接单=1,待取货=2,配送中=3,已完成=4,已取消=5, 指派单=8,妥投异常之物品返回中=9, 妥投异常之物品返回完成=10, 骑士到店=100,创建达达运单失败=1000 可参考文末的状态说明)
if($status=='2')//待取货=2
{
db('order')->where(['order_no'=>$orderno])->update(['order_delivery_state'=>1]);
}elseif($status=='3') //配送中
{
db('order')->where(['order_no'=>$orderno])->update(['order_delivery_state'=>2]);
}elseif($status=='4') //已完成
{
db('order')->where(['order_no'=>$orderno])->update(['order_delivery_state'=>3]);
}elseif($status=='5') //取消
{
dadafunagain($orderno,1);//重发
}
$appkey=config('appkey');
$appsec=config('appsec');
$source_id=config('source_id');
$shop_no=config('shop_no');
include(EXTEND_PATH.'DaDaSdk.class.php');
$dadaobj=new \DaDaSdk($appkey,$appsec,$source_id,$shop_no);
//模拟接单
// $data=[];
// $data['order_id']=$orderno;
// $res=$dadaobj->acceptOrder($data);
//完成取货
// $data=[];
// $data['order_id']=$orderno;
// $res=$dadaobj->fetchOrder($data);
//完成配送
// $data=[];
// $data['order_id']=$orderno;
// $res=$dadaobj->finishOrder($data);
// echo '<pre>';
// print_r($res);
//获取取消原因
// $res=$dadaobj->cancelReasons();
// echo '<pre>';
// print_r($res);
//取消订单
// $data=[];
// $data['order_id']=$orderno;
// $data['cancel_reason_id']='36';
// $res=$dadaobj->formalCancel($data);
// print_r($res);
}

1397





