123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368 |
- <?php
- /**
- * Created by PhpStorm.
- * User: phperstar
- * Date: 2020/9/7
- * Time: 11:33 AM
- */
- namespace Util\KeRuYun;
- use Mall\Framework\Core\ResultWrapper;
- use Mall\Framework\Core\ErrorCode;
- use Mall\Framework\Factory;
- class Open
- {
- // 基础域名
- //private $baseUrl = 'https://gldopenapi.keruyun.com';
- private $baseUrl = 'https://openapi.keruyun.com';
- // 客如云门店id
- private $shopIdenty = '';
- // 授权KEY
- private $appKey = '';
- // 授权密钥
- private $secretKey = '';
- // 版本
- private $version = '1.0';
- //公共header头
- private $commonHeader = [
- CURLOPT_HTTPHEADER => [
- 'Content-Type: application/json'
- ],
- ];
- public function __construct($shopIdenty='', $appKey = '', $secretKey = '' )
- {
- $this->shopIdenty = $shopIdenty;
- $this->appKey = $appKey;
- $this->secretKey = $secretKey;
- }
- /**
- * 公共请求参数
- * 官方文档地址: https://open.keruyun.com/apidoc/cn/common/common-1.html
- */
- public function commonRequestData()
- {
- return $commonRequestData = [
- 'appKey' => $this->appKey,
- 'shopIdenty' => $this->shopIdenty,
- 'version' => $this->version,
- 'timestamp' => time(),
- 'sign' => ''
- ];
- }
- /**
- * 生成签名方法
- * 官方文档地址: https://open.keruyun.com/apidoc/cn/common/common-3.html
- */
- public function getSign($token)
- {
- $commonRequestData = self::commonRequestData();
- unset($commonRequestData['sign']);
- ksort($commonRequestData, SORT_STRING);
- $parameters = '';
- foreach ($commonRequestData as $key => $value){
- $parameters .= $key.$value;
- }
- return hash('sha256', $parameters.$token);
- }
- /**
- * 生成请求地址
- */
- public function getUrl($apiUrl, $token)
- {
- $commonRequestData = self::commonRequestData();
- $sign = self::getSign($token);
- $commonRequestData['sign'] = $sign;
- $url = '';
- foreach ($commonRequestData as $key => $value){
- $url .= $key.'='.$value;
- if($key != 'sign'){
- $url .= '&';
- }
- }
- return $this->baseUrl.$apiUrl.'?'.$url;
- }
- /**
- * 获取门店token
- * 官方文档地址: https://open.keruyun.com/apidoc/cn/common/common-2.html
- */
- public function getToken()
- {
- $url = self::getUrl('/open/v1/token/get', $this->secretKey);
- $response = request($url, null, 30, true);
- return self::commonReponseResult($response);
- }
- /**
- * 菜品分页查询
- * 官方文档地址: https://open.keruyun.com/apidoc/cn/dish/dish-3.html
- */
- public function dishMenu($token, $startId = 1, $pageNum = 1000)
- {
- $url = self::getUrl('/open/v1/cater/dish/dishMenu', $token);
- $postData = [
- 'shopIdenty' => $this->shopIdenty,
- 'startId' => $startId,
- 'pageNum' => $pageNum
- ];
- $response = request($url, json_encode($postData), 30, true, $this->commonHeader);
- return self::commonReponseResult($response);
- }
- /**
- * 菜品精确查询
- * 官方文档地址: https://open.keruyun.com/apidoc/cn/dish/dish-4.html
- */
- public function dishMenuByIds($token, $ids)
- {
- $url = self::getUrl('/open/v1/cater/dish/dishMenuByIds', $token);
- $postData = [
- 'shopIdenty' => $this->shopIdenty,
- 'ids' => $ids,
- ];
- $response = request($url, json_encode($postData), 30, true, $this->commonHeader);
- return self::commonReponseResult($response);
- }
- /**
- * 创建顾客
- * 官方文档地址: https://open.keruyun.com/apidoc/cn/crm/crm-1.html
- */
- public function createCustomer($token, $customerData)
- {
- $url = self::getUrl('/open/v1/crm/createCustomer', $token);
- $postData = [
- 'birthday' => $customerData['birthday'], // 生日时间戳
- 'loginId' => $customerData['loginId'], // 手机号或者微信id
- 'loginType' => $customerData['loginType'], //登陆类型(0:手机注册客户;1:微信注册用户;2:座机号;101:微信会员卡卡号;)
- 'name' => $customerData['name'],
- 'sex' => $customerData['sex'],
- ];
- $response = request($url, json_encode($postData), 30, true, $this->commonHeader);
- return self::commonReponseResult($response);
- }
- /**
- * 创建/升级会员
- * 官方文档地址: https://open.keruyun.com/apidoc/cn/crm/crm-2.html
- */
- public function createOrUpgradeMember($token, $customerData)
- {
- $url = self::getUrl('/open/v1/crm/createOrUpgradeMember', $token);
- $postData = [
- 'attentionWxTime' => time(), // 关注微信时间
- 'birthday' => time(), // 生日时间戳
- 'consumePwd' => '123456',
- 'customerId' => 0,
- 'customerMainId' => 0,
- 'loginId' => $customerData['loginId'], // 手机号或者微信id
- 'loginType' => $customerData['loginType'], //登陆类型(0:手机注册客户;1:微信注册用户;2:座机号;101:微信会员卡卡号;)
- 'name' => $customerData['name'],
- 'sex' => $customerData['sex'],
- ];
- $response = request($url, json_encode($postData), 30, true, $this->commonHeader);
- return self::commonReponseResult($response);
- }
- /**
- * 顾客/会员登录
- * 官方文档地址: https://open.keruyun.com/apidoc/cn/crm/login-1.html
- */
- public function login($token, $mobile)
- {
- $url = self::getUrl('/open/v1/crm/login', $token);
- $postData = [
- 'loginId' => $mobile, // 手机号或者微信id
- 'loginType' => 0, //登陆类型(0:手机注册客户;1:微信注册用户;2:座机号;101:微信会员卡卡号;)
- ];
- $response = request($url, json_encode($postData), 30, true, $this->commonHeader);
- return self::commonReponseResult($response);
- }
- /**
- * 查询会员信息
- * 官方文档地址; https://open.keruyun.com/apidoc/cn/crm/crm-3.html
- */
- public function getCustomerDetailById($token, $customerId)
- {
- $url = self::getUrl('/open/v1/crm/getCustomerDetailById', $token);
- $postData = [
- 'customerId' => $customerId,
- 'isNeedCredit' => 1
- ];
- $response = request($url, json_encode($postData), 30, true, $this->commonHeader);
- return self::commonReponseResult($response);
- }
- /**
- * 会员充值
- * 官方文档地址:https://open.keruyun.com/apidoc/cn/crm/charge-2.html
- */
- public function recharge($token, $customerRechargeData)
- {
- $url = self::getUrl('/open/v1/crm/member/recharge', $token);
- $postData = [
- 'customerId' => $customerRechargeData['customerId'],
- 'cardType' => 2,
- 'businessType' => 1,
- 'amount' => $customerRechargeData['amount'],
- 'tpOrderId' => $customerRechargeData['tpOrderId'],
- ];
- $response = request($url, json_encode($postData, JSON_UNESCAPED_UNICODE), 30, true, $this->commonHeader); V($response);
- return self::commonReponseResult($response);
- }
- /**
- * 外卖下单
- * 官网文档地址:https://open.keruyun.com/apidoc/cn/takeout/takeout-1.html
- */
- public function createTakeoutOrder($token, $orderData)
- {
- $url = self::getUrl('/open/v1/takeout/order/create', $token);
- $postData = [
- 'tpOrderId' => $orderData['tpOrderId'], // 第三方订单号
- 'createTime' => $orderData['createTime'], // 订单创建时间
- 'peopleCount' => 1, // 就餐人数
- 'shop' =>[
- 'shopIdenty' => $this->shopIdenty, // 客如云门店ID
- 'tpShopId' => $orderData['tpShopId'], // 合作方商户id
- 'shopName' => $orderData['shopName'] // 商户名称
- ],
- 'products' => $orderData['products'], // 商品信息
- 'delivery' => $orderData['delivery'], // 配送信息
- 'payment' => $orderData['payment'], // 支付信息
- 'customers' => $orderData['customers'], // 客户信息
- 'remark' => $orderData['remark'],
- ];
- $response = request($url, json_encode($postData, JSON_UNESCAPED_UNICODE), 30, true, $this->commonHeader);
- return self::commonReponseResult($response);
- }
- /**
- * 堂食快餐下单
- * 官网地址:
- */
- public function createSnackOrder($token, $orderData)
- {
- $postData = [
- 'tpOrderId' => $orderData['tpOrderId'],
- 'createTime' => $orderData['createTime'],
- 'updateTime' => $orderData['updateTime'],
- 'payment' => $orderData['payment'],
- 'peopleCount' => 1, // 就餐人数
- 'print' => 1, // 打印
- 'remark' => '小程序订单', // 备注
- 'status' => 2, // 已经确认
- 'shopIdenty' => $this->shopIdenty,
- 'shopName' => $orderData['shopName'],
- 'products' => $orderData['products'],
- 'customers' => [$orderData['customers']],
- 'totalPrice' => $orderData['totalPrice'],
- ];
- $url = self::getUrl('/open/v1/snack/order/create', $token);
- $response = request($url, json_encode($postData), 30, true, $this->commonHeader); V($response);
- return self::commonReponseResult($response);
- }
- /**
- * 取消订单
- * 官网文档地址 https://open.keruyun.com/apidoc/cn/takeout/takeout-6.html
- */
- public function cancel($token, $orderId)
- {
- $url = self::getUrl('/open/v1/takeout/order/cancel', $token);
- $postData = [
- 'orderId' => $orderId, // 创建订单时系统返回给开发者的开放平台订单id
- 'reason' => '不想买了'
- ];
- $response = request($url, json_encode($postData, JSON_UNESCAPED_UNICODE), 30, true, $this->commonHeader); V($response);
- return self::commonReponseResult($response);
- }
- /**
- * 堂食快餐订单查询
- * 官网地址: https://open.keruyun.com/apidoc/cn/zhengcan/zhengcan-19.html
- */
- public function dinnerOrderDetail($token, $orderId)
- {
- $url = self::getUrl('/open/v1/dinner/order/detail', $token);
- $postData = [
- 'id' => $orderId,
- ];
- $response = request($url, json_encode($postData, JSON_UNESCAPED_UNICODE), 30, true, $this->commonHeader);
- return self::commonReponseResult($response);
- }
- /**
- * 订单详情
- * 官方文档地址
- */
- public function orderExportDetail($token, $orderIds = [])
- {
- $url = self::getUrl('/open/v1/data/order/exportDetail', $token);
- $postData = [
- 'shopIdenty' => $this->shopIdenty,
- 'ids' => $orderIds,
- ];
- $response = request($url, json_encode($postData, JSON_UNESCAPED_UNICODE), 30, true, $this->commonHeader); V($response);
- return self::commonReponseResult($response);
- }
- /**
- * 公共的请去响应处理函数
- */
- public function commonReponseResult($response)
- {
- if ($response['httpcode'] != 200) {
- return ResultWrapper::fail('请求外部系统接口报错', ErrorCode::$apiNotResult);
- }
- $responseData = json_decode($response['content'], true);
- if($responseData['code'] != 0){
- return ResultWrapper::fail($responseData['message'], $responseData['code']);
- }
- return ResultWrapper::success(isset($responseData['result'])?$responseData['result']:$responseData['message']);
- }
- }
|