diff --git a/src/addon/weapp/config/event.php b/src/addon/weapp/config/event.php index 13b896001..c975370a1 100644 --- a/src/addon/weapp/config/event.php +++ b/src/addon/weapp/config/event.php @@ -22,10 +22,40 @@ return [ 'OrderDeliveryAfter' => [ 'addon\weapp\event\OrderDeliveryAfter' ], + // 发货成功后小程序发货 + 'OrderDeliveryAfterWeappDelivery' => [ + 'addon\weapp\event\OrderDeliveryAfterWeappDelivery' + ], // 订单收货后执行事件(异步) 'OrderTakeDeliveryAfter' => [ 'addon\weapp\event\OrderTakeDeliveryAfter' ], + /************************** 虚拟发货相关 *****************************/ + // 盲盒订单支付后 + 'BlindboxOrderPay' => [ + 'addon\weapp\event\BlindboxOrderPay' + ], + // 礼品卡订单支付后 + 'GiftCardOrderPay' => [ + 'addon\weapp\event\GiftCardOrderPay' + ], + // 充值订单支付后 + 'MemberRechargeOrderPay' => [ + 'addon\weapp\event\MemberRechargeOrderPay' + ], + // 超级会员卡订单支付后 + 'MemberLevelOrderPay' => [ + 'addon\weapp\event\MemberLevelOrderPay' + ], + // 积分兑换订单支付后 + 'PointExchangeOrderPay' => [ + 'addon\weapp\event\PointExchangeOrderPay' + ], + // 小程序虚拟发货 + 'WeappVirtualDelivery' => [ + 'addon\weapp\event\WeappVirtualDelivery' + ], + /************************** 虚拟发货相关 *****************************/ ], 'subscribe' => [ diff --git a/src/addon/weapp/config/info.php b/src/addon/weapp/config/info.php index eac7c71c2..900e21259 100644 --- a/src/addon/weapp/config/info.php +++ b/src/addon/weapp/config/info.php @@ -6,7 +6,7 @@ return [ 'type' => 'system', //插件类型 system :系统插件(自动安装), promotion:扩展营销插件 tool:工具插件 'status' => 1, 'author' => '', - 'version' => '5.3.1', - 'version_no' => '525231212001', + 'version' => '5.5.2', + 'version_no' => '552250604001', 'content' => '', ]; \ No newline at end of file diff --git a/src/addon/weapp/config/menu_shop.php b/src/addon/weapp/config/menu_shop.php index 7ef57a76c..554de7e90 100644 --- a/src/addon/weapp/config/menu_shop.php +++ b/src/addon/weapp/config/menu_shop.php @@ -27,6 +27,7 @@ return [ 'url' => 'weapp://shop/weapp/config', 'is_show' => 0, 'sort' => 2, + 'type' => 'button', ], [ 'name' => 'WEAPP_PACKAGE', @@ -34,6 +35,7 @@ return [ 'url' => 'weapp://shop/weapp/package', 'is_show' => 0, 'sort' => 3, + 'type' => 'button', ], [ 'name' => 'WEAPP_PACKAGE', @@ -41,6 +43,7 @@ return [ 'url' => 'weapp://shop/message/config', 'is_show' => 0, 'sort' => 4, + 'type' => 'button', 'chile_list' => [] ], [ @@ -50,13 +53,15 @@ return [ 'url' => 'weapp://shop/message/edit', 'is_show' => 0, 'sort' => 1, + 'type' => 'button', ], [ 'name' => 'WEAPP_SHARE', 'title' => '小程序分享', 'url' => 'weapp://shop/weapp/share', 'is_show' => 0, - 'sort' => 6 + 'sort' => 6, + 'type' => 'button', ] ] ] diff --git a/src/addon/weapp/event/BlindboxOrderPay.php b/src/addon/weapp/event/BlindboxOrderPay.php new file mode 100644 index 000000000..233fa1f03 --- /dev/null +++ b/src/addon/weapp/event/BlindboxOrderPay.php @@ -0,0 +1,16 @@ +addCron(1, 0, "小程序虚拟发货", "WeappVirtualDelivery", time() + 60, $param['out_trade_no']); + } +} \ No newline at end of file diff --git a/src/addon/weapp/event/GiftCardOrderPay.php b/src/addon/weapp/event/GiftCardOrderPay.php new file mode 100644 index 000000000..3a0d9a69c --- /dev/null +++ b/src/addon/weapp/event/GiftCardOrderPay.php @@ -0,0 +1,16 @@ +addCron(1, 0, "小程序虚拟发货", "WeappVirtualDelivery", time() + 60, $param['out_trade_no']); + } +} \ No newline at end of file diff --git a/src/addon/weapp/event/GiftCardOrderPayWeappDelivery.php b/src/addon/weapp/event/GiftCardOrderPayWeappDelivery.php new file mode 100644 index 000000000..b64e111ac --- /dev/null +++ b/src/addon/weapp/event/GiftCardOrderPayWeappDelivery.php @@ -0,0 +1,73 @@ +getOrderInfo($order_condition)[ 'data' ]; + if (empty($order_info)) { + return $order_model->error('', '订单不存在'); + } + if ($order_info[ 'pay_type' ] != 'wechatpay') { + return $order_model->success('', '订单未使用微信支付'); + } + + $weapp_model = new Weapp($order_info[ 'site_id' ]); + + // 检测微信小程序是否已开通发货信息管理服务 + $is_trade_managed = $weapp_model->orderShippingIsTradeManaged()['data']; + if (!$is_trade_managed) { + return $weapp_model->success(); + } + + //用户信息 + $member_service = new Member(); + $member_info = $member_service->getMemberInfo([ + [ 'site_id', '=', $order_info[ 'site_id' ] ], + [ 'member_id', '=', $order_info[ 'member_id' ] ] + ], 'weapp_openid')[ 'data' ]; + + // 上传发货信息 + $shipping_list = [ + [ + 'tracking_no' => '', // 物流单号,物流快递发货时必填,示例值: 323244567777 字符字节限制: [1, 128] + 'express_company' => '', // 物流公司编码,快递公司ID,参见「查询物流公司编码列表」,物流快递发货时必填, 示例值: DHL 字符字节限制: [1, 128] + 'item_desc' => $weapp_model->handleOrderShippingItemDesc([$order_info['order_name']]), // 商品信息,例如:微信红包抱枕*1个,限120个字以内 + 'contact' => [ + 'consignor_contact' => '', + 'receiver_contact' => '' + ] + ] + ]; + $data = [ + 'site_id' => $order_info[ 'site_id' ], + 'out_trade_no' => $order_info[ 'out_trade_no' ], + 'logistics_type' => Weapp::LOGISTICS_TYPE_VIRTUAL, // 3、虚拟商品,虚拟商品,例如话费充值,点卡等,无实体配送形式 + 'delivery_mode' => Weapp::UNIFIED_DELIVERY, // 发货模式,发货模式枚举值:1、UNIFIED_DELIVERY(统一发货) + 'shipping_list' => $shipping_list, + 'weapp_openid' => $member_info[ 'weapp_openid' ], // 用户标识,用户在小程序appid下的唯一标识。 下单前需获取到用户的Openid 示例值: oUpF8uMuAJO_M2pxb1Q9zNjWeS6o 字符字节限制: [1, 128] + 'is_all_delivered' => true + ]; + $res = $weapp_model->orderShippingUploadShippingInfo($data); + //dd($data, $res); + return $res; + }catch(\Exception $e){ + //dd($e->getFile(), $e->getLine(), $e->getMessage()); + return error(-1, '小程序上传发货信息错误,'.$e->getMessage()); + } + } +} \ No newline at end of file diff --git a/src/addon/weapp/event/MemberLevelOrderPay.php b/src/addon/weapp/event/MemberLevelOrderPay.php new file mode 100644 index 000000000..cb5ba75ee --- /dev/null +++ b/src/addon/weapp/event/MemberLevelOrderPay.php @@ -0,0 +1,16 @@ +addCron(1, 0, "小程序虚拟发货", "WeappVirtualDelivery", time() + 60, $param['out_trade_no']); + } +} \ No newline at end of file diff --git a/src/addon/weapp/event/MemberRechargeOrderPay.php b/src/addon/weapp/event/MemberRechargeOrderPay.php new file mode 100644 index 000000000..481927b21 --- /dev/null +++ b/src/addon/weapp/event/MemberRechargeOrderPay.php @@ -0,0 +1,16 @@ +addCron(1, 0, "小程序虚拟发货", "WeappVirtualDelivery", time() + 60, $param['out_trade_no']); + } +} \ No newline at end of file diff --git a/src/addon/weapp/event/MemberRechargeOrderPayWeappDelivery.php b/src/addon/weapp/event/MemberRechargeOrderPayWeappDelivery.php new file mode 100644 index 000000000..629ce1e56 --- /dev/null +++ b/src/addon/weapp/event/MemberRechargeOrderPayWeappDelivery.php @@ -0,0 +1,64 @@ +getMemberRechargeOrderInfo([['order_id', '=', $param['relate_id']]])['data']; + + $weapp_model = new Weapp($order_info[ 'site_id' ]); + + // 检测微信小程序是否已开通发货信息管理服务 + $is_trade_managed = $weapp_model->orderShippingIsTradeManaged()['data']; + if (!$is_trade_managed) { + return $weapp_model->success(); + } + + //用户信息 + $member_service = new Member(); + $member_info = $member_service->getMemberInfo([ + [ 'site_id', '=', $order_info[ 'site_id' ] ], + [ 'member_id', '=', $order_info[ 'member_id' ] ] + ], 'weapp_openid')[ 'data' ]; + + // 上传发货信息 + $shipping_list = [ + [ + 'tracking_no' => '', // 物流单号,物流快递发货时必填,示例值: 323244567777 字符字节限制: [1, 128] + 'express_company' => '', // 物流公司编码,快递公司ID,参见「查询物流公司编码列表」,物流快递发货时必填, 示例值: DHL 字符字节限制: [1, 128] + 'item_desc' => $weapp_model->handleOrderShippingItemDesc([$order_info['recharge_name']]), // 商品信息,例如:微信红包抱枕*1个,限120个字以内 + 'contact' => [ + 'consignor_contact' => '', + 'receiver_contact' => '' + ] + ] + ]; + $data = [ + 'site_id' => $order_info[ 'site_id' ], + 'out_trade_no' => $order_info[ 'out_trade_no' ], + 'logistics_type' => Weapp::LOGISTICS_TYPE_VIRTUAL, // 3、虚拟商品,虚拟商品,例如话费充值,点卡等,无实体配送形式 + 'delivery_mode' => Weapp::UNIFIED_DELIVERY, // 发货模式,发货模式枚举值:1、UNIFIED_DELIVERY(统一发货) + 'shipping_list' => $shipping_list, + 'weapp_openid' => $member_info[ 'weapp_openid' ], // 用户标识,用户在小程序appid下的唯一标识。 下单前需获取到用户的Openid 示例值: oUpF8uMuAJO_M2pxb1Q9zNjWeS6o 字符字节限制: [1, 128] + 'is_all_delivered' => true + ]; + $res = $weapp_model->orderShippingUploadShippingInfo($data); + //dd($data, $res); + return $res; + }catch(\Exception $e){ + //dd($e->getFile(), $e->getLine(), $e->getMessage()); + return error(-1, '小程序上传发货信息错误,'.$e->getMessage()); + } + } +} \ No newline at end of file diff --git a/src/addon/weapp/event/OrderDeliveryAfterWeappDelivery.php b/src/addon/weapp/event/OrderDeliveryAfterWeappDelivery.php new file mode 100644 index 000000000..d770cfbb3 --- /dev/null +++ b/src/addon/weapp/event/OrderDeliveryAfterWeappDelivery.php @@ -0,0 +1,167 @@ +getInfo([ [ 'order_id', '=', $param[ 'relate_id' ] ] ], $filed, 'o', $join); + if (empty($order_info)) return $order_model->success(); + if ($order_info[ 'pay_type' ] != 'wechatpay') return $order_model->success(); + + // 检测微信小程序是否已开通发货信息管理服务 + $weapp_model = new Weapp($order_info[ 'site_id' ]); + $is_trade_managed = $weapp_model->orderShippingIsTradeManaged()['data']; + if (!$is_trade_managed) return $weapp_model->success(); + + //商家信息 + $shop_model = new ShopModel(); + $shop_info = $shop_model->getShopInfo([ [ 'site_id', '=', $order_info[ 'site_id' ] ] ], '')[ 'data' ]; + + //物流模式和发货方式 + $logistics_type_config = [ + OrderDict::express => Weapp::LOGISTICS_TYPE_EXPRESS, + OrderDict::local => Weapp::LOGISTICS_TYPE_LOCAL, + OrderDict::store => Weapp::LOGISTICS_TYPE_STORE, + OrderDict::virtual => Weapp::LOGISTICS_TYPE_VIRTUAL, + ]; + $logistics_type = $logistics_type_config[$order_info['order_type']]; + $delivery_mode = $order_info['order_type'] == OrderDict::express ? Weapp::SPLIT_DELIVERY : Weapp::UNIFIED_DELIVERY; + + //小程序物流公司 + $delivery_list = []; + if ($logistics_type == OrderDict::express) { + $delivery_list = $weapp_model->orderShippingGetDeliveryList()[ 'data' ]; + } + //订单商品 + $order_goods_field = 'order_goods_id,sku_name,num,delivery_no,delivery_status'; + $order_goods_list = $order_model->getOrderGoodsList([ + [ 'order_id', '=', $order_info[ 'order_id' ] ] + ], $order_goods_field, 'order_goods_id asc')[ 'data' ]; + $order_goods_list = array_column($order_goods_list, null, 'order_goods_id'); + //寄件人联系方式 + $consignor_contact = $this->mobileShow($shop_info[ 'mobile' ]); + //收件人联系方式 + $receiver_contact = $this->mobileShow($order_info[ 'mobile' ]); + //组装小程序发货信息 + $shipping_list = []; + $delivery_goods_count = 0; + $is_all_delivered = true; + if ($logistics_type == OrderDict::express) { + $package_list = model('express_delivery_package')->getList([ + [ 'order_id', '=', $order_info[ 'order_id' ] ], + ], '*'); + foreach($package_list as $package_info){ + //商品信息 + $order_goods_ids = explode(',', $package_info['order_goods_id_array']); + $item_desc = []; + foreach($order_goods_ids as $order_goods_id){ + $order_goods_info = $order_goods_list[$order_goods_id]; + $item_desc_text = $order_goods_info['sku_name'].'*'.$order_goods_info['num']; + $item_desc[] = $item_desc_text; + $delivery_goods_count ++; + } + //物流公司 + $express_company = ''; + if (!empty($package_info[ 'express_company_name' ]) && !empty($delivery_list)) { + $delivery_index = array_search($package_info[ 'express_company_name' ], array_column($delivery_list, 'delivery_name')); + if ($delivery_index === false) continue; + $express_company = $delivery_list[ $delivery_index ][ 'delivery_id' ]; + } + if(empty($express_company)) continue; + //数据结构 + $item = [ + 'tracking_no' => $package_info[ 'delivery_no' ], // 物流单号,物流快递发货时必填,示例值: 323244567777 字符字节限制: [1, 128] + 'express_company' => $express_company, // 物流公司编码,快递公司ID,参见「查询物流公司编码列表」,物流快递发货时必填, 示例值: DHL 字符字节限制: [1, 128] + 'item_desc' => $weapp_model->handleOrderShippingItemDesc($item_desc), // 商品信息,例如:微信红包抱枕*1个,限120个字以内 + 'contact' => [ + 'consignor_contact' => $consignor_contact, + 'receiver_contact' => $receiver_contact, + ] + ]; + //最多只能有9个包裹 + if(count($shipping_list) < 9){ + $shipping_list[] = $item; + } + } + if(empty($shipping_list)){ + $logistics_type = Weapp::LOGISTICS_TYPE_LOCAL; + $delivery_mode = Weapp::UNIFIED_DELIVERY; + } + if($delivery_goods_count < count($order_goods_list)){ + $is_all_delivered = false; + } + } + //统一发货的发货信息 + if($delivery_mode == Weapp::UNIFIED_DELIVERY){ + $item_desc = []; + foreach($order_goods_list as $order_goods_info){ + $item_desc_text = $order_goods_info['sku_name'].'*'.$order_goods_info['num']; + $item_desc[] = $item_desc_text; + } + $shipping_list[] = [ + 'tracking_no' => '', // 物流单号,物流快递发货时必填,示例值: 323244567777 字符字节限制: [1, 128] + 'express_company' => '', // 物流公司编码,快递公司ID,参见「查询物流公司编码列表」,物流快递发货时必填, 示例值: DHL 字符字节限制: [1, 128] + 'item_desc' => $weapp_model->handleOrderShippingItemDesc($item_desc), // 商品信息,例如:微信红包抱枕*1个,限120个字以内 + 'contact' => [ + 'consignor_contact' => $consignor_contact, + 'receiver_contact' => $receiver_contact, + ] + ]; + } + + $param = [ + 'site_id' => $order_info['site_id'], + 'out_trade_no' => $order_info['out_trade_no'], + 'logistics_type' => $logistics_type, + 'delivery_mode' => $delivery_mode, + 'shipping_list' => $shipping_list, + 'weapp_openid' => $order_info[ 'weapp_openid' ], + 'is_all_delivered' => $is_all_delivered, + ]; + $res = $weapp_model->orderShippingUploadShippingInfo($param); + //如果是预售,尾款也需要同步发货信息 + if($order_info['promotion_type'] == 'presale'){ + $param['out_trade_no'] = $order_info['out_trade_no_2']; + $res = $weapp_model->orderShippingUploadShippingInfo($param); + } + Log::write('小程序发货结果' . json_encode($res, JSON_UNESCAPED_UNICODE)); + //dd($param,$res); + return $res; + }catch(\Exception $e){ + Log::write('小程序发货错误' . json_encode([ + 'file' => $e->getFile(), + 'line' => $e->getLine(), + 'message' => $e->getMessage(), + ], JSON_UNESCAPED_UNICODE)); + //dd($e->getFile(),$e->getLine(),$e->getMessage()); + return error(-1, '小程序上传发货信息错误,'.$e->getMessage()); + } + } + + // 寄件人和收件人联系方式,采用掩码传输,最后4位数字不能打掩码 示例值: `189****1234, 021-****1234, ****1234, 0**2-***1234, 0**2-******23-10, ****123-8008` 值限制: 0 ≤ value ≤ 1024 + protected function mobileShow($mobile) + { + if($mobile){ + $mobile =substr($mobile, 0, 3) . '****' . substr($mobile, 7); + } + return $mobile; + } +} \ No newline at end of file diff --git a/src/addon/weapp/event/PointExchangeOrderPay.php b/src/addon/weapp/event/PointExchangeOrderPay.php new file mode 100644 index 000000000..8e43fc144 --- /dev/null +++ b/src/addon/weapp/event/PointExchangeOrderPay.php @@ -0,0 +1,19 @@ + 0){ + return (new Cron())->addCron(1, 0, "小程序虚拟发货", "WeappVirtualDelivery", time() + 60, $param['out_trade_no']); + } + } +} \ No newline at end of file diff --git a/src/addon/weapp/event/WeappVirtualDelivery.php b/src/addon/weapp/event/WeappVirtualDelivery.php new file mode 100644 index 000000000..eed1e8cb7 --- /dev/null +++ b/src/addon/weapp/event/WeappVirtualDelivery.php @@ -0,0 +1,65 @@ +delivery($param['relate_id']); + } + + protected function delivery($out_trade_no) + { + //获取支付信息 + $pay_model = new PayModel(); + $pay_info = $pay_model->getPayInfo($out_trade_no)['data']; + if(empty($pay_info)) return success(); + if ($pay_info[ 'pay_type' ] != 'wechatpay') return success(); + + // 检测微信小程序是否已开通发货信息管理服务 + $weapp_model = new Weapp($pay_info[ 'site_id' ]); + $is_trade_managed = $weapp_model->orderShippingIsTradeManaged()['data']; + if (!$is_trade_managed) return $weapp_model->success(); + + //用户信息 + $member_service = new Member(); + $member_info = $member_service->getMemberInfo([ + [ 'site_id', '=', $pay_info[ 'site_id' ] ], + [ 'member_id', '=', $pay_info[ 'member_id' ] ] + ], 'weapp_openid')[ 'data' ]; + if(empty($member_info)) return success(); + + //组装发货信息 + $shipping_list = [ + [ + 'tracking_no' => '', // 物流单号,物流快递发货时必填,示例值: 323244567777 字符字节限制: [1, 128] + 'express_company' => '', // 物流公司编码,快递公司ID,参见「查询物流公司编码列表」,物流快递发货时必填, 示例值: DHL 字符字节限制: [1, 128] + 'item_desc' => $weapp_model->handleOrderShippingItemDesc([$pay_info['pay_body']]), // 商品信息,例如:微信红包抱枕*1个,限120个字以内 + 'contact' => [ + 'consignor_contact' => '', + 'receiver_contact' => '' + ] + ] + ]; + $data = [ + 'site_id' => $pay_info[ 'site_id' ], + 'out_trade_no' => $pay_info[ 'out_trade_no' ], + 'logistics_type' => Weapp::LOGISTICS_TYPE_VIRTUAL, // 3、虚拟商品,虚拟商品,例如话费充值,点卡等,无实体配送形式 + 'delivery_mode' => Weapp::UNIFIED_DELIVERY, // 发货模式,发货模式枚举值:1、UNIFIED_DELIVERY(统一发货) + 'shipping_list' => $shipping_list, + 'weapp_openid' => $member_info[ 'weapp_openid' ], // 用户标识,用户在小程序appid下的唯一标识。 下单前需获取到用户的Openid 示例值: oUpF8uMuAJO_M2pxb1Q9zNjWeS6o 字符字节限制: [1, 128] + 'is_all_delivered' => true + ]; + return $weapp_model->orderShippingUploadShippingInfo($data); + } +} \ No newline at end of file diff --git a/src/addon/weapp/shop/controller/Message.php b/src/addon/weapp/shop/controller/Message.php index d218e7401..f02824ab3 100644 --- a/src/addon/weapp/shop/controller/Message.php +++ b/src/addon/weapp/shop/controller/Message.php @@ -84,11 +84,10 @@ class Message extends BaseShop return $res; } else { if (empty($info)) $this->error("不存在的模板信息!"); - - $this->assign("keywords", $keywords); $this->assign("info", $weapp_json_array); $this->assign('weapp_is_open', $info[ 'weapp_is_open' ]); + $this->assign('message_title', $info[ 'title' ]); return $this->fetch('message/edit'); } } diff --git a/src/addon/weapp/shop/view/message/config.html b/src/addon/weapp/shop/view/message/config.html index e19289f78..81959ea25 100644 --- a/src/addon/weapp/shop/view/message/config.html +++ b/src/addon/weapp/shop/view/message/config.html @@ -1,5 +1,3 @@ - - -

操作提示

@@ -37,7 +34,7 @@
{{# if(d.weapp_is_open == 0){ }} 开启 - {{# }else{ }} + {{# }else{ }} 关闭 {{# } }} @@ -60,8 +57,6 @@ {{ d.weapp_is_open == 1 ? '已启用' : '已关闭' }} - - diff --git a/src/addon/weapp/shop/view/stat/stat.html b/src/addon/weapp/shop/view/stat/stat.html index 2acad1239..87faf1cee 100644 --- a/src/addon/weapp/shop/view/stat/stat.html +++ b/src/addon/weapp/shop/view/stat/stat.html @@ -1,8 +1,5 @@ - - - - +
@@ -88,7 +85,6 @@
-