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