위 챗 개발 웹 페이지 에서 사용자 정보 획득 권한 부여(2)

공중 번 호 를 설정 하 는 과정 에서 많은 개발 자 들 이 메뉴 에 HTML 5 페이지 를 추가 합 니 다.때로는 페이지 내 에서 페이지 에 접근 해 야 하 는 사용자 정보 가 필요 합 니 다.이 때 는 웹 페이지 에서 사용자 의 기본 정 보 를 얻 을 수 있 는 권한 을 부여 해 야 합 니 다.
우 리 는 모두 에 게 본 고 에서 설명 한 내용 은 yii 2.0 프레임 워 크 를 바탕 으로 하 는 것 이 라 고 일 깨 워 주 었 다.
1.도 메 인 이름 변경 권한 설정:개발---인터페이스 권한
'웹 페이지 권한 수여 사용자 기본 정보 획득'을 찾 으 려 면 뒤에 대응 하 는'수정'을 클릭 하고 탄 상자 응답 위치 에 권한 수여 도 메 인 이름 을 입력 하면 됩 니 다.이곳 의 도 메 인 이름 은 http://를 추가 하지 않 아 도 됩 니 다.(웹 페이지 권한 수여 도 메 인 이름 에 대한 설명 은 공공 플랫폼 개발 자 문 서 를 참고 하 십시오)


2.인증 획득
OAuth 2.0 블 로 거 에 대해 서 는 방 배 작업실 의 블 로 거 를 참고 하 셨 습 니 다.http://www.cnblogs.com/txw1958/p/weixin71-oauth20.html(PS:방 배 는 위 챗 개발 의 신 이다.그 중에서 위 챗 개발 내용 은 비교적 상세 하 다.참고)그 중에서 위 챗 공식 문서 의 관련 내용 을 상세 하 게 분 석 했 고 권한 수 여 를 받 는 더욱 상세 한 방향 과 방안 도 제공 했다.
실제로 사용자 정 보 를 얻 는 관건 은 사용자 의 openid 를 얻 는 것 이다.블 로 거들 은 사용자 가 공중 번호 메뉴 를 클릭 하여 페이지 를 열 면 자동 으로 권한 을 부여 하고 이 사용 자 를 대상 으로 데이터 베 이 스 를 조작 하려 면 다음 과 같은 두 가지 방식 이 있다.
(1)사용자 정의 메뉴 로 권한 부여 요청 페이지
사용자 정의 메뉴 뒤에 블 로 그 를 따로 쓸 것 입 니 다.사용자 정의 메뉴 를 통 해 권한 을 부여 하 는 방법 은 고급 인터페이스 권한 이 필요 하고 대중 번호 에 관심 이 있 는 사용자 가 메뉴 에서 직접 페이지 로 들 어 가 는 데 국한 되 어 있 습 니 다.

