php 위 챗 개발 의 매개 변수 QR 코드 사용

최근 에 위 챗 PC 사이트 인 위 챗 관련 기능 의 개발 을 했 습 니 다.초보 자의 측면 에서 볼 때 위 챗 공식 번호 의 문 서 는 이해 하기 어렵 습 니 다.인터넷 에서 찾 은 게시 물 들 은 대부분이 위 챗 공식 플랫폼 에서 준 문 서 를 복사 한 것 입 니 다.위 챗 테이프 파라미터 QR 코드 를 개발 하 는 과정 에서 많은 구 덩이 를 만 났 습 니 다.여기 서 제 개발 과정 을 상세 하 게 기록 하 겠 습 니 다.모두 에 게 도움 이 되 기 를 바 랍 니 다.
내 가 이번에 개발 한 것 은 인증 서비스 번 호 를 사용 한 것 이다. 
접속
우선 위 챗 공식 번호 로 들 어가 기->기본 설정 
다음은 기본 설정 페이지 입 니 다.URL 에 서버 주 소 를 입력 하 십시오.이 주 소 는 바로 위 챗 푸 시 이벤트 의 인 터 페 이 스 를 받 는 것 입 니 다.저 는 thinkpHP 프레임 워 크 를 사용 하여 개발 한 프로그램 입 니 다.그 중의 Module(Decoration)의 Action 디 렉 터 리 에 새로운 종 류 를 만 듭 니 다.예 를 들 어 WechatAction.class.phop 입 니 다.이 Action 에 Public 방법 을 새로 만 듭 니 다.예 를 들 어 URL Redirect()라 고 하면 이 URL 에 http:/[IP]:[port]/index.php/Decoration/Wechat/UrlRedirect 를 작성 한 다음 에 Token,Token 을 마음대로 작성 하고 EncodingAESKey 를 사용 하 시 겠 습 니까?확인 을 클릭 하면 위 챗 은 이 URL 에 get 요청 을 보 냅 니 다.그 안에 많은 인자 가 포함 되 어 있 습 니 다.그 중에서 대부분 은 우리 가 이번 방문 이 위 챗 서버 가 요청 한 것 인지 확인 하 라 고 했 습 니 다.저 는 검증 하지 않 았 습 니 다.그의 요 구 는 만약 에 우리 가 확인 에 성공 하면 get 요청 중의 매개 변수 인 echostr 를 되 돌려 주 는 것 입 니 다.이곳 의 반환 은 return 도 아니 고 ajax Return 도 아 닙 니 다.echo 를 사용 합 니 다.thinkpHP 로 개발 하면 echo I('echostr')를 직접 사용 합 니 다.됐다.그리고 인터페이스 가 검증 에 성 공 했 습 니 다. 

2.매개 변수 QR 코드 의 역할
위 챗 의 매개 변수 인 QR 코드 는 두 가지 가 있 습 니 다.하 나 는 임시 QR 코드 이 고 하 나 는 영구 QR 코드 입 니 다.그러나 영구 QR 코드 의 생 성 은 수량 제한 이 있 습 니 다.제 가 이번에 실현 하고 자 하 는 기능 은 사용자 가 로그 인하 지 않 은 상황 에서 사이트 에서 제품 을 사용 하 는 것 입 니 다.예 를 들 어 특정한 상품 의 상세 한 가격 을 얻 었 지만 등록 하고 싶 지 않 지만 이 견적 서 를 저장 하고 싶 습 니 다.이때 홈 페이지 는 QR 코드 를 생 성 할 수 있 습 니 다.사용 자 는 위 챗 으로 이 QR 코드 를 스 캔 하면 공식 공중 번 호 는 이 사용자 에 게 하루 동안 그림 과 글 메 시 지 를 보 냅 니 다.그림 과 글 메시지 가 열 린 후에 사용자 가 방금 얻 은 견적 서 를 보 내 고 수시로 클릭 하여 친구 에 게 가격 을 비교 할 수 있 습 니 다.그래서 임시 QR 코드 는 정상적으로 사용 할 수 있 습 니 다.
위 는 내 가 어떻게 사용 하 는 지,아래 는 전체 상호작용 의 절 차 를 소개 한다.
사용자 가 이 QR 코드 를 스 캔 할 때 사용자 가 대중 번호 에 관심 이 있 으 면 사용 자 는 대중 번호 와 의 세 션 페이지 에 직접 들 어 갑 니 다.위 챗 서버 는 우리 에 게 이전 설정 한 서버 URL 에 메 시 지 를 보 낼 것 입 니 다.그 중에서 우리 가 사용자 정의 인 자 를 가 져 갈 수 있 습 니 다.만약 에 사용자 가 공중 번호 에 관심 이 없 으 면 사용 자 는 먼저 공중 번호 관심 페이지 로 이동 합 니 다.사용자 가 관심 을 클릭 하면 공중 번호 의 세 션 페이지 에 바로 들 어 갑 니 다.위 챗 서버 는 이때 우리 가 설정 한 URL 에 이벤트 메 시 지 를 보 내 고 사용자 정의 파 라 메 터 를 가 져 옵 니 다.우 리 는 이 파라미터 와 이벤트 유형 에 따라 다음 동작 을 제어 할 수 있 습 니 다.
3 구체 적 인 개발 과정 
3.1 획득 accesstoken
이 accesstoken 은 우리 프로그램 이 위 챗 인 터 페 이 스 를 호출 하 는 증거 입 니 다.현재 유효기간 은 7200 초 입 니 다.그래서 우 리 는 정기 적 으로 access 를 업데이트 해 야 합 니 다.token。
획득 방법:
방법:GET
url :https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET
그 중의 매개 변수 인 APPID 와 APPSECRET 는 저희 공중 번호 의 APPID 와 APPSECRET 입 니 다.위 챗 공중 번호->기본 설정 에서 알 수 있 듯 이 호출 성공 하면 다음 과 같은 JSON 데 이 터 를 되 돌려 줍 니 다.
 {"access_token":"ACCESS_TOKEN","expires_in":7200}
