wesmiler 1 týždeň pred
rodič
commit
1ac45a43bd

+ 40 - 1
app/Services/Common/OrderService.php

@@ -23,6 +23,7 @@ use App\Models\StoreModel;
 use App\Services\Api\SettleService;
 use App\Services\BaseService;
 use App\Services\Kd100Service;
+use App\Services\MpService;
 use App\Services\RedisService;
 use Illuminate\Support\Facades\DB;
 
@@ -465,11 +466,49 @@ class OrderService extends BaseService
 
         $result = $this->model->where('id', $id)->update($updateData);
 
+        // 调用小程序发货信息同步接口
+        $msg = '发货成功';
+        if($deliveryType == 1 && $openid){
+            $sendData = [
+                'order_key' => [
+                    "order_number_type" => 2,
+                    "transaction_id" => isset($order['transaction_id']) ? $order['transaction_id'] : '',
+                    "out_trade_no" => isset($order['out_trade_no']) ? $order['out_trade_no'] : ''
+                ],
+                "delivery_mode" => 1,
+                "logistics_type" => 1,
+                "shipping_list" => [
+                    [
+                        "tracking_no" => $deliveryNo,
+                        "express_company" => $deliveryCompany,
+                        "item_desc" => $goodsName."*".$goodsNum.$goodsUnit,
+                        "contact" => [
+                            "receiver_contact" => isset($order['receiver_mobile']) && $order['receiver_mobile'] ? format_mobile($order['receiver_mobile']) : format_mobile($mobile)
+
+                        ]
+                    ]
+                ],
+                "upload_time" => date('Y-m-d\TH:i:s.vP'),
+                "payer" => [
+                    "openid" => $openid
+                ]
+            ];
+
+            $result = MpService::make()->requestApi('deliverySend',$sendData);
+            $errcode = isset($result['errcode'])?$result['errcode'] : -1;
+            $errmsg = isset($result['errmsg']) && $result['errmsg']?$result['errmsg'] : '请求失败';
+            if($errcode != 0){
+                $msg = '发货成功,但上传发货信息到小程序失败:'.$errmsg;
+            }else {
+                $msg = '发货成功,上传发货信息到小程序成功';
+            }
+        }
+
         if ($result) {
             ActionLogModel::setTitle("订单发货");
             ActionLogModel::record();
             RedisService::keyDel("caches:orders:*");
-            return ['code' => 0, 'msg' => '发货成功'];
+            return ['code' => 0, 'msg' => $msg];
         }
 
         return ['code' => 1, 'msg' => '操作失败'];

+ 39 - 0
app/Services/MpService.php

@@ -43,6 +43,12 @@ class MpService extends BaseService
         'getWechatUserInfo' => 'https://api.weixin.qq.com/sns/userinfo?access_token=%s&openid=%s&lang=zh_CN',
         // 获取手机号
         'getPhoneNumber' => 'https://api.weixin.qq.com/wxa/business/getuserphonenumber?access_token=%s',
+        // 获取运力公司列表
+        'getDeliveryCompanyList'=>'https://api.weixin.qq.com/product/delivery/get_company_list?access_token=%s',
+        // 获取支持的快递公司列表
+        'getDelivery'=>'https://api.weixin.qq.com/cgi-bin/express/local/business/delivery/getall?access_token=%s',
+        // 上传发货信息,同步发货状态
+        'deliverySend'=>'https://api.weixin.qq.com/wxa/sec/order/upload_shipping_info?access_token=%s',
     ];
 
 
@@ -119,6 +125,39 @@ class MpService extends BaseService
 
 
     /**
+     * 只带 access_token API  请求
+     * @param string $apiName 接口名称
+     * @param $data 接口数据
+     * @param $requestType 请求方式:post或get
+     * @return false|mixed|string
+     */
+    public function requestApi(string $apiName, $data=[], $requestType = 'post')
+    {
+        try {
+            if(empty($this->mpAppid) || empty($this->mpAppSecret)){
+                $this->error = '小程序参数未配置';
+                return false;
+            }
+
+            if(!$token = $this->getAccessToken())
+            {
+                $this->error = '获取token失败';
+                return false;
+            }
+
+            $cacheKey = "caches:mpApp:mp_{$this->mpAppid}:";
+            $url = sprintf($this->apiUrls[$apiName], $token);
+            $result = httpRequest($url,$data?json_encode($data,256):'', $requestType,'',5);
+            $this->saveLog($cacheKey."{$apiName}:request", ['url'=>$url,'data'=>$data,'result'=>$result,'date'=>date('Y-m-d H:i:s')]);
+            return $result;
+        }catch (\Exception $e){
+            $this->error = $e->getMessage();
+            $this->saveLog($cacheKey."{$apiName}:error", ['data'=>$data,'error'=>$this->error,'trace'=>$e->getTrace(),'date'=>date('Y-m-d H:i:s')]);
+            return false;
+        }
+    }
+
+    /**
      * 小程序二维码
      * @param $page 页面
      * @param $scene 场景参数

+ 16 - 0
app/Services/PaymentService.php

@@ -959,6 +959,22 @@ class PaymentService extends BaseService
                         ]
                     ],
                 ];
+                $payData = [
+                    'appid' => $appid, // 微信小程序的app_id
+                    'out_batch_no' => $outTradeNo, // 商家批次单号
+                    'batch_name' => $body? $body : '余额提现',    // 该笔批量转账的名称
+                    'batch_remark' => $body? $body : '商家付款到零钱',  // 转账说明
+                    'total_amount' => intval($amount * 100),  // 转账金额,单位:分
+                    'total_num' => 1,   // 转账总笔数
+                    'transfer_detail_list' => [
+                        [
+                            'out_detail_no' => $outTradeNo,  // 商家明细单号
+                            'transfer_amount' => intval($amount * 100),  // 转账金额
+                            'transfer_remark' => $body? $body : '商家付款到零钱',  // 单条转账备注(微信用户会收到该备注)
+                            'openid' => $account, //  转账用户的 openid
+                        ],
+                    ],
+                ];
 
                 $pay = $this->createPay($scene, $payType);
                 RedisService::set("caches:payments:wechat:{$scene}_{$outTradeNo}_pay", ['order' => $order,'params'=>$payData,'pay'=>$pay, 'config' => $this->config], 7200);