$menu = '{
"button":[
{
"type": "view",
"name": "  ",
"url": "https://open.weixin.qq.com/connect/oauth/authorize?appid=xxx&redirect_uri=http://tx.heivr.com/index.php&response_type=code&scope=snsapi_base&state=#wechat_redirect"
},
{
"name":"    ",
"sub_button":[
{
"type":"click",
"name":"   ",
"key":"express"
},
{
"type":"click",
"name":"    ",
"key":"ww"
}
]
},
]
}'; 
권한 을 수 여 받 아야 하 는 view 는 url 에 위 챗 이 제공 하 는 권한 수여 요청 주 소 를 직접 작성 합 니 다.그 중에서:
•appid:위 챗 공식 플랫폼 의 기본 설정 에 있 는 AppID 를 작성 합 니 다.
•redirect_uri:권한 수여 가 완 료 된 후 이동 하 는 페이지 주소,즉 자신의 html 5 페이지 를 작성 합 니 다.
•state:리 셋 페이지 에 있 는 인자 로 이동 합 니 다.
•response_type:웹 페이지 에서 권한 을 수 여 받 은 두 가지 scope,위 챗 공식 문서 에서 다음 과 같이 설명 합 니 다.
1.snsapi 로base 가 scope 에서 시작 한 웹 페이지 권한 수 여 는 페이지 에 들 어간 사용자 의 openid 를 가 져 오 는 데 사용 되 며,침묵 권한 수 여 를 받 고 자동 으로 리 셋 페이지 로 이동 합 니 다.사용자 가 감지 하 는 것 은 바로 리 셋 페이지 에 들 어 가 는 것 이다(흔히 업무 페이지).
2,snsapiuserinfo 가 scope 에서 시작 한 웹 페이지 권한 수 여 는 사용자 의 기본 정 보 를 얻 는 데 사 용 됩 니 다.그러나 이러한 권한 수 여 는 사용자 가 수 동 으로 동의 해 야 하고 사용자 가 동의 한 적 이 있 기 때문에 주목 하지 않 아 도 권한 수 여 를 받 은 후에 이 사용자 의 기본 정 보 를 얻 을 수 있다.
이 방법 에 따라"상점"을 클릭 하면 돌아 오 는 openid 를 받 을 수 있 고 다음 사용자 정 보 를 얻 을 수 있 습 니 다. 
(2)JS 자동 요청 권한 부여 페이지 이용
이 방법 은 상대 적 으로 서 툴 고 절차 가 복잡 하지만 현재 수 요 를 해결 할 수 있 는 간단 한 방법 은 연구 되 지 않 았 으 며 페이지 의 전환 으로 인해 대부분 페이지 를 방문 하 는 시간 이 증가 하지만 이전 방법 에 비해 이 방법 은 비 관심 사용자 의 기본 정 보 를 얻 을 수 있다.일부 프로그램 은 페이지 공유 와 관련 될 수 있 습 니 다.프로그램 은 강제 적 으로 관심 을 가지 지 않 았 지만 다른 사용자 가 공 유 를 통 해 페이지 에 직접 들 어가 도 사용자 정 보 를 기록 해 야 합 니 다.이 때 이 방법 을 고려 할 수 있 습 니 다.(위 챗 개발 과 관련 된 코드 블 로 거 는 도구 류 로 봉 하여 호출 합 니 다.여기에 먼저 사용 하 는 부분 을 붙 이 고 나중에 정리 가 완료 되면 모두 붙 이 고 다운로드 링크 를 첨부 합 니 다)
이 방법 은 js 요청 링크 획득 code->code 를 이용 하여 openid->사용자 기본 정 보 를 얻 는 것 입 니 다.
a.설정 편집
사용 하 는 일부 위 챗 매개 변 수 를 하나의 클래스 에 단독으로 쓰기 편리 하도록 추가 및 호출 을 수정 할 수 있 습 니 다.

<?php
namespace common\tools\wechat;
/**
*           
*/
class ConfigTool {
/**
*       
* @return array     
*/
public function setConfig() {
//              Token,      
$config['token'] = '   token';
// appID
$config['appid'] = '   appid';
// appSecret
$config['secret'] = '   secret';
//       
$config['redirect_uri'] = 'http://tx.heivr.com/index.php?';
//     HTTPS         
$config['https_request'] = false;
//      ,snsapi_base (       ,    ,      openid),
// snsapi_userinfo (      ,   openid    、  、   。  ,
//           ,      ,       )
$config['scope'] = 'snsapi_userinfo';
//   
$config['lang'] = 'zh_CN'; // zh_CN   ,zh_TW   ,en   
//           
$config['mp_authorize_url'] = 'https://api.weixin.qq.com/cgi-bin/token';
//       js      
$config['jsapi_ticket_url'] = 'https://api.weixin.qq.com/cgi-bin/ticket/getticket';
//     
$config['authorize_url'] = 'https://open.weixin.qq.com/connect/oauth/authorize';
//   access token    
$config['access_token_url'] = 'https://api.weixin.qq.com/sns/oauth/access_token';
//    token    
$config['refresh_token_url'] = 'https://api.weixin.qq.com/sns/oauth/refresh_token';
//         
$config['userinfo_url'] = 'https://api.weixin.qq.com/sns/userinfo';
//   access token
$config['valid_token_url'] = 'https://api.weixin.qq.com/sns/auth';
//         
$config['media_temp_upload_url'] = 'https://api.weixin.qq.com/cgi-bin/media/upload?';
//         
$config['media_forever_upload_url'] = 'https://api.weixin.qq.com/cgi-bin/material/add_material?';
return $config;
}
}
b.https 요청 도구