그 중 accesstoken 은 인터페이스 증명 서 를 호출 하 는 것 입 니 다.expirein 은 token 유효 시간 입 니 다.
저 는 accesstoken 은 데이터베이스 에 존재 하 며 만 료 시간 을 저장 한 다음 공용 함수 getWechatAccessToken()을 봉인 하고 매번 access 를 검사 합 니 다.token 이 만 료 되 었 는 지,만 료 되면 다시 가 져 옵 니 다.그렇지 않 으 면 데이터베이스 에 저 장 된 access 를 직접 사용 합 니 다.token 이면 됩 니 다.어디서 봤 는 지 잊 어 버 렸 습 니 다.이 accesstoken 의 매일 획득 횟수 는 제한 이 있 을 것 입 니 다.다음은 getWechatAccessToken()입 니 다.  의 구체 적 인 실현:

//  access_token
function getWechatAccessToken(){
 $wechatInfo = M('wechat_info')->select();
 $wechatInfo = array_reduce($wechatInfo, create_function('$result, $v', '$result[$v["conf_name"]] = $v;return $result;'));
 $expireTime = $wechatInfo['PUBLIC_WECHAT_ACCESSTOKEN_EXPIRES']['conf_value'];        //     ,         

 if (time() < $expireTime){    //access_token   
  return $wechatInfo['PUBLIC_WECHAT_ACCESSTOKEN']['conf_value'];
 }else{         //access_token  ,    
  $baseUrl = C('WECHAT_PUBLIC_GET_ACCESS_TOKEN');
  $url = str_replace("##APPSECRET##", $wechatInfo['PUBLIC_WECHAT_APPSECRET']['conf_value'], str_replace("##APPID##", $wechatInfo['PUBLIC_WECHAT_APPID']['conf_value'], $baseUrl));
  $result = file_get_contents($url);
  $result = json_decode($result, true);

  if (array_key_exists('errorcode', $result)){  //      
   return false;
  }else{
   M('wechat_info')->where(array('conf_name' => 'PUBLIC_WECHAT_ACCESSTOKEN'))->save(array('conf_value' => $result['access_token']));
   M('wechat_info')->where(array('conf_name' => 'PUBLIC_WECHAT_ACCESSTOKEN_EXPIRES'))->save(array('conf_value' => time()+$result['expires_in']-200));
   return $result['access_token'];
  }
 }
}
C('WECHAT_PUBLIC_GET_ACCESS_TOKEN') = https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET
이것 을 봉 한 후에 우 리 는 매번 안심 하고 사용 할 수 있다.
2 임시 QR 코드 만 들 기
3.2.1 티켓 획득 3
요청 방식:POST
인터페이스:https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=TOKEN
POST 데이터:{"expireseconds": 604800, "action_name": "QR_SCENE", "action_info": {"scene": {"scene_id": 123}}}
인터페이스 URL 의 TOKEN,즉 우리 가 3.1 에서 얻 은 accesstoken,post 데이터 중 expireseconds 는 QR 코드 의 유효 시간 으로 최대 30 일,actionname 임시 QR 코드 는 고정 이 QRSCENE,scene_id 즉,사용자 정의 매개 변 수 는 32 비트 0 정수 가 아 닙 니 다.저 는 응용 프로그램 에서 주문 한 ID 로 설정 합 니 다.위 챗 서버 푸 시 이벤트 때 이 값 을 우리 가 설정 한 인터페이스 에 되 돌려 주 고 이 값 에 따라 해당 하 는 주문 데 이 터 를 웹 페이지 에 보 여 드 리 겠 습 니 다.이것 은 뒷말 입 니 다. 
다음은 임시 QR 코드 를 만 드 는 방법 입 니 다. 

