diff --git a/app/Constants/v3/Employee.php b/app/Constants/v3/Employee.php new file mode 100644 index 0000000..959f11f --- /dev/null +++ b/app/Constants/v3/Employee.php @@ -0,0 +1,19 @@ +request->input('for_user_type'); + + $templates = $this->miniprogramService->getSubscribeMessageTempList($forUserType); + return $this->success(['templates' => $templates]); + } + +} \ No newline at end of file diff --git a/app/JsonRpc/OrdersService.php b/app/JsonRpc/OrdersService.php index 47945e3..0473a12 100644 --- a/app/JsonRpc/OrdersService.php +++ b/app/JsonRpc/OrdersService.php @@ -10,7 +10,9 @@ use App\Exception\ErrorCodeException; use App\Model\v3\Order; use App\Model\v3\OrderGoods; use App\Model\v3\OrderMain; +use App\Model\v3\User; use App\Service\v3\Interfaces\FinancialRecordServiceInterface; +use App\Service\v3\Interfaces\MiniprogramServiceInterface; use App\Service\v3\Interfaces\OrderOnlineServiceInterface; use App\Service\v3\Interfaces\SeparateAccountsServiceInterface; use EasyWeChat\Factory; @@ -56,6 +58,12 @@ class OrdersService implements OrdersServiceInterface */ protected $badgeService; + /** + * @Inject + * @var MiniprogramServiceInterface + */ + protected $miniprogramService; + /** * 订单完成 * @param $global_order_id @@ -309,11 +317,16 @@ class OrdersService implements OrdersServiceInterface // 计算本次退款实际退款金额 $refundStoreAmount = bcsub($order->money, $couponMoney, 2); $this->financialRecordService->storeRefundDirect($order->store->user_id, $order->id, $refundStoreAmount); + + $this->miniprogramService->subscribeMsgForSingleRefund($order->id, $refundStoreAmount, '', $note); } } elseif ($refundType == 'sub'||$refundType == 'goods') { # 退子订单或者退单品的话,商户只有一个 $orderChildren = Order::query()->with('store:user_id')->where(['id' => $order_child_id])->get(); $this->financialRecordService->storeRefundDirect($orderChild->store->user_id, $orderChild->id, $refundAmount); + + $orderGoodsId = $order_goods_id ?: ''; + $this->miniprogramService->subscribeMsgForSingleRefund($order_child_id, $refundAmount, $orderGoodsId, $note); } $this->financialRecordService->userRefundDirect($orderMain->user_id, $orderMain->global_order_id, $refundAmount); @@ -342,4 +355,31 @@ class OrdersService implements OrdersServiceInterface } } + + /** + * 配送开始的时候,管理后台点击配送并分配配送员 + * 做一些处理: + * 1、发送订阅消息给用户 + * 2、发送订阅消息给骑手 + * @param $global_order_id + */ + public function onlineDeliveryStart($global_order_id) + { + try { + $this->miniprogramService->subscribeMsgForDeliveryStart($global_order_id); + return [ + "status" => 200, + "code" => 0, + "result" => [], + "message" => '处理成功' + ]; + } catch (\Exception $e) { + return [ + "status" => 200, + "code" => $e->getCode(), + "result" => [], + "message" => $e->getMessage() + ]; + } + } } \ No newline at end of file diff --git a/app/Model/v3/Employees.php b/app/Model/v3/Employees.php index feae515..5302485 100644 --- a/app/Model/v3/Employees.php +++ b/app/Model/v3/Employees.php @@ -6,6 +6,40 @@ use App\Model\Model; use Hyperf\Database\Model\Builder; class Employees extends Model { + + protected $positions = [ + 1=>'董事长', + 2=>'总经理', + 3=>'人力资源总监', + 4=>'CTO', + 5=>'财务经理', + 6=>'运营总监', + 7=>'招商总监', + 8=>'PHP研发主管', + 9=>'迁江智慧商城主管', + 10=>'拓展部主管', + 11=>'拓展部副主管', + 12=>'拓展部经理', + 13=>'运维部经理', + 14=>'产品主管', + 15=>'策划经理', + 16=>'运维部副经理', + 17=>'新媒体运营', + 18=>'平面设计师', + 19=>'UI设计师', + 20=>'前端开发工程师', + 21=>'PHP研发工程师', + 22=>'测试工程师', + 23=>'招商经理', + 24=>'服务站管理员', + 25=>'运维专员', + 26=>'拓展经理', + 27=>'行政助理', + 28=>'出纳', + 29=>'骑手', + 30=>'服务专员', + ]; + protected $table = 'lanzu_employees'; protected $casts = [ diff --git a/app/Model/v3/Order.php b/app/Model/v3/Order.php index 228478b..729f212 100644 --- a/app/Model/v3/Order.php +++ b/app/Model/v3/Order.php @@ -10,6 +10,7 @@ class Order extends Model protected $appends = [ 'created_at_text', + 'updated_at_text', ]; protected $fillable = [ @@ -34,6 +35,11 @@ class Order extends Model return date('Y-m-d H:i:s', $this->attributes['created_at']); } + public function getUpdatedAtTextAttribute() + { + return date('Y-m-d H:i:s', $this->attributes['updated_at']); + } + public function orderGoods() { return $this->hasMany(OrderGoods::class, 'order_id', 'id'); diff --git a/app/Model/v3/OrderMain.php b/app/Model/v3/OrderMain.php index d08009a..99ccb29 100644 --- a/app/Model/v3/OrderMain.php +++ b/app/Model/v3/OrderMain.php @@ -53,11 +53,13 @@ class OrderMain extends Model protected $appends = [ 'created_at_text', + 'updated_at_text', 'state_text', 'pay_time_text', 'pay_type_text', 'shipping_type_text', - 'complete_time_text' + 'complete_time_text', + 'delivery_time_text', ]; protected $casts = [ @@ -69,6 +71,11 @@ class OrderMain extends Model return date('Y-m-d H:i:s', $this->attributes['created_at']); } + public function getUpdatedAtTextAttribute() + { + return date('Y-m-d H:i:s', $this->attributes['updated_at']); + } + public function getPayTimeTextAttribute() { return date('Y-m-d H:i:s', $this->attributes['pay_time']); @@ -79,6 +86,11 @@ class OrderMain extends Model return date('Y-m-d H:i:s', $this->attributes['complete_time']); } + public function getDeliveryTimeTextAttribute() + { + return date('Y-m-d H:i:s', $this->attributes['delivery_time']); + } + public function getStateTextAttribute() { if ($this->attributes['state'] == OrderState::DELIVERY) { diff --git a/app/Model/v3/SubscribeMessageTemplate.php b/app/Model/v3/SubscribeMessageTemplate.php new file mode 100644 index 0000000..c83de8e --- /dev/null +++ b/app/Model/v3/SubscribeMessageTemplate.php @@ -0,0 +1,22 @@ +where([$this->getTable().'.is_active' => 1]); + }); + } + +} \ No newline at end of file diff --git a/app/Service/v3/Implementations/MiniprogramService.php b/app/Service/v3/Implementations/MiniprogramService.php index 4996a93..6acb62d 100644 --- a/app/Service/v3/Implementations/MiniprogramService.php +++ b/app/Service/v3/Implementations/MiniprogramService.php @@ -2,18 +2,30 @@ namespace App\Service\v3\Implementations; +use App\Commons\Log; +use App\Constants\v3\Employee; +use App\Constants\v3\Payment; +use App\Model\v3\Employees; use App\Model\v3\Order; use App\Model\v3\OrderGoods; use App\Model\v3\OrderMain; use App\Model\v3\Store; +use App\Model\v3\SubscribeMessageTemplate; use App\Model\v3\User; use App\Service\v3\Interfaces\MiniprogramServiceInterface; use EasyWeChat\Factory; use Hyperf\Guzzle\CoroutineHandler; +use Hyperf\Di\Annotation\Inject; class MiniprogramService implements MiniprogramServiceInterface { + /** + * @Inject + * @var Log + */ + protected $log; + /** * @inheritDoc */ @@ -24,7 +36,7 @@ class MiniprogramService implements MiniprogramServiceInterface $order = OrderMain::query()->where(['global_order_id' => $globalOrderId])->first()->toArray(); $payTypes = ['1' => '微信支付', '2' => '余额支付', '3' => '积分支付', '4' => '货到付款']; - $address_store = $order['address'] . ';' .$order['name']. ';'. substr_replace($order['tel'],'****',3,4); + $address_store = $order['address'] . ';' .$order['name']. ';'. mb_substr_replace($order['tel'],'****',3,4); $address = $order['address'] . ';' .$order['name']. ';'. $order['tel']; // 查询子订单,用于发消息给商户 @@ -44,8 +56,8 @@ class MiniprogramService implements MiniprogramServiceInterface $goods_temp = []; foreach ($order_goods as $k => &$goods) { - array_push($goods_temp, $goods['name']."*".$goods['number']."/".($goods['goods_unit'])); - array_push($goods_temp_all, $goods['name']."*".$goods['number']."/".($goods['goods_unit'])); + array_push($goods_temp, $goods['name']."*".$goods['number']); + array_push($goods_temp_all, $goods['name']."*".$goods['number']); } // 商户/门店的openid @@ -70,6 +82,23 @@ class MiniprogramService implements MiniprogramServiceInterface ]; $ret_store = $this->sendTempMsg($store['openid'], '-M7DG_ACwJxqdAvyvJuAnPpx4xaLf3VkkN0fckno71c',$data_store); + + // // 小程序订阅消息发给商户 + // // 支付金额:{{amount1.DATA}}\n订单编号:{{character_string2.DATA}}\n支付时间:{{date3.DATA}}\n商品详情:{{thing4.DATA}}\n备注:{{thing7.DATA}}\n + // $tmplId = 'UfCON4Dj_7aH_Q5k_HvDgzUb3gu67TokPITsJuvCMxc'; + // $page = 'pages/shopOrders/shopOrders?status=paid&store_id='.$store['id']; + // $this->sendSubscribeMessage( + // $store['openid'], + // $tmplId, + // [ + // 'amount1' => $item->money, + // 'character_string2' => $item->order_num, + // 'date3' => $item->created_at_text?:date('Y-m-d H:i:s'), + // 'thing4' => mb_substr(implode(";", $goods_temp_all),0,18).'..', + // 'thing7' => mb_substr(($item->note?:'无备注'), 0, 18).'..', + // ], + // $page + // ); } // 模板数据发送消息给用户 @@ -97,6 +126,9 @@ class MiniprogramService implements MiniprogramServiceInterface public function sendTemMsgForOfflineOrder($globalOrderId) { + // 主订单信息 + $orderMain = OrderMain::query()->where(['global_order_id' => $globalOrderId])->first(); + // 查询子订单,用于发消息给商户 $order_children = Order::query() ->where(['order_main_id' => $globalOrderId]) @@ -125,6 +157,23 @@ class MiniprogramService implements MiniprogramServiceInterface ]; $ret_store = $this->sendTempMsg($store['openid'], 'lxVbC6PVpKbiO44bYqLmacl-BaME70D47Q0jn2Link0',$data_store); + + // // 小程序订阅消息发给商户 + // // 付款金额:{{amount1.DATA}}\n商户名称:{{thing2.DATA}}\n支付方式:{{thing3.DATA}}\n交易单号:{{character_string4.DATA}}\n交易时间:{{time5.DATA}}\n + // $tmplId = 'PCRNmKGb7t98xsz_GPux3rhXjsu68TPI3nXR7749dC0'; + // $page = 'pages/faceOrderList/faceOrderList?store_id='.$store['id']; + // $res = $this->sendSubscribeMessage( + // $store['openid'], + // $tmplId, + // [ + // 'amount1' => $item['money'], + // 'thing2' => mb_substr($store['name'], 0, 18).'..', + // 'thing3' => mb_substr(Payment::getMessage($orderMain->pay_type), 0, 18).'..', + // 'character_string4' => $item['order_num'], + // 'time5' => $item['created_at_text']??date('Y-m-d H:i:s'), + // ], + // $page + // ); } } @@ -149,6 +198,153 @@ class MiniprogramService implements MiniprogramServiceInterface $ret_user = $this->sendTempMsg($openid,'ypZ7xdHUjWrRG8P-MD42dhpp6kUlh4Unoh7eTSrLZEg', $data_user); } + /** + * @inheritDoc + */ + public function subscribeMsgForSingleRefund($orderId, $refundStoreAmount, $orderGoodsId = '', $note = '') + { + // TODO 暂时不发 + return; + + $order = Order::query()->where(['id' => $orderId])->first(); + $store = Store::query()->where(['id' => $order->store_id])->first(); + $storeOpenid = User::query()->where(['id' => $store->user_id])->value('openid'); + + $goodsInfo = []; + if ($orderGoodsId) { + $goodsInfo = OrderGoods::query()->where(['id' => $orderGoodsId])->pluck('name')->toArray(); + } else { + $goodsInfo = OrderGoods::query()->where(['order_id' => $orderId])->pluck('name')->toArray(); + } + + // 小程序订阅消息发给商户 + // 订单编号:{{character_string7.DATA}}\n商品名称:{{thing10.DATA}}\n退款金额:{{amount3.DATA}}\n处理时间:{{date4.DATA}}\n退款说明:{{thing5.DATA}}\n + $tmplId = 'OaWeg0q40NVW2WeO5BY1TFdWi4GsgIY1rFBwo2wDa0g'; + $page = 'pages/shopOrders/shopOrders?status=refund&store_id='.$store->id; + $this->sendSubscribeMessage( + $storeOpenid, + $tmplId, + [ + 'character_string7' => $order->order_num, + 'thing10' => mb_substr(implode(';', $goodsInfo),0,18).'..', + 'amount3' => $refundStoreAmount, + 'date4' => $order->updated_at_text ?? date('Y-m-d H:i:s'), + 'thing5' => mb_substr($note ?: '退款', 0, 18).'..', + ], + $page + ); + } + + /** + * @inheritDoc + */ + public function subscribeMsgForDeliveryStart($globalOrderId) + { + // 主订单信息 + $orderMain = OrderMain::query()->where(['global_order_id' => $globalOrderId])->first(); + if (!$orderMain) { + return false; + } + + // 订单商品 + $orderIds = Order::query()->where(['order_main_id' => $globalOrderId])->pluck('id')->toArray(); + $goodsInfo = OrderGoods::query()->whereIn('order_id', $orderIds)->pluck('name')->toArray(); + + // 骑手信息 + $horseman = Employees::query()->where(['id' => $orderMain->horseman_id])->whereJsonContains('position', [(string)Employee::TYPE_HORSEMAN])->first(); + + // 发送给用户的 + // 订单编号:{{character_string6.DATA}}\n商品名称:{{thing8.DATA}}\n骑手信息:{{thing7.DATA}}\n送出时间:{{date3.DATA}}\n温馨提示:{{thing4.DATA}}\n + $userTmplId = env('APP_ENV') == 'prod' ? '6E09Od5Ofy08C3qx3eJrOQiWT75uUwIxgG7ta2W75BQ' : 'jZMTjlflXrAO7bPk5Lq_rFjol9Yuq5i4czwwrJbteqk'; + $userPage = 'pages/orderDetail/orderDetail?global_order_id=' . $globalOrderId; + $userOpenid = User::query()->where(['id' => $orderMain->user_id])->value('openid'); + + $sendHorsemanInfo = $horseman->name.'|电话'.$horseman->tel; + $sendNote = '预计'.$orderMain->delivery_time_note.'送达,点击看订单详细信息哦!'; + $sendGoodsInfo = implode(';', $goodsInfo); + + $this->sendSubscribeMessage( + $userOpenid, + $userTmplId, + [ + 'character_string6' => $orderMain->global_order_id, + 'thing8' => mb_strlen($sendGoodsInfo)>18 ? mb_substr($sendGoodsInfo, 0, 18).'..' : $sendGoodsInfo, + 'thing7' => mb_strlen($sendHorsemanInfo)>18 ? mb_substr($sendHorsemanInfo, 0, 18).'..' : $sendHorsemanInfo, + 'date3' => $orderMain->updated_at_text ?? '', + 'thing4' => mb_strlen($sendNote)>18 ? mb_substr($sendNote, 0, 18).'..' : $sendNote, + ], + $userPage + ); + + // // 发送给骑手的 + // // 订单编号:{{character_string1.DATA}}\n商品信息:{{thing8.DATA}}\n收货地址:{{thing9.DATA}}\n预约时间:{{time17.DATA}}\n温馨提示:{{thing11.DATA}}\n + // $horsemanTmplId = '6gxjnBZ4bLnaMC0g8wRaP46jGUZU7YqfYb1FPpJVr50'; + // $horsemanPage = 'pages/deliverymanOrdersDetail/deliverymanOrdersDetail?global_order_id=' . $globalOrderId . '&employees_id=' . $horseman->id; + // $horsemanOpenid = User::query()->where(['id' => $horseman->user_id])->value('openid'); + // $deliveryNote = $orderMain->delivery_start_time ? date('Y-m-d H:i:s', $orderMain->delivery_start_time+1800) : date('Y-m-d H:i:s', time()+1800); + // + // if (strpos($orderMain->delivery_time_note, ' - ') !== false) { + // $arr = explode(' - ', $orderMain->delivery_time_note); + // if (is_array($arr) && isset($arr[0]) && $arr[0]) { + // $deliveryNote = date('Y-m-d').' '.$orderMain->delivery_time_note.':00'; + // } + // } + // + // $this->sendSubscribeMessage( + // $horsemanOpenid, + // $horsemanTmplId, + // [ + // 'character_string1' => $orderMain->global_order_id, + // 'thing8' => mb_substr(implode(';', $goodsInfo),0,18).'..', + // 'thing9' => mb_substr(($orderMain->name.'|'.$orderMain->tel.'|'.$orderMain->address), 0, 18).'..', + // 'time17' => $deliveryNote, + // 'thing11' => '有新配送订单,请注意及时取货,辛苦了!', + // ], + // $horsemanPage + // ); + + } + + /** + * @inheritDoc + */ + public function subscribeMsgForOrderComplete($orderMain) + { + + // 主订单信息 + if (!($orderMain instanceof OrderMain)) { + $orderMain = OrderMain::query()->where(['global_order_id' => $orderMain])->first(); + } + if (!$orderMain) { + return false; + } + + // 骑手信息 + $horseman = Employees::query()->where(['id' => $orderMain->horseman_id])->whereJsonContains('position', [(string)Employee::TYPE_HORSEMAN])->first(); + + // 发送小程序订阅消息给用户提示用户订单完成 + // 订单编号:{{character_string2.DATA}}\n订单金额:{{amount5.DATA}}\n配送地址:{{thing3.DATA}}\n配送人员:{{thing4.DATA}}\n送达时间:{{time6.DATA}}\n + $userTmplId = env('APP_ENV') == 'prod' ? 'r7NktOF1-DZwB-KXLcCI_PgFKmVi1onsClFmL6zQtLY' : 'slYHfLTzKDGWRxnNLyJBr7sb__PEhh9OCrSBpMW_pdE'; + $userPage = 'pages/orderDetail/orderDetail?global_order_id=' . $orderMain->global_order_id; + $userOpenid = User::query()->where(['id' => $orderMain->user_id])->value('openid'); + + $sendAddress = $orderMain->name.'|'.$orderMain->address.'|'.$orderMain->tel; + $sendHorseman = $horseman->name.'|'.$horseman->tel; + + $this->sendSubscribeMessage( + $userOpenid, + $userTmplId, + [ + 'character_string2' => $orderMain->global_order_id, + 'amount5' => $orderMain->money, + 'thing3' => mb_strlen($sendAddress)>18 ? mb_substr($sendAddress,0,18).'..' : $sendAddress, + 'thing4' => mb_strlen($sendHorseman)>18 ? mb_substr($sendHorseman,0,18).'..' : $sendHorseman, + 'time6' => $orderMain->delivery_time_text?:date('Y-m-d H:i:s'), + ], + $userPage + ); + } + /** * @inheritDoc */ @@ -206,7 +402,73 @@ class MiniprogramService implements MiniprogramServiceInterface $app = Factory::miniProgram(config('wechat.applet')); $app['guzzle_handler'] = CoroutineHandler::class; - $app->uniform_message->send($template); + $res = $app->uniform_message->send($template); + + if (!isset($res['errcode']) || $res['errcode'] != '0') { + + $backtrace = debug_backtrace(); + array_shift($backtrace); + + $this->log->event('template_message_error', ['from' => json_encode($backtrace), 'res' => json_encode($res), 'msg' => json_encode($template)]); + } + } + + public function sendSubscribeMessage($openid, $template_id, $data, $page = '') + { + if (empty($openid) || empty($template_id) || empty($data)) { + return ; + } + + $app = Factory::miniProgram(config('wechat.applet')); + $app['guzzle_handler'] = CoroutineHandler::class; + + $msgData = [ + 'touser' => $openid, + 'template_id' => $template_id, + 'page' => $page, + 'miniprogram_state' => env('APP_ENV') == 'prod' ? 'formal' : 'developer', + 'data' => $data + ]; + + $res = $app->subscribe_message->send($msgData); + if (!isset($res['errcode']) || $res['errcode'] != '0') { + + $backtrace = debug_backtrace(); + array_shift($backtrace); + + $this->log->event('subscribe_message_error', ['from' => json_encode($backtrace), 'res' => json_encode($res), 'msg' => json_encode($msgData)]); + } + return $res; + } + + public function getSubscribeMessageTempList($forUserType) + { + + if ($forUserType == '') { + $app = Factory::miniProgram(config('wechat.applet')); + $app['guzzle_handler'] = CoroutineHandler::class; + $result = $app->subscribe_message->getTemplates()['data']; + + $res = []; + foreach ($result as $key => &$tmpl) { + $res[] = [ + 'template_id' => $tmpl['priTmplId'] ?? '', + 'title' => $tmpl['title'] ?? '', + ]; + } + + return $res; + + } else { + + $builder = SubscribeMessageTemplate::query()->select('pri_tmpl_id as template_id', 'title'); + if ($forUserType != 'all') { + $builder = $builder->where(['for_user_type' => $forUserType]); + } + return $builder->get()->toArray(); + + } + } } \ No newline at end of file diff --git a/app/Service/v3/Implementations/OrderOnlineService.php b/app/Service/v3/Implementations/OrderOnlineService.php index 158d501..4236c3d 100644 --- a/app/Service/v3/Implementations/OrderOnlineService.php +++ b/app/Service/v3/Implementations/OrderOnlineService.php @@ -3,6 +3,7 @@ namespace App\Service\v3\Implementations; use App\Commons\Log; +use App\Constants\v3\Employee; use App\Constants\v3\ErrorCode; use App\Constants\v3\LogLabel; use App\Constants\v3\OrderState; @@ -31,6 +32,7 @@ use App\Service\v3\Interfaces\GoodsActivityServiceInterface; use App\Service\v3\Interfaces\GoodsInventoryServiceInterface; use App\Service\v3\Interfaces\GoodsServiceInterface; use App\Service\v3\Interfaces\InitialDeliveryServiceInterface; +use App\Service\v3\Interfaces\MiniprogramServiceInterface; use App\Service\v3\Interfaces\PaymentServiceInterface; use App\Service\v3\Interfaces\ShopCartUpdateServiceInterface; use App\Service\v3\Interfaces\UserAddressServiceInterface; @@ -113,6 +115,12 @@ class OrderOnlineService implements OrderOnlineServiceInterface */ protected $goodsInventoryService; + /** + * @Inject + * @var MiniprogramServiceInterface + */ + protected $miniprogramService; + /** * 下单 * @param $marketId @@ -749,9 +757,14 @@ class OrderOnlineService implements OrderOnlineServiceInterface throw new ErrorCodeException(ErrorCode::ORDER_COMPLETE_FAIL); } - // 记录badge - $orderChildIds = Order::query()->where(['order_main_id' => $orderMain->global_order_id])->pluck('store_id'); - $this->badgeService->doByOrder($orderMain->user_id, $orderChildIds, $orderMain->global_order_id, OrderState::COMPLETED); + co(function () use ($orderMain) { + // 记录badge + $orderChildIds = Order::query()->where(['order_main_id' => $orderMain->global_order_id])->pluck('store_id'); + $this->badgeService->doByOrder($orderMain->user_id, $orderChildIds, $orderMain->global_order_id, OrderState::COMPLETED); + + // 发送订阅消息 + $this->miniprogramService->subscribeMsgForOrderComplete($orderMain); + }); return true; } diff --git a/app/Service/v3/Interfaces/MiniprogramServiceInterface.php b/app/Service/v3/Interfaces/MiniprogramServiceInterface.php index 9112b83..e78c329 100644 --- a/app/Service/v3/Interfaces/MiniprogramServiceInterface.php +++ b/app/Service/v3/Interfaces/MiniprogramServiceInterface.php @@ -2,6 +2,8 @@ namespace App\Service\v3\Interfaces; +use App\Model\v3\OrderMain; + interface MiniprogramServiceInterface { /** @@ -28,6 +30,29 @@ interface MiniprogramServiceInterface */ public function sendTemMsgForAward($money, $note, $openid, $time); + /** + * 直接退款时订阅消息通知商户 + * @param $orderId + * @param $refundStoreAmount + * @param $orderGoodsId + * @return mixed + */ + public function subscribeMsgForSingleRefund($orderId, $refundStoreAmount, $orderGoodsId = ''); + + /** + * 订单开始配送订阅消息通知用户和骑手 + * @param $globalOrderId + * @return mixed + */ + public function subscribeMsgForDeliveryStart($globalOrderId); + + /** + * 订单完成发送订阅消息给用户 + * @param OrderMain|int|string $orderMain 模型实例或者globalOrderId + * @return mixed + */ + public function subscribeMsgForOrderComplete($orderMain); + /** * 发送模板消息 * @param $openid @@ -38,4 +63,22 @@ interface MiniprogramServiceInterface * @return mixed */ public function sendTempMsg($openid, $template_id, $data, $redirect_url = '', $applet_config = ['appid' => '', 'pagepath' => '']); + + /** + * 发送小程序订阅消息 + * @param $openid + * @param $template_id + * @param $data + * @param string $page + * @return mixed + */ + public function sendSubscribeMessage($openid, $template_id, $data, $page = ''); + + /** + * 获取订阅消息模板 + * 为空时,从微信服务器获取全部,否则从本地服务器获取 + * @param $forUserType + * @return mixed + */ + public function getSubscribeMessageTempList($forUserType); } \ No newline at end of file diff --git a/config/routes.php b/config/routes.php index bd6c86a..a5f6040 100644 --- a/config/routes.php +++ b/config/routes.php @@ -101,6 +101,7 @@ Router::addGroup('/v3/', function () { Router::post('location/addrSuggestion', 'App\Controller\v3\LocationController@addrSuggestion'); Router::post('userAddress/deliveryDistance', 'App\Controller\v3\UserAddressController@deliveryDistance'); Router::post('goods/getList', 'App\Controller\v3\GoodsController@getList'); + Router::post('subscribeMsg/getTemplates', 'App\Controller\v3\MiniSubscribeMsgController@getTemplates'); },['middleware' => [\App\Middleware\Auth\ApiMiddleware::class]]); // 需要登录的路由