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);

 

posted @ 2022-07-20 10:56  顾笙言啊顾笙言  阅读(249)  评论(0编辑  收藏  举报