Files
xk-api-yii/common/services/WeappService.php
2024-09-19 11:32:39 +08:00

136 lines
4.6 KiB
PHP

<?php
namespace common\services;
use GuzzleHttp\Client;
use yii\base\Exception;
class WeappService
{
public $appid = '';
public $secret = '';
protected static $guzzleOptions = ['http_errors' => false];
public $base_url = "https://api.weixin.qq.com";
public function __construct($config = [])
{
if(!\Yii::$app->params['wechat']['app_id'] || !\Yii::$app->params['wechat']['app_secret']){
throw new Exception('请设置后台小程序配置');
}
$this->appid = \Yii::$app->params['wechat']['app_id'];
$this->secret = \Yii::$app->params['wechat']['app_secret'];
}
/**
* Get a fresh instance of the Guzzle HTTP client.
*
* @return \GuzzleHttp\Client
*/
protected function getHttpClient()
{
return new Client(self::$guzzleOptions);
}
/**
* 小程序登录
* @param $code
* @return mixed
* @throws Exception
*/
public function login($code)
{
$response = $this->getHttpClient()->get($this->base_url.'/sns/jscode2session', [
'query' => array_filter([
'appid' => $this->appid,
'secret' => $this->secret,
'js_code' => $code,
'grant_type' => 'authorization_code'
]),
]);
$result = json_decode($response->getBody(), true);
if(isset($result['errcode'])){
throw new Exception($result['errmsg']);
}
return $result;
}
/**
* 获取后台接口access_token
*/
public function getAccessToken()
{
$key = 'wechat.common.access_token.'.$this->appid;
$cache = \Yii::$app->cache;
$access_token = $cache->get($key);
if($access_token == false){
//app.huiliaoyaofang.com
//job过来的没有HTTP_HOST;
// if(!isset($_SERVER['HTTP_HOST']) || $_SERVER['HTTP_HOST']!=='app.huiliaoyaofang.com'){
// $response = $this->getHttpClient()->get('https://app.huiliaoyaofang.com/api/v1/noauth/token');
// $result = json_decode($response->getBody(), true);
// $access_token = $result['data']['token'];
// }else{
if(!isset($_SERVER['HTTP_HOST']) || $_SERVER['HTTP_HOST']=='hy.api.ctkj88.com') {
$response = $this->getHttpClient()->get('http://hy.api.ctkj88.com/service/v1/user/token');
$result = json_decode($response->getBody(), true);
$access_token = $result['data']['token'];
}else{
$response = $this->getHttpClient()->get($this->base_url.'/cgi-bin/token', [
'query' => array_filter([
'appid' => $this->appid,
'secret' => $this->secret,
'grant_type' => 'client_credential'
]),
]);
$result = json_decode($response->getBody(), true);
if(isset($result['errcode'])){
throw new Exception($result['errmsg']);
}
$access_token = $result['access_token'];
$cache->set($key,$access_token,$result['expires_in']-30*60);
}
}
return $access_token;
}
/**
* 获取小程序码
* @param $scene
* @return mixed
* @throws Exception
*/
public function getQrcode($scene,$page='',$type='base64')
{
$data['scene'] = $scene;
if($page){
$data['page'] = $page;
}
$params = [
'json' => $data,
];
$response = $this->getHttpClient()->post($this->base_url.'/wxa/getwxacodeunlimit?access_token='.$this->getAccessToken(),$params);
$body = $response->getBody();
//\Yii::$app->response->format = \yii\web\Response::FORMAT_RAW;
try {
$buffer = $body->getContents();
if($type=='base64'){
$type = getimagesizefromstring($buffer)['mime']; //获取二进制流图片格式
$base64String = 'data:' . $type . ';base64,' . chunk_split(base64_encode($buffer));
// header('Content-Type: '.getimagesizefromstring($buffer)['mime']);
return $base64String;
}else{
return $buffer;
}
}catch (\Exception $exception){
\Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;
$result = json_decode($response->getBody(), true);
if(isset($result['errcode'])){
throw new Exception($result['errmsg']);
}
}
}
}