<?php
namespace Home\Model;
use Think\Model;
class WechatModel extends Model {
private $_token = '';
private $appid ;
private $appsecret ;
public function __construct()
{
$this ->appid = C('APPID');
$this ->appsecret = C('APPSECRET');
}
public function getSignPackage() {
$jsapiTicket = $this ->getJsApiTicket();
$protocol = (! empty ( $_SERVER ['HTTPS']) && $_SERVER ['HTTPS'] !== 'off' || $_SERVER ['SERVER_PORT'] == 443) ? "https://" : "http://" ;
$url = "$protocol$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]" ;
$timestamp = time();
$nonceStr = $this ->createNonceStr();
$string = "jsapi_ticket=$jsapiTicket&noncestr=$nonceStr×tamp=$timestamp&url=$url" ;
$signature = sha1( $string );
$signPackage = array (
"appId" => $this ->appid,
"nonceStr" => $nonceStr ,
"timestamp" => $timestamp ,
"url" => $url ,
"signature" => $signature ,
"rawString" => $string
);
return $signPackage ;
}
public function getHuiYuanSignPackage() {
$apiTicket = $this ->getApiTicket();
$protocol = (! empty ( $_SERVER ['HTTPS']) && $_SERVER ['HTTPS'] !== 'off' || $_SERVER ['SERVER_PORT'] == 443) ? "https://" : "http://" ;
$url = "$protocol$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]" ;
$timestamp = time();
$string = $timestamp . $apiTicket . "car_id" ;
$signature = sha1( $string );
$signPackage = array (
"timestamp" => $timestamp ,
"signature" => $signature ,
);
return $signPackage ;
}
public function getApiTicket(){
$data = json_decode( file_get_contents ( "api_ticket.json" ));
if ( $data ->expire_time < time()) {
$accessToken = $this ->getAccessToken();
$url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?type=wx_card&access_token=$accessToken" ;
$res = json_decode( $this ->httpGet( $url ));
$ticket = $res ->ticket;
if ( $ticket ) {
$data ->expire_time = time() + 7000;
$data ->jsapi_ticket = $ticket ;
$fp = fopen ( "api_ticket.json" , "w" );
fwrite( $fp , json_encode( $data ));
fclose( $fp );
}
} else {
$ticket = $data ->jsapi_ticket;
}
return $ticket ;
}
private function createNonceStr( $length = 16) {
$chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" ;
$str = "" ;
for ( $i = 0; $i < $length ; $i ++) {
$str .= substr ( $chars , mt_rand(0, strlen ( $chars ) - 1), 1);
}
return $str ;
}
public function getAccessToken(){
$data = json_decode( file_get_contents ( "access_token.json" ));
if ( $data ->expire_time < time()) {
$url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=$this->appid&secret=$this->appsecret" ;
$res = json_decode( $this ->httpGet( $url ));
$access_token = $res ->access_token;
if ( $access_token ) {
$data ->expire_time = time() + 7000;
$data ->access_token = $access_token ;
$fp = fopen ( "access_token.json" , "w" );
fwrite( $fp , json_encode( $data ));
fclose( $fp );
}
} else {
$access_token = $data ->access_token;
}
return $access_token ;
}
private function getJsApiTicket() {
$data = json_decode( file_get_contents ( "jsapi_ticket.json" ));
if ( $data ->expire_time < time()) {
$accessToken = $this ->getAccessToken();
$url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?type=jsapi&access_token=$accessToken" ;
$res = json_decode( $this ->httpGet( $url ));
$ticket = $res ->ticket;
if ( $ticket ) {
$data ->expire_time = time() + 7000;
$data ->jsapi_ticket = $ticket ;
$fp = fopen ( "jsapi_ticket.json" , "w" );
fwrite( $fp , json_encode( $data ));
fclose( $fp );
}
} else {
$ticket = $data ->jsapi_ticket;
}
return $ticket ;
}
public function openId(){
$url = $_SERVER ['HTTP_HOST'] . $_SERVER ['REQUEST_URI'];
if (!isset( $_GET ['code'])) {
$openidUrl = $this ->snsapi_base( $url );
redirect( $openidUrl );
} else {
$openidAccess_token = $this ->openidAccess_token( $_GET ['code']);
return $openidAccess_token ;
}
}
public function getOpenId( $openid , $access_token )
{
$userInfo = $this ->getUserInfo( $openid , $access_token );
return $userInfo ;
}
public function snsapi_base( $redirect_uri , $scope = "snsapi_userinfo" , $state = 0)
{
$appId = $this ->appid;
$url = "https://open.weixin.qq.com/connect/oauth2/authorize" ;
$url .= "?appid=$appId" ;
$url .= "&redirect_uri=http://$redirect_uri" ;
$url .= "&response_type=code" ;
$url .= "&scope=$scope" ;
$url .= "&state=$state#wechat_redirect" ;
return $url ;
}
public function openidAccess_token( $code ){
$appId = $this ->appid;
$appSecret = $this ->appsecret;
$url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=$appId&secret=$appSecret&code=$code&grant_type=authorization_code" ;
return json_decode( $this ->httpGet( $url ),true);
}
public function getUserInfo( $openid , $access_token ){
$url = "https://api.weixin.qq.com/sns/userinfo?access_token=$access_token&openid=$openid&lang=zh_CN " ;
return json_decode( $this ->httpGet( $url ),true);
}
private function httpGet( $url ) {
$curl = curl_init();
curl_setopt( $curl , CURLOPT_RETURNTRANSFER, true);
curl_setopt( $curl , CURLOPT_TIMEOUT, 500);
curl_setopt( $curl , CURLOPT_SSL_VERIFYPEER, false);
curl_setopt( $curl , CURLOPT_SSL_VERIFYHOST, false);
curl_setopt( $curl , CURLOPT_URL, $url );
$res = curl_exec( $curl );
curl_close( $curl );
return $res ;
}
}
|