//       
function getTemporaryQrcode($orderId){
 $accessToken = getWechatAccessToken();
 $url = str_replace("##TOKEN##", $accessToken, C('WECHAT_PUBLIC_GET_TEMPORARY_TICKET'));
 $qrcode = '{"expire_seconds": 1800, "action_name": "QR_SCENE", "action_info": {"scene": {"scene_id": '.$orderId.'}}}';
 $result = api_notice_increment($url, $qrcode);
 $result = json_decode($result, true);
 return urldecode($result['url']);
}

그 중의 방법 apinotice_increment()는 제 가 봉인 한 POST 방법 함수 입 니 다.저 는 POST 방법 을 많이 시 도 했 습 니 다.아마도 위 챗 인터페이스 가 POST 방법 과 매개 변수 에 대한 제한 이 비교적 엄격 하기 때문에 오 랜 시간 을 낭 비 했 습 니 다.마지막 으로 인터넷 에서 사용 할 수 있 는 봉 인 된 POST 방법 을 찾 았 습 니 다.먼저 해 보 세 요.만약 에 위 챗 이 잘못 되 돌 아 왔 다 면 이 걸 사용 하 세 요.적어도 내 가 위 챗 이라는 인 터 페 이 스 를 테스트 할 때 postman 테스트 로 되 돌아 오 는 것 은 모두 오류 이 며,반드시 JSON 문자열 을 사용 해 야 한다.반드시 매우 엄격 한 JSON 문자열 이 어야 한다.다음은 이 방법 이다. 

function api_notice_increment($url, $data){
 $ch = curl_init();
 $header = "Accept-Charset: utf-8";
 curl_setopt($ch, CURLOPT_URL, $url);
 curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
 curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
 curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
 curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
 curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (compatible; MSIE 5.01; Windows NT 5.0)');
 curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
 curl_setopt($ch, CURLOPT_AUTOREFERER, 1);
 curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
 curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
 $tmpInfo = curl_exec($ch);
 if (curl_errno($ch)) {
  curl_close( $ch );
  return $ch;
 }else{
  curl_close( $ch );
  return $tmpInfo;
 }

}

getTemporary Qrcode()에 설정 파일 에 있 는 인자 가 있 습 니 다.사실은 위 챗 인터페이스 링크 입 니 다. 
C('WECHAT_PUBLIC_GET_TEMPORARY_TICKET') = https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=##TOKEN##
이 인터페이스의 반환 값 은: 
{"ticket":"gQH47joAAAAAAAAAASxodHRwOi8vd2VpeGluLnFxLmNvbS9xL2taZ2Z3TVRtNzJXV1Brb3ZhYmJJAAIEZ23sUwMEmm3sUw==","expire_seconds":60,"url":"http:\/\/weixin.qq.com\/q\/kZgfwMTm72WWPkovabbI"}
그 중 ticket 은 다음 호출 을 위 한 증빙서류 입 니 다.expireseconds 는 QR 코드 의 유효기간 입 니 다.url 은 우리 가 만 든 QR 코드 를 스 캔 한 후에 열 린 링크 입 니 다.그래서 만약 에 우리 가 QR 코드 를 만 드 는 방법 을 실현 하면 다음 호출 을 하지 않 아 도 됩 니 다.저 는 이 단계 에서 멈 추고 url 의 값 을 직접 되 돌려 주 고 이 url 의 값 을 이용 하여 QR 코드 를 생 성하 여 로 컬 에 존재 하면 됩 니 다.PHP 생 성 QR 코드 는 phpqrcode 를 사용 할 수 있어 서 좋 습 니 다.다음 단계 도 대충 말씀 드 리 겠 습 니 다.
3.2.2 QR 코드 주소 가 져 오기
요청 방식:GET
인터페이스:https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=TICKET
이 인터페이스의 반환 값 은 그림 으로 직접 보 여주 거나 다운로드 할 수 있 습 니 다.우 리 는 구체 적 으로 사용 한 적 이 있 기 때문에 어떻게 보 여 줘 야 할 지 모 르 겠 습 니 다. 
3.3 사용자 가 QR 코드 를 스 캔 한 후에 발생 한 일
 3.3.1 스 캔 후에 무슨 일이 일 어 났 습 니까?
