_fengNiaoAccount = $this->getKey($this->_apiCode); //验证是否具有访问这个接口的权限 if(!isset($this->_fengNiaoAccount['fengNiaoAppId']) || !isset($this->_fengNiaoAccount['fengNiaoSecretKey'])){ HelperService::returnJson(['code'=>400,'msg'=>'feng niao interface unauthorized access','data'=>[]]); } $this->_appId = $this->_fengNiaoAccount['fengNiaoAppId']; $this->_secretKey = $this->_fengNiaoAccount['fengNiaoSecretKey']; } public function order(){ $params = $this->_params; $rule = [ 'orderInfo|订单信息'=>'require', 'addressInfo|收货人信息'=>'require', 'productDetail|订单详情信息'=>'require', 'storeInfo|门店信息'=>'require', ]; $validate = new Validate($rule); if(!$validate->check($params)){ HelperService::returnJson(['code'=>400,'msg'=>$validate->getError(),'data'=>[]]); } $times = time(); $company_code = 'KEQIN'; $sign = sha1(md5(base64_encode($company_code.$times))."439F269CE14DBF34257C08612CE51EC8"); $url = "https://csapi.ahamu.cn/v1/FnNotifyUrl?api_code=".$company_code."&request_ts=".$times."&signKey=".$sign; file_put_contents('check_url',$url); $salt = mt_rand(1000,9999); $data = [ 'partner_order_code'=>isset($params['orderInfo']['order_no'])?$params['orderInfo']['order_no']:'',//商户订单号 'partner_remark'=>isset($params['table_name'])?$params['table_name']:'', 'notify_url'=>$url,//回调地址 'order_type'=>1,//订单类型 1: 蜂鸟配送,支持90分钟内送达 'chain_store_code'=>isset($params['storeInfo']['store_no'])?$params['storeInfo']['store_no']:'',//门店编号 'transport_info'=>[ 'transport_name'=>isset($params['storeInfo']['store_name'])?$params['storeInfo']['store_name']:'',//门店名称(支持汉字、符号、字母的组合),后期此参数将预留另用 'transport_address'=>isset($params['storeInfo']['address'])?$params['storeInfo']['address']:'',//取货点地址,后期此参数将预留另用 'transport_longitude'=>isset($params['storeInfo']['lng'])?$params['storeInfo']['lng']:'',//取货点经度,取值范围0~180,后期此参数将预留另用 'transport_latitude'=>isset($params['storeInfo']['lat'])?$params['storeInfo']['lat']:'',//取货点纬度,取值范围0~90,后期此参数将预留另用 'position_source'=>3,//取货点经纬度来源(1:腾讯地图, 2:百度地图, 3:高德地图),蜂鸟建议使用高德地图 'transport_tel'=>isset($params['storeInfo']['mobile'])?$params['storeInfo']['mobile']:'',//取货点联系方式, 只支持手机号,400开头电话以及座机号码 ], 'order_total_amount'=>isset($params['orderInfo']['price'])?$params['orderInfo']['price'] + $params['orderInfo']['dis_count']:'',//订单总金额(不包含商家的任何活动以及折扣的金额) 'order_actual_amount'=>isset($params['orderInfo']['price'])?$params['orderInfo']['price']:'',//客户需要支付的金额 'is_invoiced'=>0,//是否需要发票, 0:不需要, 1:需要 'order_payment_status'=>1,//订单支付状态 0:未支付 1:已支付 'order_payment_method'=>1,//订单支付方式 1:在线支付 'is_agent_payment'=>0,//是否需要ele代收 0:否 'goods_count'=>1,//订单货物件数 'receiver_info'=>[ 'receiver_name'=>isset($params['addressInfo']['receipt_name'])?$params['addressInfo']['receipt_name']:'',//收货人姓名 'receiver_primary_phone'=>isset($params['addressInfo']['receipt_mobile'])?$params['addressInfo']['receipt_mobile']:'',//收货人联系方式,只支持手机号,400开头电话,座机号码以及95013开头、长度13位的虚拟电话 'receiver_address'=>isset($params['addressInfo']['address'])?$params['addressInfo']['address'].$params['addressInfo']['house']:'',//收货人地址 'position_source'=>3,//收货人经纬度来源(1:腾讯地图, 2:百度地图, 3:高德地图),蜂鸟建议使用高德地图 'receiver_longitude'=>isset($params['addressInfo']['lng'])?$params['addressInfo']['lng']:'',//收货人经度,取值范围0~180 'receiver_latitude'=>isset($params['addressInfo']['lat'])?$params['addressInfo']['lat']:'',//收货人纬度,取值范围0~90 ], 'items_json'=> isset($params['productDetail'])?$params['productDetail']:[] , ]; // Log::record('蜂鸟传输数组',$data); // file_put_contents('fengniao',$data); $udata = urlencode(json_encode($data,JSON_UNESCAPED_UNICODE).PHP_EOL); $orderInfo = [ 'app_id'=>$this->_appId, 'salt'=>$salt, 'data'=> $udata, ]; $signature = $this->_createRequestSign($this->_appId,$this->_getToken(),$udata,$salt); $orderInfo['signature'] = $signature; $url = $this->_baseUrl."/v2/order"; $res = HelperService::doPost($url, json_encode($orderInfo)); HelperService::addLog(['request'=>$orderInfo,'return'=>$res], $url, 'FN'); HelperService::returnJson(['code'=>200,'msg'=>[],'data'=>@json_decode($res,true)]); } //查询订单 public function searchOrder(){ $params = $this->_params; $rule = [ 'order_no|订单信息'=>'require', ]; $validate = new Validate($rule); if(!$validate->check($params)){ HelperService::returnJson(['code'=>400,'msg'=>$validate->getError(),'data'=>[]]); } $salt = rand(1000,9999); $data = [ 'partner_order_code'=>$params['order_no'],//商户订单号 ]; $udata = urlencode(json_encode($data,JSON_UNESCAPED_UNICODE).PHP_EOL); $orderInfo = [ 'app_id'=>$this->_appId, 'data'=> $udata, 'salt'=>$salt, ]; $signature = $this->_createRequestSign($this->_appId,$this->_getToken(),$udata,$salt); $orderInfo['signature'] = $signature; $url = $this->_baseUrl."/v2/order/query"; $res = HelperService::doPost($url, json_encode($orderInfo)); HelperService::addLog(['request'=>$orderInfo,'return'=>$res], $url, 'FN'); HelperService::returnJson(['code'=>200,'msg'=>[],'data'=>@json_decode($res,true)]); } public function notifyUrl(){ $params = $this->_params; Log::record('回调'.$params); file_put_contents('test',$params); } /** * 创建token签名算法 * @param type $requestArr 请求数组 * @return string */ private function _createTokenSign($requestArr = []){ if(empty($requestArr) || !is_array($requestArr)){ return ''; } ksort($requestArr); return md5(urlencode(http_build_query($requestArr))); } /** * 创建商户请求时签名 * @param type $appId * @param type $accessToken * @param type $ueRequestDataArr urlencode,json_encode请求数据部分 * @param type $salt */ private function _createRequestSign($appId,$accessToken,$ueRequestDataArr,$salt){ $signStr = 'app_id=' . $appId . '&access_token=' . $accessToken . '&data=' . $ueRequestDataArr . '&salt=' . $salt; return md5($signStr); } /** * 获取蜂鸟的token数据 * @param type $isForce 是否强制获取token * @return type */ private function _getToken($isForce=false){ if(Cache::has('fengNiaoToken') && $isForce === false){ return Cache::get('fengNiaoToken'); } $salt = rand(1000,9999); $appId = $this->_appId; $getTokenArr = [ 'app_id'=>$appId, 'salt'=>$salt, 'secret_key'=>$this->_secretKey ]; $signature = $this->_createTokenSign($getTokenArr); $url = $this->_baseUrl."/get_access_token?app_id=$appId&salt=$salt&signature=$signature"; $tokenInfoJson = file_get_contents($url); $tokenInfo = json_decode($tokenInfoJson,true); if(!isset($tokenInfo['code']) || $tokenInfo['code']!=200 || !isset($tokenInfo['data']['access_token'])){ HelperService::returnJson([ 'code'=>200, 'msg'=>'签名错误', 'data'=>$tokenInfoJson ]); } $token = $tokenInfo['data']['access_token']; Cache::set('fengNiaoToken', $token,intval($tokenInfo['data']['expire_time']/1000)-time()); return $token; } /** * 查询门店是否有配送能力 */ public function distanceStore(){ $params = $this->_params; $rule = [ 'store_no|门店编号'=>'require', 'lng|经度'=>'require', 'lat|纬度'=>'require', ]; $validate = new Validate($rule); if(!$validate->check($params)){ HelperService::returnJson(['code'=>400,'msg'=>$validate->getError(),'data'=>[]]); } $salt = rand(1000,9999); $data = [ 'chain_store_code'=>$params['store_no'],//门店编号【大华店】 'position_source'=>3,//门店编号 'receiver_longitude'=>$params['lng'],//收货点经度(数字格式, 包括小数点, 取值范围0~180) 'receiver_latitude'=>$params['lat'],//收货点纬度(数字格式, 包括小数点, 取值范围0~90) ]; $udata = urlencode(json_encode($data,JSON_UNESCAPED_UNICODE).PHP_EOL); $orderInfo = [ 'app_id'=>$this->_appId, 'data'=> $udata, 'salt'=>$salt, ]; $signature = $this->_createRequestSign($this->_appId,$this->_getToken(),$udata,$salt); $orderInfo['signature'] = $signature; $url = $this->_baseUrl."/v2/chain_store/delivery/query"; $res = HelperService::doPost($url, json_encode($orderInfo)); HelperService::addLog(['request'=>$orderInfo,'return'=>$res], $url, 'FN'); HelperService::returnJson(['code'=>200,'msg'=>[],'data'=>@json_decode($res,true)]); } /** * 取消订单 */ public function cancelOrder(){ // $params = $this->_params; // $rule = [ // 'store_no|门店编号'=>'require', // 'lng|经度'=>'require', // 'lat|纬度'=>'require', // ]; // // $validate = new Validate($rule); // if(!$validate->check($params)){ // HelperService::returnJson(['code'=>400,'msg'=>$validate->getError(),'data'=>[]]); // } $salt = rand(1000,9999); $data = [ 'partner_order_code'=>"1904101806201487",//商户订单号 'order_cancel_reason_code'=>1,//订单取消原因代码(2:商家取消) 'order_cancel_code'=>1,//订单取消编码(1:物流原因:订单长时间未分配骑手, 2:物流原因:分配骑手后,骑手长时间未取件 , 3:物流原因:骑手告知不配送,让取消订单, 4:商品缺货/无法出货/已售完, 5:商户联系不上门店/门店关门了, 6:商户发错单, 7:商户/顾客自身定位错误, 8:商户改其他第三方配送, 9:顾客下错单/临时不想要了, 10:顾客自取/不在家/要求另改时间配送)(0类型已下线) 'order_cancel_time'=>microtime(),//订单取消时间(毫秒) ]; $udata = urlencode(json_encode($data,JSON_UNESCAPED_UNICODE).PHP_EOL); $orderInfo = [ 'app_id'=>$this->_appId, 'data'=> $udata, 'salt'=>$salt, ]; $signature = $this->_createRequestSign($this->_appId,$this->_getToken(),$udata,$salt); $orderInfo['signature'] = $signature; $url = $this->_baseUrl."/v2/order/cancel"; $res = HelperService::doPost($url, json_encode($orderInfo)); HelperService::addLog(['request'=>$orderInfo,'return'=>$res], $url, 'FN'); HelperService::returnJson(['code'=>200,'msg'=>[],'data'=>@json_decode($res,true)]); } }