>백엔드 개발 >PHP 튜토리얼 >WeChat은 여러 개의 글로벌 access_token 충돌을 획득하여 무효화됩니까? (해결책)

WeChat은 여러 개의 글로벌 access_token 충돌을 획득하여 무효화됩니까? (해결책)

WBOY
WBOY원래의
2016-12-01 01:27:213154검색

토큰은 기본적으로 7200초 후에 만료됩니다. 두 번째 장소도 동일한 토큰을 요청하는 경우 첫 번째 토큰은 5분 이내에 만료됩니다. 즉, 두 번째 요청 시 시간이 너무 짧으면 충돌이 발생하게 됩니다.
방금 WeChat 개발을 배웠는데 코드 작성이 완벽하지 않습니다. 수명이 7200보다 큰지 여부만 판단했습니다. 매 순간 판독을 판단할 수 있다고 말하는 사람을 봤습니다. 제 코드에 대한 최적화 제안이 있는지 궁금합니다. 감사합니다

<code>function getWxAccessToken(){
    if ( $_SESSION['access_token'] && $_SESSION['expire_time'] > time() ) {
        //未过期
        return $_SESSION['access_token'];
    }else {
        $appid        = "wx3bbf9ae731a6eb07";
        $appsecret = "2b14a75fa48825ef3c76c8949b5e030f";
        $url          = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=".$appid."&secret=".$appsecret;
        $res =$this->https_request($url,'get','json');
        $access_token = $res["access_token"];
        //将重新获取到的access_token存到session里
        $_SESSION['access_token']=$access_token;
        $_SESSION['expire_time']=time()+7200;
        return $access_token; 
    }
}
</code>

충돌은 동일한 컨트롤러 아래의 메서드이며 각 호출은

을 사용합니다.
<code>    $access_token=$this->getWxAccessToken();
</code>

오류 메시지는 다음과 같습니다

<code>array(2) {
  ["errcode"] => int(40001)
  ["errmsg"] => string(81) "invalid credential, access_token is invalid or not latest hint: [pd4MfA0688vr40!]"
}
</code>

공식 말씀을 봤습니다
0.0의 공식적인 의미는 비즈니스 로직 포인트를 사용하여 토큰을 새로 고치는 것이 아닙니다. 제가 쓴 내용은 비즈니스 로직을 사용하여 토큰을 새로 고치는 것입니다. 타사 중앙 제어?
WeChat은 여러 개의 글로벌 access_token 충돌을 획득하여 무효화됩니까? (해결책)


QR 코드 생성기에 메소드의 절대 경로를 넣고 스캔하세요. 이 디버깅 결과는 브라우저를 통해 직접 접근하는 것보다 더 정확한 느낌을 줍니다.
대부분의 경우 브라우저를 열었을 때 40001이 보고되면 프로그램은 기본적으로 문제가 없는 것입니다

답글 내용:

토큰은 기본적으로 7200초 후에 만료됩니다. 두 번째 장소도 동일한 토큰을 요청하는 경우 첫 번째 토큰은 5분 이내에 만료됩니다. 즉, 두 번째 요청 시 시간이 너무 짧으면 충돌이 발생하게 됩니다.
방금 WeChat 개발을 배웠는데 코드 작성이 완벽하지 않습니다. 수명이 7200보다 큰지 여부만 판단했습니다. 매 순간 판독을 판단할 수 있다고 말하는 사람을 봤습니다. 제 코드에 대한 최적화 제안이 있는지 궁금합니다. 감사합니다

<code>function getWxAccessToken(){
    if ( $_SESSION['access_token'] && $_SESSION['expire_time'] > time() ) {
        //未过期
        return $_SESSION['access_token'];
    }else {
        $appid        = "wx3bbf9ae731a6eb07";
        $appsecret = "2b14a75fa48825ef3c76c8949b5e030f";
        $url          = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=".$appid."&secret=".$appsecret;
        $res =$this->https_request($url,'get','json');
        $access_token = $res["access_token"];
        //将重新获取到的access_token存到session里
        $_SESSION['access_token']=$access_token;
        $_SESSION['expire_time']=time()+7200;
        return $access_token; 
    }
}
</code>

충돌은 동일한 컨트롤러 아래의 메서드이며 각 호출은

을 사용합니다.
<code>    $access_token=$this->getWxAccessToken();
</code>

오류 메시지는 다음과 같습니다

<code>array(2) {
  ["errcode"] => int(40001)
  ["errmsg"] => string(81) "invalid credential, access_token is invalid or not latest hint: [pd4MfA0688vr40!]"
}
</code>

공식 말씀을 봤습니다
0.0의 공식적인 의미는 비즈니스 로직 포인트를 사용하여 토큰을 새로 고치는 것이 아닙니다. 제가 쓴 내용은 비즈니스 로직을 사용하여 토큰을 새로 고치는 것입니다. 타사 중앙 제어?
WeChat은 여러 개의 글로벌 access_token 충돌을 획득하여 무효화됩니까? (해결책)


QR 코드 생성기에 메소드의 절대 경로를 넣고 스캔하세요. 이 디버깅 결과는 브라우저를 통해 직접 접근하는 것보다 더 정확한 느낌을 줍니다.
대부분의 경우 브라우저를 열었을 때 40001이 보고되면 프로그램은 기본적으로 문제가 없는 것입니다

모든 비즈니스가 동일한 토큰을 사용하도록 데이터베이스에 access_token을 저장하여 각 비즈니스 로직 포인트가 독립적으로 access_token을 요청하지 않도록 하는 것이 좋습니다.
공식 문서는 비즈니스 로직이 여러 On에 있는 경우를 의미합니다. 각 서버는 access_token 및expire_time이 세션에 저장되므로 서버 간에 세션이 공유되지 않으므로 서버 중 하나의 access_token이 만료되지 않은 경우 각 서버의 비즈니스가 요청을 시작하게 됩니다. 다른 서버에서 access_token을 다시 요청하여 첫 번째 서버의 access_token이 유효하지 않게 된 후 만료된 access_token을 사용하여 서비스를 요청하여 서비스가 불안정해졌습니다.
중앙 관제 서버를 이용하여 access_token을 저장하여 서비스가 기업 간 통합 및 충돌이 발생하지 않아 데이터 일관성이 보장됩니다

access_token은 모든 호출에 공통적입니다. 모든 사람의 세션이 다르기 때문에 일반적으로 캐시에 저장됩니다. 그렇지 않으면 데이터베이스에 저장하면 됩니다.
사용할 때마다 데이터베이스에 가서 유효기간 내라면 직접 사용하세요. 유효하지 않은 경우에는 다시 검색해서 데이터베이스에 삽입하세요.

세션은 사용자 기반이므로 각 사용자가 방문할 때 새로 고칠 수 있습니다.
캐시나 데이터베이스에 넣어두고 정기적으로 새로 고치는 것이 좋습니다.

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.