위 에서 언급 한 바 와 같이 사용 자 는 우리 가 생 성 한 임시 QR 코드 를 스 캔 합 니 다.만약 에 사용자 가 공중 번호 에 관심 이 없 으 면 먼저 공중 번호 의 관심 페이지 로 이동 합 니 다.관심 을 클릭 하면 공중 번호 의 세 션 페이지 에 들 어가 고 우리 가 설정 한 인터페이스 에 사건 을 푸 시 합 니 다.만약 사용자 가 관심 을 가지 고 있다 면,사용자 위 챗 은 바로 공중 번호 세 션 페이지 로 이동 한 다음,위 챗 서버 는 우리 가 설정 한 인터페이스 에 이 벤트 를 전송 할 것 입 니 다.
사용자 가 위 챗 서버 가 우리 에 게 보 내 는 사건 에 관심 을 가 지 는 것 은 많 지 않 습 니 다.다만 사용자 가 보 내 는 사건 에 관심 을 가 지 는 sceneid 앞 에 접 두 사 를 붙 입 니 다.다음은 위 챗 공식 플랫폼 문서 에 대한 설명 입 니 다.
사용자 가 관심 이 없 을 때 관심 이 있 는 이벤트 푸 시 를 진행 합 니 다.

<xml><ToUserName><![CDATA[toUser]]></ToUserName>        //      
<FromUserName><![CDATA[FromUser]]></FromUserName>       //     (openid)
<CreateTime>123456789</CreateTime>                //      (  )
<MsgType><![CDATA[event]]></MsgType>              //     event
<Event><![CDATA[subscribe]]></Event>              //    (subscribe)
<EventKey><![CDATA[qrscene_123123]]></EventKey>        //  KEY ,qrscene_   ,         
<Ticket><![CDATA[TICKET]]></Ticket>               //   ticke ,           
</xml> 
 
사용자 가 관심 을 가 졌 을 때의 이벤트 푸 시

<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>        //      
<FromUserName><![CDATA[FromUser]]></FromUserName>     //     (openid)
<CreateTime>123456789</CreateTime>             //      
<MsgType><![CDATA[event]]></MsgType>     //    event
<Event><![CDATA[SCAN]]></Event>               //     event
<EventKey><![CDATA[SCENE_VALUE]]></EventKey>   //  key ,   32      ,           scene_id
<Ticket><![CDATA[TICKET]]></Ticket>      //    ticke,           
</xml>
3.3.2 우 리 는 무엇 을 해 야 합 니까?
우 리 는 자신 이 작성 한 URL 인터페이스 에서 이 사건 을 받 은 후에 우리 가 하고 싶 은 일 을 할 수 있 는 물건 을 받 아야 한다.내 가 실현 하고 자 하 는 기능 은 비교적 간단 하기 때문에 scene 만 받 으 면 된다.id 면 됩 니 다.이것 은 제 가 사용자 에 게 보 여 드릴 주문 데이터 이기 때 문 입 니 다.다음은 제 가 쓴 수신 과 처리 부분 입 니 다.비교적 간단 합 니 다.주로 위 챗 푸 시 를 어떻게 받 아야 하 는 지 보 겠 습 니 다. 

public function urlRedirect(){
  $postStr = $GLOBALS["HTTP_RAW_POST_DATA"];
  $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
  $fromUsername = (string)$postObj->FromUserName;
  $EventKey = trim((string)$postObj->EventKey);
  $keyArray = explode("_", $EventKey);
  if (count($keyArray) == 1){   //      
   $this->sendMessage($fromUsername, $EventKey);
  }else{                   //           
   $this->sendMessage($fromUsername, $keyArray[1]);
  }
 }

저 는 다른 인 자 를 사용 하지 않 았 습 니 다.다만 서로 다른 푸 시 사건 에 따라 제 가 원 하 는 주문 ID 를 받 았 습 니 다.그리고 이때 사실은 여기 서 공중 번호 의 고객 센터 로 스 캔 한 이 사용자 와 대 화 를 하 는 것 과 같 습 니 다.상단 코드 에서 호출 된 sendmessage()는 고객 계 정 을 사용 하여 스 캔 사용자 에 게 그림 메 시 지 를 보 내 는 것 입 니 다.왜냐하면 저 는 scen 을 가지 고 있 기 때 문 입 니 다.id 와 동시에 사용자 의 openid 도 받 았 습 니 다.이 를 이용 하여 사용자 에 게 메 시 지 를 보 낼 수 있 습 니 다.
다음은 sendmessage()방법 입 니 다. 

