123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286 |
- <?php
- namespace crmeb\services\wechat\orderShipping;
- use crmeb\exceptions\AdminException;
- use crmeb\services\CacheService;
- use crmeb\services\wechat\config\MiniProgramConfig;use crmeb\services\wechat\config\PaymentConfig;use EasyWeChat\Core\AccessToken;
- use EasyWeChat\Core\Exceptions\HttpException;
- use think\facade\Cache;
- class OrderClient extends BaseClient
- {
- const redis_prefix = 'mini_order';
- const express_company = 'ZTO'; // 默认发货快递公司为(中通快递)
- /**
- * @var \Redis
- */
- protected $redis;
- /**
- * @return object|\Redis|null
- *
- *
- */
- protected function getRedis()
- {
- if (empty($this->redis)) {
- $this->redis = Cache::store('redis')->handler();
- }
- return $this->redis;
- }
- /**
- * 处理联系人
- * @param array $contact
- * @return array
- *
- *
- */
- protected function handleContact(array $contact = []): array
- {
- if (isset($contact)) {
- if (isset($contact['consignor_contact']) && $contact['consignor_contact']) {
- $contact['consignor_contact'] = Utility::encryptTel($contact['consignor_contact']);
- }
- if (isset($contact['receiver_contact']) && $contact['receiver_contact']) {
- $contact['receiver_contact'] = Utility::encryptTel($contact['receiver_contact']);
- }
- }
- return $contact;
- }
- /**
- * 发货
- * @param string $out_trade_no
- * @param int $logistics_type
- * @param array $shipping_list
- * @param string $payer_openid
- * @param int $delivery_mode
- * @param bool $is_all_delivered
- * @return array
- * @throws HttpException
- *
- *
- */
- public function shippingByTradeNo(string $out_trade_no, int $logistics_type, array $shipping_list, string $payer_openid, $path, int $delivery_mode = 1, bool $is_all_delivered = true)
- {
- if (!$this->checkManaged()) {
- throw new AdminException('开通小程序订单管理服务后重试');
- }
- /** @var PaymentConfig $make */
- $make = app()->make(PaymentConfig::class);
- $params = [
- 'order_key' => [
- 'order_number_type' => 2,
- 'mchid' => $make->get('mchId'),
- // 'out_trade_no' => $out_trade_no,
- 'transaction_id' => $out_trade_no
- ],
- 'logistics_type' => $logistics_type,
- 'delivery_mode' => $delivery_mode,
- 'upload_time' => date(DATE_RFC3339),
- 'payer' => [
- 'openid' => $payer_openid
- ]
- ];
- if ($delivery_mode == 2) {
- $params['is_all_delivered'] = $is_all_delivered;
- }
- foreach ($shipping_list as $shipping) {
- $contact = $this->handleContact($shipping['contact'] ?? []);
- $params['shipping_list'][] = [
- 'tracking_no' => $shipping['tracking_no'] ?? '',
- 'express_company' => isset($shipping['express_company']) ? $this->getDelivery($shipping['express_company']) : '',
- 'item_desc' => $shipping['item_desc'],
- 'contact' => $contact
- ];
- }
- // 跳转路径
- // $this->setMesJumpPath($path);
- return $this->shipping($params);
- }
- /**
- * 合单
- * @param string $out_trade_no
- * @param int $logistics_type
- * @param array $sub_orders
- * @param string $payer_openid
- * @param int $delivery_mode
- * @param bool $is_all_delivered
- * @return array
- * @throws HttpException
- *
- *
- */
- public function combinedShippingByTradeNo(string $out_trade_no, int $logistics_type, array $sub_orders, string $payer_openid, int $delivery_mode = 2, bool $is_all_delivered = false)
- {
- if (!$this->checkManaged()) {
- throw new AdminException('开通小程序订单管理服务后重试');
- }
- $params = [
- 'order_key' => [
- 'order_number_type' => 1,
- 'mchid' => $this->config['config']['mini_program']['merchant_id'],
- 'out_trade_no' => $out_trade_no,
- ],
- 'upload_time' => date(DATE_RFC3339),
- 'payer' => [
- 'openid' => $payer_openid
- ]
- ];
- foreach ($sub_orders as $order) {
- $sub_order = [
- 'order_key' => [
- 'order_number_type' => 1,
- 'mchid' => $this->config['config']['mini_program']['merchant_id'],
- 'out_trade_no' => $order['out_trade_no'],
- 'logistics_type' => $logistics_type,
- ],
- 'delivery_mode' => $delivery_mode,
- 'is_all_delivered' => $is_all_delivered
- ];
- foreach ($sub_orders['shipping_list'] as $shipping) {
- $contact = $this->handleContact($shipping['contact'] ?? []);
- $sub_order['shipping_list'][] = [
- 'tracking_no' => $shipping['tracking_no'] ?? '',
- 'express_company' => isset($shipping['express_company']) ? $this->getDelivery($shipping['express_company']) : '',
- 'item_desc' => $shipping['item_desc'],
- 'contact' => $contact
- ];
- }
- $params['sub_orders'][] = $sub_order;
- }
- return $this->combinedShipping($params);
- }
- /**
- * 签收通知
- * @param string $merchant_trade_no
- * @param string $received_time
- * @return array
- * @throws HttpException
- *
- *
- */
- public function notifyConfirmByTradeNo(string $merchant_trade_no, string $received_time)
- {
- $params = [
- 'merchant_id' => $this->config['config']['mini_program']['merchant_id'],
- 'merchant_trade_no' => $merchant_trade_no,
- 'received_time' => $received_time
- ];
- return $this->notifyConfirm($params);
- }
- /**
- * 设置跳转连接
- * @param $path
- * @return array
- * @throws \EasyWeChat\Core\Exceptions\HttpException
- *
- *
- */
- public function setMesJumpPathAndCheck($path)
- {
- if (!$this->checkManaged()) {
- throw new AdminException('开通小程序订单管理服务后重试');
- }
- return $this->setMesJumpPath($path);
- }
- /**
- * 设置小程序管理服务开通状态
- * @return bool
- * @throws HttpException
- *
- *
- */
- public function setManaged()
- {
- try {
- $res = $this->isManaged();
- if ($res['is_trade_managed']) {
- $key = self::redis_prefix . '_is_trade_managed';
- $this->getRedis()->set($key, $res['is_trade_managed']);
- return true;
- } else {
- return false;
- }
- } catch (\Throwable $e) {
- return false;
- }
- }
- /**
- * @return bool
- * @throws HttpException
- *
- *
- */
- public function checkManaged()
- {
- $key = self::redis_prefix . '_is_trade_managed';
- if ($this->getRedis()->exists($key)) {
- return true;
- } else {
- return $this->setManaged();
- }
- }
- /**
- * 同步去微信物流列表
- * @return array
- * @throws HttpException
- *
- *
- */
- public function setDeliveryList()
- {
- $list = $this->getDeliveryList();
- if ($list) {
- $key = self::redis_prefix . '_delivery_list';
- $date = array_column($list['delivery_list'], 'delivery_id', 'delivery_name');
- // 创建缓存
- $this->getRedis()->hMSet($key, $date);
- return $date;
- } else {
- throw new AdminException('物流公司列表异常');
- }
- }
- /**
- * 获取物流公司编码
- * @param $company_name
- * @return array|mixed
- * @throws HttpException
- *
- *
- */
- public function getDelivery($company_name)
- {
- $key = self::redis_prefix . '_delivery_list';
- if (!$this->getRedis()->exists($key)) {
- $date = $this->setDeliveryList();
- $express_company = $date[$company_name] ?? '';
- } else {
- $express_company = $this->getRedis()->hMGet($key, [$company_name])[$company_name] ?? '';
- }
- if (empty($express_company)) {
- $express_company = self::express_company;
- }
- return $express_company;
- }
- }
|