Преглед на файлове

Merge branch 'master' of http://git.huaml.com/zhh/huahuibao

shish преди 4 дни
родител
ревизия
5827be3003
променени са 2 файла, в които са добавени 63 реда и са изтрити 5 реда
  1. 39 5
      app-mall/controllers/UserController.php
  2. 24 0
      common/components/miniUtil.php

+ 39 - 5
app-mall/controllers/UserController.php

@@ -15,6 +15,7 @@ use biz\shop\classes\ShopClass;
 use common\components\dict;
 use common\components\imgUtil;
 use common\components\jwt;
+use common\components\noticeUtil;
 use common\components\stringUtil;
 use Yii;
 use common\components\util;
@@ -25,7 +26,7 @@ class UserController extends BaseController
 {
 
     //二维码收款使用 ssh
-    public $guestAccess = ['discount', 'mini-mobile', 'create', 'account-login', 'current-info'];
+    public $guestAccess = ['discount', 'mini-mobile', 'get-mini-mobile', 'create', 'account-login', 'current-info'];
 
     //清空登录信息 ssh 20250215
     public function actionClearLogin()
@@ -274,10 +275,11 @@ class UserController extends BaseController
         $pc = new \WXBizDataCrypt($appId, $sessionKey);
         $errCode = $pc->decryptData($encryptedData, $iv, $result);
         if ($errCode != 0) {
-            Yii::info($result . ' ' . $errCode);
-            util::fail('获取用户信息失败');
+            // 记录详细日志以便排查。常见错误:-41003(AES解密失败/sessionKey过期)
+            Yii::info("小程序获取用户信息解密失败:errCode={$errCode}, miniOpenId={$miniOpenId}, appId={$appId}");
+            util::fail("获取用户信息失败(code:{$errCode})");
         }
-        Yii::info('小程序获取用户信息:' . $result);
+        Yii::info('小程序获取用户信息成功:' . $result);
         $originalInfo = Json::decode($result);
         util::success($originalInfo);
     }
@@ -304,7 +306,10 @@ class UserController extends BaseController
         $pc = new \WXBizDataCrypt($appId, $sessionKey);
         $errCode = $pc->decryptData($encryptedData, $iv, $result);
         if ($errCode != 0) {
-            util::fail('解密失败');
+            // 记录详细日志以便排查。常见错误:-41003(AES解密失败/sessionKey过期)
+            Yii::info("小程序手机号解密失败:errCode={$errCode}, miniOpenId={$miniOpenId}, appId={$appId}");
+            noticeUtil::push("小程序手机号解密失败:errCode={$errCode}, miniOpenId={$miniOpenId}, appId={$appId}", '15280215347');
+            util::fail("解密失败(code:{$errCode}),请尝试重新登录或重试");
         }
         $arr = Json::decode($result);
         $mobile = $arr['purePhoneNumber'] ?? '';
@@ -314,6 +319,35 @@ class UserController extends BaseController
         util::success(['mobile' => $mobile]);
     }
 
+    //小程序获取手机号新接口 ssh 2025.07.28
+    //接口文档:https://developers.weixin.qq.com/miniprogram/dev/OpenApiDoc/user-info/phone-number/getPhoneNumber.html
+    public function actionGetMiniMobile()
+    {
+        $post = Yii::$app->request->post();
+        $code = $post['code'] ?? '';
+        if (empty($code)) {
+            util::fail('参数错误:缺少code');
+        }
+
+        // 使用 miniUtil 封装好的方法获取手机号 (ptStyle=3 表示商城端)
+        $merchant = WxOpenClass::getMallWxMiniBase();
+        $res = \common\components\miniUtil::getPhoneNumber($merchant, $code, 3);
+
+        if (isset($res['errcode']) && $res['errcode'] == 0) {
+            $mobile = $res['phone_info']['purePhoneNumber'] ?? '';
+            if (empty($mobile)) {
+                util::fail('获取手机号内容为空');
+            }
+            util::success(['mobile' => $mobile]);
+        } else {
+            $errMsg = $res['errmsg'] ?? '获取手机号失败';
+            $errCode = $res['errcode'] ?? -1;
+            Yii::info("小程序新接口获取手机号失败:code={$errCode}, msg={$errMsg}");
+            noticeUtil::push("小程序新接口获取手机号失败:code={$errCode}, msg={$errMsg}", '15280215347');
+            util::fail("获取手机号失败:{$errMsg}({$errCode})");
+        }
+    }
+
     //密码修改
     public function actionPassword()
     {

+ 24 - 0
common/components/miniUtil.php

@@ -1689,6 +1689,30 @@ class miniUtil
         return $behind . $fileName;
     }
 
+    /**
+     * 获取小程序手机号 (新接口) ssh 2025.07.28
+     * @param $merchant
+     * @param $code
+     * @param int $ptStyle
+     * @return mixed
+     */
+    public static function getPhoneNumber($merchant, $code, $ptStyle = 3)
+    {
+        $accessToken = self::getMiniProgramAccessToken($merchant, $ptStyle);
+        if (empty($accessToken)) {
+            return ['errcode' => -1, 'errmsg' => '获取微信令牌失败'];
+        }
+
+        $url = "https://api.weixin.qq.com/wxa/business/getuserphonenumber?access_token={$accessToken}";
+        $data = ['code' => $code];
+
+        $curl = new curl\Curl();
+        $curl->setOption(CURLOPT_SSL_VERIFYPEER, false);
+        $result = $curl->setOption(CURLOPT_POSTFIELDS, Json::encode($data))->post($url);
+
+        return Json::decode($result);
+    }
+
     //微信开放平台获取component_access_token
     public static function getComponentAccessToken($open)
     {