>  기사  >  백엔드 개발  >  [PHP] 위챗 결제 JsApi 40163 오류

[PHP] 위챗 결제 JsApi 40163 오류

little bottle
little bottle앞으로
2019-04-17 10:43:394098검색

이 글에서는 WeChat 결제 JsApi 40163 오류 및 해결 코드를 공유하겠습니다.
오류:
정의되지 않은 배열 인덱스: openid.
검사 결과: WeChat 결제 승인에서 openId {"errcode":40163,"errmsg":"code been Used"를 획득한 것으로 확인되었습니다.}
이유: WeChat 결제 코드는 한 번만 사용할 수 있으며 분실됩니다. 두 번째로 재사용할 때 이 오류가 발생합니다.
해결 방법 관련 참고 자료 : https://www.e-learn.cn/content/php/1102683
참고 자료에 있는 방법을 시도해 보았는데 소용이 없어서 이유를 토대로 다시 작성했습니다.
조사 결과, 문제는 다음에서 발견되었습니다.
WxPay. JsApiPay.php의 GetOpenid 메서드, 소스 코드:

/**
 * 
 * 通过跳转获取用户的openid,跳转流程如下:
 * 1、设置自己需要调回的url及其其他参数,跳转到微信服务器https://open.weixin.qq.com/connect/oauth2/authorize
 * 2、微信服务处理完成之后会跳转回用户redirect_uri地址,此时会带上一些参数,如:code
 * 
 * @return 用户的openid
 */
public function GetOpenid()
{

   //通过code获得openid
   if (!isset($_GET['code']) ){
      //触发微信返回code码
      $baseUrl = urlencode('http://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']);
      $url = $this->__CreateOauthUrlForCode($baseUrl);
      Header("Location: $url");
      exit();
   } else {
      //获取code码,以获取openid
       $code = $_GET['code'];
       $openid = $this->getOpenidFromMp($code);
    
       return $openid;
   }
}

수정된 코드:

/**
 * 
 * 通过跳转获取用户的openid,跳转流程如下:
 * 1、设置自己需要调回的url及其其他参数,跳转到微信服务器https://open.weixin.qq.com/connect/oauth2/authorize
 * 2、微信服务处理完成之后会跳转回用户redirect_uri地址,此时会带上一些参数,如:code
 * 
 * @return 用户的openid
 */
public function GetOpenid()
{

   //通过code获得openid
   if (!isset($_GET['code']) ){
      //触发微信返回code码
      $baseUrl = urlencode('http://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']);
      $url = $this->__CreateOauthUrlForCode($baseUrl);
      Header("Location: $url");
      exit();
   } else {
      //获取code码,以获取openid
       $code = $_GET['code'];
           if(session("?$code")){
               $openid = $this->getOpenidFromMp($code);
           }else{
               $openid= session($code);
           }
           session($code, $openid);// ######  2019.03.01  加  为解决code been used

      return $openid;
   }
}

논리는 획득한 openid를 다음 이름으로 세션에 저장하는 것입니다. code; 다시 요청할 때 해당 코드가 두 번 사용되는 것을 방지하기 위해 해당 세션이 존재하는지 코드로 요청합니다.

관련 튜토리얼: PHP 비디오 튜토리얼

위 내용은 [PHP] 위챗 결제 JsApi 40163 오류의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 cnblogs.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제