Bladeren bron

feat(address): 添加地址解析功能

- 新增 /address/parse API 接口用于地址解析
- 配置阿里云市场地址解析服务参数
- 实现地址解析控制器方法
- 添加地址解析仓库逻辑和异常处理
- 集成 HttpService 进行第三方 API 调用
- 添加详细的日志记录和错误处理机制
shichen 2 maanden geleden
bovenliggende
commit
9e5bbb6477

+ 61 - 0
app/common/repositories/user/UserAddressRepository.php

@@ -11,6 +11,8 @@ use app\common\repositories\BaseRepository;
11 11
 use app\common\dao\user\UserAddressDao as dao;
12 12
 use app\common\repositories\store\shipping\CityRepository;
13 13
 use app\entity\data\user\UserAddressEntity;
14
+use crmeb\services\HttpService;
15
+use think\facade\Log;
14 16
 
15 17
 /**
16 18
  * Class UserAddressRepository
@@ -136,4 +138,63 @@ class UserAddressRepository extends BaseRepository
136 138
         $addressEntity = $this->dao->getAddressEntityByAddressId($addressId);
137 139
         return $addressEntity;
138 140
     }
141
+
142
+    /**
143
+     * 阿里云市场 - 地址解析
144
+     *
145
+     * 调用阿里云市场地址解析接口,将完整的地址文本解析为省/市/区/街道等结构化信息
146
+     *
147
+     * 接口文档: https://market.aliyun.com/detail/cmapi00067026
148
+     * 请求方式: GET
149
+     * 认证方式: Authorization:APPCODE
150
+     *
151
+     * @param string $address 待解析的地址文本,如 "北京市朝阳区建国路88号SOHO现代城A座1508室"
152
+     * @return array 统一返回格式:
153
+     *               成功 {"code":200,"msg":"成功","data":{...}}
154
+     *               失败 {"code":-1,"msg":"错误信息","data":[]}
155
+     */
156
+    public function parse($address)
157
+    {
158
+        $config = config('third_party.aliyun_address_parse');
159
+        $appCode = $config['appCode'] ?? '';
160
+
161
+        if (empty($appCode)) {
162
+            $msg = '地址解析失败:未配置阿里云市场 AppCode';
163
+            Log::error($msg);
164
+            return ['code' => -1, 'msg' => $msg, 'data' => []];
165
+        }
166
+
167
+        if (empty($address)) {
168
+            $msg = '地址解析失败:地址文本为空';
169
+            Log::error($msg);
170
+            return ['code' => -2, 'msg' => $msg, 'data' => []];
171
+        }
172
+
173
+        $url = rtrim($config['gatewayUrl'] ?? 'https://kzaddress2.market.alicloudapi.com', '/')
174
+             . ($config['apiPath'] ?? '/api/address/parse');
175
+
176
+        $header = ['Authorization:APPCODE ' . $appCode];
177
+
178
+        try {
179
+            $res = HttpService::getRequest($url, ['address' => $address], $header);
180
+            if ($res === false) {
181
+                $msg = '地址解析请求失败';
182
+                Log::error($msg . ':' . $url . ',地址:' . $address);
183
+                return ['code' => -3, 'msg' => $msg, 'data' => []];
184
+            }
185
+
186
+            $result = json_decode($res, true);
187
+            if (json_last_error() !== JSON_ERROR_NONE) {
188
+                $msg = '地址解析返回数据解析失败:' . json_last_error_msg();
189
+                Log::error($msg . ',原始数据:' . $res);
190
+                return ['code' => -4, 'msg' => $msg, 'data' => []];
191
+            }
192
+
193
+            return ['code' => 200, 'msg' => '成功', 'data' => $result];
194
+        } catch (\Throwable $e) {
195
+            $msg = '地址解析异常:' . $e->getMessage();
196
+            Log::error($msg . ',文件:' . $e->getFile() . ',行号:' . $e->getLine());
197
+            return ['code' => -5, 'msg' => $msg, 'data' => []];
198
+        }
199
+    }
139 200
 }

+ 16 - 0
app/controller/api/user/UserAddress.php

@@ -133,6 +133,22 @@ class UserAddress extends BaseController
133 133
     }
134 134
 
135 135
     /**
136
+     * @return mixed
137
+     * @author 史晨
138
+     * @date 2026/5/15 10:04
139
+     * 地址解析
140
+     */
141
+    public function parse()
142
+    {
143
+        $address = $this->request->param('address');
144
+        $res = $this->repository->parse($address);
145
+        if ($res['code'] != 200) {
146
+            return app('json')->fail($res['msg']);
147
+        }
148
+        return app('json')->success($res['data']);
149
+    }
150
+
151
+    /**
136 152
      * @param validate $validate
137 153
      * @return array
138 154
      * @author Qinii

+ 9 - 0
config/third_party.php

@@ -26,5 +26,14 @@ return [
26 26
         'logEnabled' => true,
27 27
         // 日志目录
28 28
         'logPath' => runtime_path() . 'alibaba/',
29
+    ],
30
+    // 阿里云市场 - 地址解析
31
+    'aliyun_address_parse' => [
32
+        // 阿里云市场 AppCode(从阿里云市场控制台获取)
33
+        'appCode' => '10e4d1cae6c245049d0ec51bc079a3d6',
34
+        // API 网关地址
35
+        'gatewayUrl' => 'https://kzaddress2.market.alicloudapi.com',
36
+        // API 路径
37
+        'apiPath' => '/api/address/parse',
29 38
     ]
30 39
 ];

+ 2 - 0
route/api.php

@@ -218,6 +218,8 @@ Route::group('api/', function () {
218 218
             Route::get('/address/detail/:id', 'UserAddress/detail');
219 219
             Route::post('/address/update/:id', 'UserAddress/editDefault');
220 220
             Route::post('/address/delete/:id', 'UserAddress/delete');
221
+            // 地址解析
222
+            Route::get('/address/parse', 'UserAddress/parse');
221 223
 
222 224
             //分销海报
223 225
             Route::get('/spread_image', 'User/spread_image');