文件
mashangyoujiu/Application/Common/Lib/Maiyatian.class.php

520 行
28 KiB
PHP
可执行文件

此文件含有模棱两可的 Unicode 字符

此文件含有可能会与其他字符混淆的 Unicode 字符。 如果您是想特意这样的,可以安全地忽略该警告。 使用 Escape 按钮显示他们。

<?php
namespace Common\Lib;
class Maiyatian extends MaiyatianBase
{
/**
* 初始化
* @param integer $id 店铺标识
*/
public function __construct($id)
{
parent::__construct();
$this->store = (new \Common\Model\StoreModel)->where(['id' => $id])->find();
}
public function oauth()
{
return sprintf('%s/oauth/index/?app_key=%s&response_type=code&view=web&redirect_uri=%s&shop_id=%s&state=%s', C('MYT_OAUTH_DOMAIN'), C('MYT_APPKEY'), urlencode($this->redirectUri), $this->store['id'], $this->store['id']);
}
public function token($code)
{
$result = $this->request('/v1/channel/access_token', [
'grant_type' => 'shop',
'code' => $code,
'shop_id' => (string)$this->store['id'],
'category' => $this->store['maiyatian_category'],
'name' => $this->store['storetag'],
'type' => 'waimai',
'longitude' => $this->store['longitude'],
'latitude' => $this->store['latitude'],
]);
if ($result['code'] === 200) {
$data = json_decode($result['data'], true);
return $data;
}
}
/**
* 新订单
* @param array $data
* @param array order 订单主体信息
* @param string order.order_id 平台方订单唯一ID
* @param integer order.order_sn 平台方流水号,需要当天自然数增长,不能随便传一个数字
* @param string order.origin_tag 原始订单来源渠道标识(枚举值参考附录)
* @param boolean order.is_pre_order 是否预约单
* @param integer order.total_price 订单金额(单位:分)
* @param integer order.balance_price 实付金额(单位:分)
* @param integer order.create_time 下单时间(单位:unix 时间戳,精确到秒)
* @param integer order.delivery_time 期望送达时间(单位:unix 时间戳,精确到秒)
* @param integer order.delivery_end [可选] 期望截止时间(单位:unix 时间戳,精确到秒)
* @param integer order.delivery_type 配送类型:0=麦芽田自动适配,1=同城配送,2=全国快递
* @param boolean order.is_picker 是否自提
* @param integer order.pick_time [可选] 自提时间 (单位:unix 时间戳,精确到秒)
* @param string order.user_remark 用户备注
* @param string order.greeting [可选] 祝福语
* @param string order.pickup_code [可选] 取货码
* @param array order.order_fee 订单费用信息
* @param integer order.order_fee.total_fee 订单原价总金额(单位:分)
* @param integer order.order_fee.send_fee 顾客下单时支付的配送费(单位:分)
* @param integer order.order_fee.package_fee 餐盒费(单位:分)
* @param integer order.order_fee.discount_fee 优惠总金额(单位:分)
* @param integer order.order_fee.shop_fee 商户应收金额(单位:分)
* @param integer order.order_fee.user_fee 用户实付金额(单位:分)
* @param integer order.order_fee.pay_type 付款类型:1=货到付款,2=线上
* @param boolean order.order_fee.need_invoice [可选] 是否需要发票
* @param array order.order_fee.invoice [可选] 发票相关数据
* @param integer order.order_fee.invoice.type 发票类型:1=公司,2=个人
* @param string order.order_fee.invoice.title 发票抬头
* @param string order.order_fee.invoice.taxer_id 纳税人识别号
* @param string order.order_fee.invoice.email [可选] 发票邮箱,比如 example@qq.com
* @param integer order.order_fee.invoice.form_type [可选] 发票类型:1=纸质,2=电子
* @param integer order.order_fee.commission [可选] 用户备注佣金(单位:分)
* @param array order.order_fee.activity [可选] 活动详情
* @param integer order.order_fee.activity.type 活动类型(枚举值参考附录)
* @param string order.order_fee.activity.title 活动说明
* @param integer order.order_fee.activity.merchant 商户金额(单位:分)
* @param integer order.order_fee.activity.reduce 减免金额(单位:分)
* @param boolean order.order_fee.is_first [可选] 是否首次购买
* @param boolean order.order_fee.is_favorite [可选] 是否收藏用户
* @param array order.order_goods 订单商品
* @param string order.order_goods.goods_id 平台方商品ID
* @param string order.order_goods.goods_name 商品名称
* @param string order.order_goods.thumb 商品图片
* @param string order.order_goods.sku_id 平台方规格ID
* @param string order.order_goods.sku_name [可选] 商品SKU名称
* @param array order.order_goods.food_property 商品属性
* @param array order.order_goods.sku_attributes 规则信息
* @param string order.order_goods.sku_attributes.name 商品SKU套餐名称
* @param string order.order_goods.unit 商品单位
* @param integer order.order_goods.weight 商品单个重量
* @param string order.order_goods.upc [可选] 商品统一编码
* @param string order.order_goods.shelf_no [可选] 货架号
* @param integer order.order_goods.number 数量
* @param integer order.order_goods.goods_price 商品单价(单位:分)
* @param integer order.order_goods.goods_total_fee 商品总价(单位:分)
* @param integer order.order_goods.package_number [可选] 包装盒数量
* @param integer order.order_goods.package_price [可选] 包装盒单价(单位:分)
* @param integer order.order_goods.package_total_fee [可选] 包装盒总价(单位:分)
* @param integer order.order_goods.reduce_fee 商品折扣单价(单位:分)
* @param integer order.order_goods.discount_fee 商品总优惠金额(单位:分)
* @param integer order.order_goods.discount_platform_fee [可选] 渠道承担费用(单位:分)
* @param integer order.order_goods.discount_merchant_fee [可选] 商户承担费用(单位:分)
* @param integer order.order_goods.discount_agent_fee [可选] 代理商承担费用(单位:分)
* @param integer order.order_goods.discount_logistics_fee [可选] 物流承担费用(单位:分)
* @param integer order.order_goods.total_fee 合计费用(折扣后)(单位:分)
* @param string order.order_goods.goods_code [可选] 系统外,商户自定义商品编码ID
* @param string order.order_goods.sku_code [可选] 系统外,商户自定义商品SKU编码ID
* @param array order.customer 用户信息
* @param string order.customer.real_name 客户真实姓名
* @param string order.customer.phone 客户电话
* @param string order.customer.secret_phone 客户加密电话
* @param string order.customer.order_phone [可选] 预定人电话
* @param string order.customer.reserve_phone [可选] 备用电话
* @param string order.customer.address 客户详细地址
* @param string order.customer.longitude 收货经度(国测局02标准,如高德)
* @param string order.customer.latitude 收货纬度(国测局02标准,如高德)
* @param integer order.customer.update_time 订单创建时间(单位:unix 时间戳,精确到秒)
*/
public function orderCreated($data) {
$param = $this->orderParam($data);
$result = $this->request('/v1/channel/order_created', $param);
return $result['code'] === 200 && $result['message'] === 'ok';
}
/**
* 订单修改
* @param array $data
* @param array order 订单主体信息
* @param string order.order_id 平台方订单唯一ID
* @param integer order.order_sn 平台方流水号,需要当天自然数增长,不能随便传一个数字
* @param string order.origin_tag 原始订单来源渠道标识(枚举值参考附录)
* @param boolean order.is_pre_order 是否预约单
* @param integer order.total_price 订单金额(单位:分)
* @param integer order.balance_price 实付金额(单位:分)
* @param integer order.create_time 下单时间(单位:unix 时间戳,精确到秒)
* @param integer order.delivery_time 期望送达时间(单位:unix 时间戳,精确到秒)
* @param integer order.delivery_end [可选] 期望截止时间(单位:unix 时间戳,精确到秒)
* @param integer order.delivery_type 配送类型:0=麦芽田自动适配,1=同城配送,2=全国快递
* @param boolean order.is_picker 是否自提
* @param integer order.pick_time [可选] 自提时间 (单位:unix 时间戳,精确到秒)
* @param string order.user_remark 用户备注
* @param string order.greeting [可选] 祝福语
* @param string order.pickup_code [可选] 取货码
* @param array order.order_fee 订单费用信息
* @param integer order.order_fee.total_fee 订单原价总金额(单位:分)
* @param integer order.order_fee.send_fee 顾客下单时支付的配送费(单位:分)
* @param integer order.order_fee.package_fee 餐盒费(单位:分)
* @param integer order.order_fee.discount_fee 优惠总金额(单位:分)
* @param integer order.order_fee.shop_fee 商户应收金额(单位:分)
* @param integer order.order_fee.user_fee 用户实付金额(单位:分)
* @param integer order.order_fee.pay_type 付款类型:1=货到付款,2=线上
* @param boolean order.order_fee.need_invoice [可选] 是否需要发票
* @param array order.order_fee.invoice [可选] 发票相关数据
* @param integer order.order_fee.invoice.type 发票类型:1=公司,2=个人
* @param string order.order_fee.invoice.title 发票抬头
* @param string order.order_fee.invoice.taxer_id 纳税人识别号
* @param string order.order_fee.invoice.email [可选] 发票邮箱,比如 example@qq.com
* @param integer order.order_fee.invoice.form_type [可选] 发票类型:1=纸质,2=电子
* @param integer order.order_fee.commission [可选] 用户备注佣金(单位:分)
* @param array order.order_fee.activity [可选] 活动详情
* @param integer order.order_fee.activity.type 活动类型(枚举值参考附录)
* @param string order.order_fee.activity.title 活动说明
* @param integer order.order_fee.activity.merchant 商户金额(单位:分)
* @param integer order.order_fee.activity.reduce 减免金额(单位:分)
* @param boolean order.order_fee.is_first [可选] 是否首次购买
* @param boolean order.order_fee.is_favorite [可选] 是否收藏用户
* @param array order.order_goods 订单商品
* @param string order.order_goods.goods_id 平台方商品ID
* @param string order.order_goods.goods_name 商品名称
* @param string order.order_goods.thumb 商品图片
* @param string order.order_goods.sku_id 平台方规格ID
* @param string order.order_goods.sku_name [可选] 商品SKU名称
* @param array order.order_goods.food_property 商品属性
* @param array order.order_goods.sku_attributes 规则信息
* @param string order.order_goods.sku_attributes.name 商品SKU套餐名称
* @param string order.order_goods.unit 商品单位
* @param integer order.order_goods.weight 商品单个重量
* @param string order.order_goods.upc [可选] 商品统一编码
* @param string order.order_goods.shelf_no [可选] 货架号
* @param integer order.order_goods.number 数量
* @param integer order.order_goods.goods_price 商品单价(单位:分)
* @param integer order.order_goods.goods_total_fee 商品总价(单位:分)
* @param integer order.order_goods.package_number [可选] 包装盒数量
* @param integer order.order_goods.package_price [可选] 包装盒单价(单位:分)
* @param integer order.order_goods.package_total_fee [可选] 包装盒总价(单位:分)
* @param integer order.order_goods.reduce_fee 商品折扣单价(单位:分)
* @param integer order.order_goods.discount_fee 商品总优惠金额(单位:分)
* @param integer order.order_goods.discount_platform_fee [可选] 渠道承担费用(单位:分)
* @param integer order.order_goods.discount_merchant_fee [可选] 商户承担费用(单位:分)
* @param integer order.order_goods.discount_agent_fee [可选] 代理商承担费用(单位:分)
* @param integer order.order_goods.discount_logistics_fee [可选] 物流承担费用(单位:分)
* @param integer order.order_goods.total_fee 合计费用(折扣后)(单位:分)
* @param string order.order_goods.goods_code [可选] 系统外,商户自定义商品编码ID
* @param string order.order_goods.sku_code [可选] 系统外,商户自定义商品SKU编码ID
* @param array order.customer 用户信息
* @param string order.customer.real_name 客户真实姓名
* @param string order.customer.phone 客户电话
* @param string order.customer.secret_phone 客户加密电话
* @param string order.customer.order_phone [可选] 预定人电话
* @param string order.customer.reserve_phone [可选] 备用电话
* @param string order.customer.address 客户详细地址
* @param string order.customer.longitude 收货经度(国测局02标准,如高德)
* @param string order.customer.latitude 收货纬度(国测局02标准,如高德)
* @param integer order.customer.update_time 订单创建时间(单位:unix 时间戳,精确到秒)
*/
public function orderModified($data) {
$param = $this->orderParam($data);
$result = $this->request('/v1/channel/order_modified', $param);
return $result['code'] === 200 && $result['message'] === 'ok';
}
/**
* 订单确认
* @param string $orderId 平台方订单唯一ID
*/
public function orderConfirmed($orderId) {
$result = $this->request('/v1/channel/order_confirmed', [
'order_id' => $orderId,
'shop_id' => (string)$this->store['id'],
'update_time' => time(),
]);
return $result['code'] === 200 && $result['message'] === 'ok';
}
/**
* 订单催单
* @param array $data
* @param string order_id 平台方订单唯一ID
* @param integer remind_id 平台方催单ID
* @param string reason [可选] 催单原因
*/
public function orderRemind($data) {
$result = $this->request('/v1/channel/order_remind', [
'order_id' => $data['order_id'],
'shop_id' => (string)$this->store['id'],
'remind_id' => $data['remind_id'],
'reason' => $data['reason'],
'update_time' => time(),
]);
return $result['code'] === 200 && $result['message'] === 'ok';
}
/**
* 订单申请退款
* @param array $data
* @param string order_id 平台方订单唯一ID
* @param string refund_id [可选] 退款标识
* @param integer type 退款类型:1=全部,2=部分
* @param string reason 原因
* @param array goods 退款商品信息
* @param string goods.goods_id 平台方商品ID
* @param string goods.goods_name 商品名称
* @param string goods.upc 商品统一编码
* @param string goods.shelf_no 货架号
* @param string goods.sku_id 平台方规格ID
* @param integer goods.number 数量
* @param integer goods.goods_total_fee 商品总价(单位:分)
* @param integer goods.package_number 包装盒数量
* @param integer goods.package_fee 餐盒费
* @param integer goods.refund_fee 退款金额
* @param integer goods.total_price 订单金额
* @param integer goods.count 商品数量
*/
public function orderApplyFefund($data) {
$result = $this->request('/v1/channel/order_apply_refund', [
'order_id' => $data['order_id'],
'shop_id' => (string)$this->store['id'],
'refund_id' => $data['refund_id'],
'type' => $data['type'],
'reason' => $data['reason'],
'goods' => [
'goods_id' => $data['goods']['goods_id'],
'goods_name' => $data['goods']['goods_name'],
'upc' => $data['goods']['upc'],
'shelf_no' => $data['goods']['shelf_no'],
'sku_id' => $data['goods']['sku_id'],
'number' => $data['goods']['number'],
'goods_total_fee' => $data['goods']['goods_total_fee'],
'package_number' => $data['goods']['package_number'],
'package_fee' => $data['goods']['package_fee'],
'refund_fee' => $data['goods']['refund_fee'],
'total_price' => $data['goods']['total_price'],
'count' => $data['goods']['count'],
],
'update_time' => time(),
]);
return $result['code'] === 200 && $result['message'] === 'ok';
}
/**
* 订单退款
* @param array $data
* @param string order_id 平台方订单唯一ID
* @param string status 退款状态:1=确认,2=驳回,3=用户取消退款申请
* @param integer type 退款类型:1=全部,2=部分
* @param string reason 原因
* @param array goods 退款商品信息
* @param string goods.goods_id 平台方商品ID
* @param string goods.goods_name 商品名称
* @param string goods.upc 商品统一编码
* @param string goods.shelf_no 货架号
* @param string goods.sku_id 平台方规格ID
* @param integer goods.number 数量
* @param integer goods.goods_total_fee 商品总价(单位:分)
* @param integer goods.package_number 包装盒数量
* @param integer goods.package_fee 餐盒费
* @param integer goods.refund_fee 退款金额
* @param integer goods.total_price 订单金额
* @param integer goods.count 商品数量
*/
public function orderRefunded($data) {
$result = $this->request('/v1/channel/order_refunded', [
'order_id' => $data['order_id'],
'shop_id' => (string)$this->store['id'],
'status' => $data['status'],
'type' => $data['type'],
'reason' => $data['reason'],
'goods' => [
'goods_id' => $data['goods']['goods_id'],
'goods_name' => $data['goods']['goods_name'],
'upc' => $data['goods']['upc'],
'shelf_no' => $data['goods']['shelf_no'],
'sku_id' => $data['goods']['sku_id'],
'number' => $data['goods']['number'],
'goods_total_fee' => $data['goods']['goods_total_fee'],
'package_number' => $data['goods']['package_number'],
'package_fee' => $data['goods']['package_fee'],
'refund_fee' => $data['goods']['refund_fee'],
'total_price' => $data['goods']['total_price'],
'count' => $data['goods']['count'],
],
'update_time' => time(),
]);
return $result['code'] === 200 && $result['message'] === 'ok';
}
/**
* 订单取消
* @param array $data
* @param string order_id 平台方订单唯一ID
* @param string reason 催单原因
* @param integer reason_code 取消类型:1=系统取消,2=用户取消,3=客服取消,4=商户取消,5=其他,8=线下取消
*/
public function orderCanceled($data) {
$result = $this->request('/v1/channel/order_canceled', [
'order_id' => $data['order_id'],
'shop_id' => (string)$this->store['id'],
'reason' => $data['reason'],
'reason_code' => $data['reason_code'],
'update_time' => time(),
]);
return $result['code'] === 200 && $result['message'] === 'ok';
}
/**
* 订单完成
* @param array $data
* @param string orderId 平台方订单唯一ID
*/
public function orderDone($orderId) {
$result = $this->request('/v1/channel/order_done', [
'order_id' => $orderId,
'shop_id' => (string)$this->store['id'],
'update_time' => time(),
]);
return $result['code'] === 200 && $result['message'] === 'ok';
}
/**
* 平台方自配送状态同步
* @param array $data
* @param string order_no 三方平台订单号
* @param string source_order_no 下单方提供的单号
* @param string status 配送状态
* @param string rider_name 骑手姓名
* @param string rider_phone 骑手手机号
* @param string logistic_tag 配送方
* @param string longitude 经度(国测局02标准,如高德)
* @param string latitude 纬度(国测局02标准,如高德)
* @param string pickup_code [可选] 取货码
*/
public function selfDeliveryChange($data) {
$result = $this->request('/v1/channel/self_delivery_change', [
'order_no' => $data['order_no'],
'source_order_no' => $data['source_order_no'],
'shop_id' => (string)$this->store['id'],
'status' => $data['status'],
'rider_name' => $data['rider_name'],
'rider_phone' => $data['rider_phone'],
'logistic_tag' => $data['logistic_tag'],
'longitude' => $data['longitude'],
'latitude' => $data['latitude'],
'pickup_code' => $data['pickup_code'],
'update_time' => time(),
]);
return $result['code'] === 200 && $result['message'] === 'ok';
}
/**
* 查询订单信息
* @param string $orderId 平台方订单唯一ID
*/
public function queryOrder($orderId) {
$result = $this->request('/v1/channel/query_order', [
'order_id' => $orderId,
'shop_id' => (string)$this->store['id'],
]);
if ($result['code'] === 200 && $result['message'] === 'ok') {
return @json_decode($result['data'], true);
}
}
private function orderParam($data) {
$param = [
'order' => [
'order_id' => $data['order']['order_id'],
'order_sn' => $data['order']['order_sn'],
'shop_id' => (string)$this->store['id'],
'shop_name' => $this->store['storetag'],
'origin_tag' => $data['order']['origin_tag'],
'category' => $this->store['maiyatian_category'],
'is_pre_order' => $data['order']['is_pre_order'],
'total_price' => $data['order']['total_price'],
'balance_price' => $data['order']['balance_price'],
'create_time' => $data['order']['create_time'],
'delivery_time' => $data['order']['delivery_time'],
'delivery_end' => $data['order']['delivery_end'],
'delivery_type' => $data['order']['delivery_type'],
'is_picker' => $data['order']['is_picker'],
'pick_time' => empty($data['order']['pick_time']) ? 0 : $data['order']['pick_time'],
'user_remark' => $data['order']['user_remark'],
'greeting' => empty($data['order']['greeting']) ? '' : $data['order']['greeting'],
'pickup_code' => empty($data['order']['pickup_code']) ? '' : $data['order']['pickup_code'],
'order_fee' => [
'total_fee' => $data['order']['order_fee']['total_fee'],
'send_fee' => $data['order']['order_fee']['send_fee'],
'package_fee' => $data['order']['order_fee']['package_fee'],
'discount_fee' => $data['order']['order_fee']['discount_fee'],
'shop_fee' => $data['order']['order_fee']['shop_fee'],
'user_fee' => $data['order']['order_fee']['user_fee'],
'pay_type' => $data['order']['order_fee']['pay_type'],
'commission' => is_numeric($data['order']['order_fee']['commission']) ? $data['order']['order_fee']['commission'] : 0,
'is_first' => is_bool($data['order']['order_fee']['is_first']) ? $data['order']['order_fee']['is_first'] : true,
'is_favorite' => is_bool($data['order']['order_fee']['is_favorite']) ? $data['order']['order_fee']['is_favorite'] : false,
],
'order_goods' => [],
],
'order_customer' => [
'real_name' => $data['order_customer']['real_name'],
'phone' => $data['order_customer']['phone'],
'secret_phone' => $data['order_customer']['secret_phone'],
'order_phone' => empty($data['order_customer']['order_phone']) ? '' : $data['order_customer']['order_phone'],
'reserve_phone' => empty($data['order_customer']['reserve_phone']) ? '' : $data['order_customer']['reserve_phone'],
'address' => $data['order_customer']['address'],
'longitude' => $data['order_customer']['longitude'],
'latitude' => $data['order_customer']['latitude'],
],
'update_time' => time(),
];
if (is_array($data['order']['order_goods'])) {
foreach($data['order']['order_goods'] as $item) {
$data['order']['order_goods'][] = [
'goods_id' => $item['goods_id'],
'goods_name' => $item['goods_name'],
'thumb' => $item['thumb'],
'sku_id' => $item['sku_id'],
'sku_name' => empty($item['sku_name']) ? '' : $item['sku_name'],
'food_property' => $item['food_property'],
'sku_attributes' => [
'name' => $item['sku_attributes']['name'],
],
'unit' => $item['unit'],
'weight' => $item['weight'],
'upc' => empty($item['upc']) ? '' : $item['upc'],
'shelf_no' => empty($item['shelf_no']) ? '' : $item['shelf_no'],
'number' => $item['number'],
'goods_price' => $item['goods_price'],
'goods_total_fee' => $item['goods_total_fee'],
'package_number' => is_numeric($item['package_number']) ? $item['package_number'] : 0,
'package_price' => is_numeric($item['package_price']) ? $item['package_price'] : 0,
'package_total_fee' => is_numeric($item['package_total_fee']) ? $item['package_total_fee'] : 0,
'reduce_fee' => $item['reduce_fee'],
'discount_fee' => $item['discount_fee'],
'discount_platform_fee' => is_numeric($item['discount_platform_fee']) ? $item['discount_platform_fee'] : 0,
'discount_merchant_fee' => is_numeric($item['discount_merchant_fee']) ? $item['discount_merchant_fee'] : 0,
'discount_agent_fee' => is_numeric($item['discount_agent_fee']) ? $item['discount_agent_fee'] : 0,
'discount_logistics_fee' => is_numeric($item['discount_logistics_fee']) ? $item['discount_logistics_fee'] : 0,
'total_fee' => $item['total_fee'],
'goods_code' => empty($item['goods_code']) ? '' : $item['goods_code'],
'sku_code' => empty($item['sku_code']) ? '' : $item['sku_code'],
];
}
}
if ($data['order']['order_fee']['need_invoice'] && is_array($data['order']['order_fee']['invoice'])) {
$param['need_invoice'] = true;
$param['invoice'] = [
'type' => $data['order']['order_fee']['invoice']['type'],
'title' => $data['order']['order_fee']['invoice']['title'],
'taxer_id' => $data['order']['order_fee']['invoice']['taxer_id'],
'email' => $data['order']['order_fee']['invoice']['email'] || '',
'form_type' => $data['order']['order_fee']['invoice']['form_type'] || 2,
];
}
if (is_array($data['order']['order_fee']['activity'])) {
$param['activity'] = [];
foreach($data['order']['order_fee']['activity'] as $item) {
$param['activity'][] = [
'type' => $item['type'],
'title' => $item['title'],
'merchant' => $item['merchant'],
'reduce' => $item['reduce'],
];
}
}
return $param;
}
}