<?php
namespace common\tools;
/**
* https      
*/
class HttpsTool {
const TIMEOUT = ; //       
private $ch; // curl  
/**
*   curl  ,       
* @param string     
* @param array    post           
* @param string     ,get    post,    get
* @param bool    https    
*/
public function send_request($requests, $params = null, $method = 'get', $https = true) {
//  get    
if ($method == 'get') {
if($params){
$request = $requests . $this->create_url($params);
}else{
$request = $requests;
}
}else{
$request = $requests;
}
$this->ch = curl_init($request);
curl_setopt($this->ch, CURLOPT_RETURNTRANSFER, );//        ,     
curl_setopt($this->ch, CURLOPT_TIMEOUT, self::TIMEOUT); //            
//      https    
if ($https) {
curl_setopt($this->ch, CURLOPT_SSL_VERIFYPEER, ); //           
curl_setopt($this->ch, CURLOPT_SSL_VERIFYHOST, ); //       SSL        
}
if ($method == 'post') { //  post    
//curl_setopt($this->ch, CURLOPT_SAFE_UPLOAD, false); //php .        ,.   
curl_setopt($this->ch, CURLOPT_POST, ); //        Post  
curl_setopt($this->ch, CURLOPT_POSTFIELDS, $params); // Post      
curl_setopt($this->ch, CURLOPT_RETURNTRANSFER, );
}
$tmpInfo = curl_exec($this->ch); //     
if (curl_errno($this->ch)) {
echo 'Errno:'.curl_error($this->ch);//    
}
curl_close($this->ch); //   CURL  
//var_dump($tmpInfo);exit;
return $tmpInfo; //     
}
/**
*   url
*/
public function create_url($data) {
$temp = '?';
foreach ($data as $key => $item) {
$temp = $temp . $key . '=' . $item . '&';
}
return substr($temp, , -);
}
}
curl 에 대하 여setopt($this->ch, CURLOPT_SAFE_UPLOAD,false)는 위 챗 이미지 자원 에 블 로그 에 나타 난 슬 픈 역 사 를 상세 하 게 설명 할 것 이다.여 기 는 잠시 사용 할 수 없고 설명 하지 않 는 다.
c.권한 부여 기본 클래스

<?php 
namespace common\tools\wechat;
use common\tools\wechat\ConfigTool;
use common\tools\HttpsTool;
/**
* Weixin_oauth   
*/
class OauthTool {
public $conf;
public function __construct(){
$re = new ConfigTool; 
$this->conf = $re->setConfig();
} 
/**
*          
* @param string           
* @param sting      
* @param bool              
*/
public function authorize_addr($route, $state='', $mp=false) {
if ($mp) {
$data = [
'appid' => $this->conf['appid'],
'secret' => $this->conf['token'],
'grant_type' => 'client_credential'
];
$url = $this->conf['mp_authorize_url'];
} else {
$data = [
'appid' => $this->conf['appid'], //       
'redirect_uri' => urlencode($this->conf['redirect_uri'] . $route), //             
'response_type' => 'code', //    ,    code
'scope'=>$this->conf['scope'], //       
'state'=>$state, //      state  ,           
'#wechat_redirect'=>'' //         ,   ,             
];
$url = $this->conf['authorize_url'];
}
$send = new HttpsTool;
//var_dump($url . $send->create_url($data));exit;
return $url . $send->create_url($data);
}
/**
*    access token
* @param string     access token code,    
*/
public function access_token($code) {
$data = [
'appid' => $this->conf['appid'],
'secret' => $this->conf['secret'],
'code' => $code,
'grant_type' => 'authorization_code'
];
//     url
$url = $this->conf['access_token_url'];
$send = new HttpsTool;
return $send->send_request($url, $data);
}
/**
*       
* @param string access token
* @param string    open id
*/
public function userinfo($token, $openid) {
$data = [
'access_token' => $token,
'openid' => $openid,
'lang' => $this->conf['lang']
];
//     url
$url = $this->conf['userinfo_url'];
$send = new HttpsTool;
return $send->send_request($url, $data);
}
}
d.기본 클래스 호출 및 사용자 데이터 처리 권한 부여(컨트롤 러 호출 전에 사용자 데이터 저장 또는 업데이트)

