Bladeren bron

换成稳定版

cqp 2 maanden geleden
bovenliggende
commit
ffd95bc7a8
2 gewijzigde bestanden met toevoegingen van 34 en 1 verwijderingen
  1. 33 0
      app/Service/Weixin/WeixinService.php
  2. 1 1
      app/Service/Weixin/WxSendMessageService.php

+ 33 - 0
app/Service/Weixin/WeixinService.php

@@ -14,6 +14,9 @@ class WeixinService extends Service
     const TOKEN = '';
     const KEY = 'weixintnine';
 
+    const STABLE_TOKEN_URL = 'https://api.weixin.qq.com/cgi-bin/stable_token'; // 稳定版接口
+    const KEY_STABLE = 'weixinMessage';
+
     public function getToken(){
         $token_key = self::KEY.'_'.'token';
         $token = Redis::get($token_key);
@@ -32,6 +35,36 @@ class WeixinService extends Service
         return [true,$token];
     }
 
+    public function getTokenSTABLE() {
+        $token_key = self::KEY_STABLE . '_token';
+        $token = Redis::get($token_key);
+
+        // 缓存存在且有效
+        if ($token) return [true, $token];
+
+        // 构建 POST 请求体
+        $postData = json_encode([
+            'grant_type' => 'client_credential',
+            'appid' => self::APPID,
+            'secret' => self::APPSECRET,
+            // 可选:'force_refresh' => true 强制刷新
+        ]);
+
+        list($status, $res) = $this->post_helper(self::STABLE_TOKEN_URL, $postData);
+        if(! $status) return [false, $res];
+
+        // 错误处理
+        if (isset($res['errcode']) && $res['errcode'] != 0) return [false, "{$res['errcode']}: {$res['errmsg']}"];
+        if (empty($res['access_token']))  return [false, 'access_token missing'];
+
+        // 缓存 Token(有效期7200秒,提前300秒刷新)
+        $token = $res['access_token'];
+        $expire = $res['expires_in'] - 300; // 实际6900秒(1小时55分)
+        Redis::setex($token_key, $expire, $token);
+
+        return [true, $token];
+    }
+
     public function getOpenid($data){
         if(empty($data['code'])) return [false, 'code不能为空'];
         $code = $data['code'];

+ 1 - 1
app/Service/Weixin/WxSendMessageService.php

@@ -52,7 +52,7 @@ class WxSendMessageService extends WeixinService
     public function sendTmpMsg($openid,$tempid,$data,$pagepath="")
     {
         $reload_url = $data['reload_url'] ?? '';
-        list($status, $token) = $this->getToken();
+        list($status, $token) = $this->getTokenSTABLE();
         if (!$status) return [false, $token];
         $url = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" . $token;
         $post = '{