//         ,         
 public function sendMessage($openid,$orderId){
  $url = str_replace('##TOKEN##', getWechatAccessToken(), C('WECHAT_SEND_MESSAGE'));
  $redirectUrl = str_replace("##ORDERID##", $orderId, str_replace("##OPENID##", $openid, C('WECHAT_REDIRECT_URL_PRE')));
  $orderInfo = M('order')->where(array('orderid' => $orderId))->field(array('totalMoney', 'savedMoney', 'roomarea'))->find();
  $description = str_replace("##ROOMAREA##", intval($orderInfo['roomarea'] * 1.25), C('WECHAT_MESSAGE_BRIEF'));
  $description = str_replace("##TOTALBUDGET##", $orderInfo['totalMoney'], $description);
  $description = str_replace("##MARKETBUDGET##", $orderInfo['totalMoney']+$orderInfo['savedMoney'], $description);
  $description = str_replace("##SAVEMONEY##", $orderInfo['savedMoney'], $description);
  $dataStr = '{"touser":"' . $openid . '","msgtype":"news","news":{"articles":[{"title":"' . C('WECHAT_MESSAGE_TITLE') .
   '","description":"' . $description . '","url":"' . $redirectUrl . '","picurl":"' . C('WECHAT_MESSAGE_PICURL') . '""}]}}';
  api_notice_increment($url, $dataStr);
 }

그 중 C('WECHATSEND_MESSAGE') = 'https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token=\#\#TOKEN\#'아래 의 큰 strreplace 는 그룹 에서 사용자 에 게 보 낸 문자 일 뿐 입 니 다.$dataStr 의 형식 을 주의해 야 합 니 다.이 안 에는 JSON 문자열 이 엄격 해 야 합 니 다.모든 문자열 을 작은 따옴표 로 묶 어야 합 니 다.위 챗 인 터 페 이 스 는 POST 매개 변수 에 대한 제한 이 정말 엄격 합 니 다.
다음은 위 챗 공식 플랫폼 개발 자 문서 에서 그림 메 시 지 를 보 내 도록 요구 하 는 POST data 형식 입 니 다. 

{
 "touser":"OPENID",
 "msgtype":"news",
 "news":{
  "articles": [
   {
    "title":"Happy Day",
    "description":"Is Really A Happy Day",
    "url":"URL",
    "picurl":"PIC_URL"
   },
   {
    "title":"Happy Day",
    "description":"Is Really A Happy Day",
    "url":"URL",
    "picurl":"PIC_URL"
   }
   ]
 }
}

그 중에서 url 은 사용자 가 이 메 시 지 를 클릭 한 후에 열 린 주소 입 니 다.이때 저 는 자신의 사이트 의 주 소 를 만 들 었 습 니 다.get 요청 주소 입 니 다.그 안에 매개 변 수 를 가지 고 있 는 것 은 사용자 의 openid 와 주문 id 입 니 다.그러면 사용자 가 그림 메 시 지 를 클릭 하면 방금 주문 한 내용 을 볼 수 있 습 니 다.웹 페이지 에 사용자 의 위 챗 프로필 과 닉네임 을 보 여 줘 야 하기 때 문 입 니 다.그래서 저 는 openid 도 매개 변수 에 넣 고 페이지 를 불 러 오기 전에 사용자 의 개인 정보 와 주문 데 이 터 를 받 은 다음 에 웹 페이지 를 보 여 드 리 겠 습 니 다.이러한 절차:사용자 가 아래 에 로그 인하 지 않 았 습 니 다->위 챗 QR 코드 생 성->사용자 스 캔 은 공중 번호 에 관심 을 가지 고 있 습 니 다->주문 의 상세 한 정 보 를 보면 완 료 됩 니 다.또한 이 그림 메시지 가 열 린 링크 에 지 니 고 있 는 매개 변 수 는 이 사용자 의 액 openid 와 다음 주문 ID 이기 때문에 어디 에 공유 하 든 어떤 브 라 우 저 로 열 어도 방문 할 수 있 고 이 사용자 의 프로필 사진 과 닉네임 정 보 를 보 여 주 는 것 도 제 가 실현 하고 자 하 는 효과 입 니 다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기