<?php
namespace wechat\controllers\classes;
use common\tools\wechat\OauthTool;
use common\models\User;
use common\tools\EmojiTool;
/**
*           
*/
class UserinfoClass {
/**
*        code 
* @return string   code
*/
public function getCode($route, $state){
$re = new OauthTool;
$request = $re->authorize_addr($route, $state);
$code = isset($_GET['code']) ? $_GET['code'] : '';
return [$request,$code];
}
/**
*             (       code)
*/
public function info($code) {
$re = new OauthTool;
//  access token
$access = $re->access_token($code);
$token = json_decode($access,true);
//header("Content-type: text/html; charset=gbk"); 
//      
if(count($token) != ) {
$response = $re->userinfo($token['access_token'], $token['openid']);
$user = json_decode($response,true);
//      
//$user['nickname'] = EmojiTool::emoji_trans($user['nickname']);
if($model = User::findOne(['openid' => $user['openid'] ])) { //         
$model->attributes = $user;
$model->modify_time = time();
$model->save(false);
}else{ //       
$model = new User;
$model->attributes = $user;
$model->create_time = time();
$model->save(false);
}
}
return isset($model->id) ? $model->id : '';
}
} 
e.컨트롤 러 호출(한 가지 방법 만 붙 입 니 다)

/**
*     
* @return object         
*/
public function actionIndex(){
//          
if(isset($_GET['state'])) {
$refresh = ;
}else{
$refresh = ;
}
//    code
$user = new UserinfoClass;
$request = $user->getCode('r=store/index', );
//   userid
$userid = $user->info($request[]);
$model = new Product;
$list = $model->find()->where(['status' => ])->all();
return $this->render('index',['list' => $list, 'refresh' => $refresh, 'userid' => $userid, 'request' => $request]);
}
프로그램 은 사용자 에 게 제품 목록 을 열 어 사용자 정 보 를 얻 고 데이터 베 이 스 를 저장 하도록 요구 합 니 다.그 중에서 몇 가지 변 수 를 다음 과 같이 설 계 했 습 니 다.
$refresh:페이지 가 새로 고침 되 었 는 지 여 부 를 판단 합 니 다.처음 페이지 를 열 었 을 때 oauth 인증 을 하지 않 았 을 때 자동 으로 인증 을 요청 합 니 다.반복 되 는 새로 고침 을 피 합 니 다.여 기 는 리 셋 된 state 매개 변 수 를 판단 근거 로 state=1 을 설정 합 니 다.(특정 매개 변수 가 있 으 면 state 값 을 필요 한 값 으로 할당 할 수 있 습 니 다)
$request:인증 요청 주소
f.보기 자동 새로 고침
보기 에 다음 js 코드 만 추가 하면 됩 니 다.

<script type="text/javascript">
//      code
$(function(){
var refresh = <?= $refresh; ?>;
var request = '<?= $request[]; ?>';
if(refresh == ){
console.log();
location = request;
}
});
</script>
이상 의 내용 은 여러분 에 게 위 챗 개발 의 웹 페이지 권한 수여 로 사용자 정보(2)를 얻 을 수 있 는 모든 서술 을 소개 하 였 으 며,본 고 는 공유 가 여러분 에 게 도움 이 되 기 를 바 랍 니 다.

좋은 웹페이지 즐겨찾기