php 对接 美团跑腿 (以微擎框架为例)
综合方法:
public function meituanpaotui($order_id=null,$module = "create",$data=null){ global $_W, $_GPC;include IA_ROOT . './Meituan.php'; $order = pdo_get('cjdc_order', array('id' => $order_id)); $metuanOrder = pdo_get('cjdc_order_for_meituan', array('order_id' => $order_id)); $set = pdo_get('cjdc_psset', array('store_id' => $order['store_id'])); $service = new Meituan($set); if($module=="create"){ //创建订单 return $service->createOrder($order); } if($module=="pre"){ //创建订单 return $service->preOrder($data); } if($module=="cancel"){ //取消订单 return $service->cancelOrder($metuanOrder,$data['cancel_reason_id'],$data['cancel_reason']); } }
Meituan.php
<?php /** * 美团跑腿 */ class Meituan { protected $appKey = "美团分配的appkey"; protected $secret = "美团分配的secret";protected $delivery_service_code = 100029; protected $api = "https://peisongopen.meituan.com/api";//请求地址 protected $version = "1.0"; // protected $shop_id = "美团分配的门店id"; protected $shop_id = "test_0001";//测试的时候统一使用的门店id protected $excepetMsg; private $isExcepet = false;//判断求是否异常 protected $apiResult; public function __construct($system) { } /** * 请求调用api * data:业务数据 * @return bool */ public function makeRequest($url, $data) { $reqParams = $this->makeSign($data); $resp = $this->getHttpRequestWithPost($url, $reqParams); $this->parseResponseData($resp); return $this->isExcepet; } /** * 解析响应数据 * @param $arr * @return bool */ public function parseResponseData($arr) { if (empty($arr)) { $this->isExcepet = true; $this->excepetMsg = "接口请求失败"; } else { $data = json_decode($arr, true); $this->apiResult = $data; } return true; } /** * 发送请求,POST * @param $url string 指定URL完整路径地址 * @param $data string 请求的数据 */ public function getHttpRequestWithPost($url, $data) { $headers = array( 'Content-Type' => 'application/x-www-form-urlencoded', ); $curl = curl_init($url); curl_setopt($curl, CURLOPT_URL, $url); curl_setopt($curl, CURLOPT_HEADER, false); curl_setopt($curl, CURLOPT_POST, true); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); curl_setopt($curl, CURLOPT_POSTFIELDS, $data); curl_setopt($curl, CURLOPT_TIMEOUT, 3); curl_setopt($curl, CURLOPT_HTTPHEADER, $headers); $resp = curl_exec($curl); //var_dump( curl_error($curl) );//如果在执行curl的过程中出现异常,可以打开此开关查看异常内容。 $info = curl_getinfo($curl); curl_close($curl); if (isset($info['http_code']) && $info['http_code'] == 200) { return $resp; } return ''; } public function getUrl($type) { $api = ""; switch ($type) { case "createOrder": $api = "/order/createByShop"; break;//创建订单 case "cancelOrder": $api = "/order/delete"; break;//取消订单 case "pre": $api = "/order/preCreateByShop"; break;//预发单接口 计算价格 case "queryOrder": $api = "/order/status/query"; break;//查询订单 case "checkOrder": $api = "/order/check"; break;//模拟发送订单 } return $this->api . $api; } protected function getSignStr($data, $secret) { ksort($data); $str = ''; foreach ($data as $key => $value) { $value = (string)$value; if (is_bool($value)) { $value = $value ? 'true' : 'false'; } if ($value !== "0" && (empty($value)) || $key == "sign") { continue; } $str .= $key . $value; } $after = ($secret . $str); return strtolower(sha1($after)); } public function makeSign($data) { $secret = $this->secret; $data['appkey'] = $this->appKey; $data['timestamp'] = (string)time(); $data['version'] = $this->version; foreach ($data as &$v) { $v = (string)$v; if (is_bool($v)) { $v = $v ? "true" : "false"; } if (is_int($v)) { $v = (string)$v; } } $data['sign'] = $this->getSignStr($data, $secret); return $data; } /** * 获取getDeliveryId * @return string */ protected function getDeliveryId($order) { return (int)(date("Ymd") . substr(time(), 0, 10) . rand(1000, 9999) . $order['id']); } protected function zhuanhuanJWD($address) {
$akkey = "百度地图api申请的key"; $api = "https://api.map.baidu.com/geocoding/v3/?address={$address}&output=json&ak={$akkey}&callback"; $res = file_get_contents($api); $res = json_decode($res, true); if ($res['status'] == 0) { $lat = bcdiv($res['result']['location']['lat'], 1, 6); $lat = bcmul($lat, 1000000, 0); $lng = bcdiv($res['result']['location']['lng'], 1, 6); $lng = bcmul($lng, 1000000, 0); return [$lng, $lat]; } else { return false; } } /** * 计算价格 * @param $order * @return false */ public function preOrder($order){ $url = $this->getUrl('pre'); $delivery_id = $order['delivery_id'] ? $order['delivery_id'] : $this->getDeliveryId($order); $data = [ 'delivery_id' => $delivery_id, //即配送活动标识 'order_id' => $order['id'], //订单id 'outer_order_source_desc' => '202', //取货门店 id 'shop_id' => $this->shop_id, //订单来源 'delivery_service_code' => $this->delivery_service_code, //配送服务代码 'receiver_name' => $order['name'], //收件人名称 'receiver_address' => $order['address'], //收件人地址 'receiver_phone' => $order['tel'], //收件人电话 //收件人纬度 'goods_value' => $order['money'], //货物价格 'goods_weight' => $order['goods_weight'], //货物重量 'pay_type_code' => '0', //支付方式,0、账期支付,1、余额支付; ]; $zuobiao = $this->zhuanhuanJWD($order['address']); if (!$zuobiao) return false; $data['receiver_lng'] = $zuobiao[0]; $data['receiver_lat'] = $zuobiao[1]; $this->makeRequest($url, $data); return $this->apiResult; } /** * 创建门店订单 * @param $order * @return false */ public function createOrder($order) { $url = $this->getUrl('createOrder'); $delivery_id = $order['delivery_id'] ? $order['delivery_id'] : $this->getDeliveryId($order); $data = [ 'delivery_id' => $delivery_id, //即配送活动标识 'order_id' => $order['id'], //订单id 'outer_order_source_desc' => '202', //取货门店 id 'shop_id' => $this->shop_id, //订单来源 'delivery_service_code' => $this->delivery_service_code, //配送服务代码 'receiver_name' => $order['name'], //收件人名称 'receiver_address' => $order['address'], //收件人地址 'receiver_phone' => $order['tel'], //收件人电话 //收件人纬度 'goods_value' => $order['money'], //货物价格 'goods_weight' => $order['goods_weight'], //货物重量 'pay_type_code' => '0', //支付方式,0、账期支付,1、余额支付; ]; $zuobiao = $this->zhuanhuanJWD($order['address']); if (!$zuobiao) return false; $data['receiver_lng'] = $zuobiao[0]; $data['receiver_lat'] = $zuobiao[1]; $this->makeRequest($url, $data); return $this->apiResult; } /** * 取消订单 * @param $metuanOrder * @param $cancel_reason_id * @param $cancel_reason * @return void */ public function cancelOrder($metuanOrder, $cancel_reason_id, $cancel_reason) { $url = $this->getUrl('cancelOrder'); $data = [ 'delivery_id' => $metuanOrder["delivery_id"], //即配送活动标识 'mt_peisong_id' => $metuanOrder["mt_peisong_id"], //美团配送内部订单id 'cancel_reason_id' => $cancel_reason_id, //取消原因代码 'cancel_reason' => $cancel_reason, //详细取消原因,最长不超过256个字符 ]; $this->makeRequest($url, $data); return $this->apiResult; } }
使用:
$result = $this->meituanpaotui($order_id);
技术最菜,头发最少