把以下封装类,直接丢入/ThinkPHP/Library/Think文件夹里。
在控制器里直接 use Think\Ele; 再 new Ele()调用
<?php
/**
* 饿了么蜂鸟快递封装类.
* User: 17771800017@163.com
* Date: 2018/5/24
* Time: 9:17
*/
namespace Think;
define('APPID', C('FNPS.APPID')); //蜂鸟配送APPID
define('SecretKey', C('FNPS.SecretKey')); //蜂鸟配送SecretKey
class Ele
{
private $salt = ''; //随机数
private $formalUrl = []; //正式地址
private $adjustingUrl = []; //联调地址
/**
* 赋值各个地址
* Ele constructor.
*/
function __construct()
{
$this->formalUrl = C('FNPS.FORMAL_URL');
$this->adjustingUrl = C('FNPS.ADJUSTING_URL');
$this->salt = mt_rand(1000, 9999);
}
/**
* 获取token
* @return mixed
* Date: 2018/5/24
* Time: 10:25
*/
public function getToken()
{
if(S('eleToken')&&!empty(S('eleToken'))){
return S('eleToken');
}else{
$url = $this->requestUrl(true, 'GET_TOKEN') . '?app_id=' . APPID . '&salt=' . $this->salt . '&signature=' . $this->tokenSign();
$postUrl = $this->requestHttp($url);
if ($postUrl['code'] == 200 && isset($postUrl['data']['access_token'])) {
S('eleToken',$postUrl['data']['access_token'],3600*23);
return S('eleToken');
}
return $postUrl; //错误会返回code
}
}
/**
* 请求地址
* @param string $type (1为正式地址,0为联调地址)
* @param string $urlType
* @return mixed|string
* Date: 2018/5/24
* Time: 10:26
*/
private function requestUrl($type = '', $urlType = '')
{
$url = '';
switch ($type) {
case false:
$url = $this->adjustingUrl;
break;
case true:
$url = $this->formalUrl;
break;
}
return isset($url[$urlType]) ? $url[$urlType] : '';
}
/**
* 获取token时的签名
* @return string
* Date: 2018/5/24
* Time: 10:26
*/
private function tokenSign()
{
$sign = 'app_id=' . APPID . '&salt=' . $this->salt . '&secret_key=' . SecretKey;
return md5(urlencode($sign));
}
/**
* 蜂鸟配送
* @param $data
* @return mixed
* Date: 2018/5/24
* Time: 11:19
*/
public function eleDistribution($data)
{
$url = $this->requestUrl(true, 'ELE_DISTRIBUTION');
$distributionData = $this->distributionData($data);
return $this->requestReturn($url, $distributionData);
}
/**
* 签名
* @param $appId
* @param $token
* @param $urlencodeData
* @param $salt
* @return string
* Date: 2018/5/24
* Time: 11:18
*/
private function sign($appId, $token, $urlencodeData, $salt)
{
$sign = 'app_id=' . $appId . '&access_token=' . $token
. '&data=' . $urlencodeData . '&salt=' . $salt;
return md5($sign);
}
/**
* 配送数组
* @param array $data
* @return array
* Date: 2018/5/24
* Time: 11:06
*/
private function distributionData($data = [])
{
$distributionData = [];
//配送所需所有参数
$allKey = [
'partner_remark', 'partner_order_code', 'notify_url', 'order_type', 'chain_store_code', 'transport_info', 'order_add_time',
'order_total_amount', 'order_actual_amount', 'order_weight', 'order_remark', 'is_invoiced', 'invoice', 'order_payment_status',
'order_payment_method', 'is_agent_payment', 'require_payment_pay', 'goods_count', 'require_receive_time', 'serial_number',
'receiver_info', 'items_json',
];
//允许为空的参数
$allowEmptykey = ['partner_remark', 'transport_id', 'transport_remark', 'order_add_time', 'order_weight', 'order_remark', 'invoice', 'require_payment_pay',
'require_receive_time', 'receiver_second_phone', 'item_id', 'item_size', 'item_remark', 'agent_purchase_price', 'serial_number'];
foreach ($allKey as $val) {
if (in_array($val, $allowEmptykey) && isset($data[$val]) && $data[$val] !== '' || !in_array($val, $allowEmptykey)) {
$distributionData[$val] = isset($data[$val]) ? $data[$val] : '';
}
}
return $distributionData;
}
/**
* 同步取消订单
* @param array $data
* @return mixed
* Date: 2018/5/24
* Time: 11:38
*/
public function cancelOrder($data = [])
{
$url = $this->requestUrl(true, 'CANCEL_ORDER');
$cancelData = ['partner_order_code' => $data['partner_order_code'],
'order_cancel_reason_code' => $data['order_cancel_reason_code'],
'order_cancel_code' => $data['order_cancel_code'],
'order_cancel_time' => $data['order_cancel_time'],];
if (isset($data['order_cancel_description']) && !empty($data['order_cancel_description'])) {
$cancelData['order_cancel_description'] = $data['order_cancel_description'];
}
return $this->requestReturn($url, $cancelData);
}
/**
* 查询订单
* @param array $data
* @return mixed
* Date: 2018/5/24
* Time: 11:38
*/
public function getOrder($data = [])
{
$url = $this->requestUrl(true, 'FIND_ORDER');
$orderData = ['partner_order_code' => $data['partner_order_code']];
return $this->requestReturn($url, $orderData);
}
/**
* 投诉订单
* @param array $data
* @return mixed
* Date: 2018/5/24
* Time: 12:02
*/
public function complaintOrder($data = [])
{
$url = $this->requestUrl(true, 'COMPLAINT_ORDER');
$complaintData = ['partner_order_code' => $data['partner_order_code'],
'order_complaint_code' => $data['order_complaint_code'],
'order_complaint_time' => $data['order_complaint_time'],];
if (isset($data['order_complaint_desc']) && !empty($data['order_complaint_desc'])) {
$cancelData['order_complaint_desc'] = $data['order_complaint_desc'];
}
return $this->requestReturn($url, $complaintData);
}
/**
* 查询骑手位置
* @param array $data
* @return mixed
* Date: 2018/5/24
* Time: 11:38
*/
public function getRider($data = [])
{
$url = $this->requestUrl(true, 'FIND_RIDER');
$orderData = ['partner_order_code' => $data['partner_order_code']];
return $this->requestReturn($url, $orderData);
}
/**
* 请求返回
* @param string $url
* @param array $data
* @return mixed
* Date: 2018/5/24
* Time: 11:51
*/
private function requestReturn($url = '', $data = [])
{
$data = urlencode(json_encode($data, JSON_UNESCAPED_UNICODE));
$salt = $this->salt;
$sign = $this->sign(APPID, $this->getToken(), $data, $salt);
$requestData = ['app_id' => APPID,
'data' => $data,
'salt' => $salt,
'signature' => $sign];
return $this->requestPost($url, json_encode($requestData,JSON_UNESCAPED_UNICODE));
}
/**
* post请求
* @param $url
* @param $param
* @param string $method
* @return bool|mixed
* Date: 2018/5/28
* Time: 11:12
*/
public function requestPost($url, $param, $method = "POST")
{
if (empty($url) or empty($param)) {
throw new InvalidArgumentException('Params is not of the expected type');
}
if (!empty($param) and is_array($param)) {
$param = urldecode(json_encode($param));
} else {
$param = strval($param);
}
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_TIMEOUT, 30);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 不进行ssl 认证
if (strcmp($method, "POST") == 0) { // POST 操作
curl_setopt($ch, CURLOPT_POST, true);
} else if (strcmp($method, "DELETE") == 0) { // DELETE操作
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $method);
} else {
throw new InvalidArgumentException('Please input correct http method, such as POST or DELETE');
}
curl_setopt($ch, CURLOPT_POSTFIELDS, $param);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-type: Application/json'));
$result = curl_exec($ch);
$code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if (!empty($result) and $code == '200') {
return json_decode($result,true);
}
return false;
}
/**
* GET请求
* @param $url
* @param null $data
* @return mixed
* Date: 2018/5/24
* Time: 9:53
*/
private function requestHttp($url, $data = null)
{
$ch = curl_init();
if (class_exists('/CURLFile')) {
curl_setopt($ch, CURLOPT_SAFE_UPLOAD, true);
} else {
if (defined('CURLOPT_SAFE_UPLOAD')) {
curl_setopt($ch, CURLOPT_SAFE_UPLOAD, false);
}
}
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
if (stripos($url, "https://") !== false) {
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
}
if ($data != null) {
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
}
$res = curl_exec($ch);
if (curl_errno($ch) != 0) {
var_dump('错误号:' . curl_errno($ch) . '错误信息' . curl_error($ch));
}
curl_close($ch);
return json_decode($res, true); //返回一个数组
}
}