Commit 09dde6dd by yeran

v1.1.0

1 parent 0d85da47
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$" vcs="Git" />
</component>
</project>
\ No newline at end of file
...@@ -9,18 +9,53 @@ ...@@ -9,18 +9,53 @@
use wechatkit\Core\ErrorCode; use wechatkit\Core\ErrorCode;
use wechatkit\HttpFul\HttpFul; use wechatkit\HttpFul\HttpFul;
class AccessToken class AccessToken{
{
static $Certificates = [ static $Certificates = [
'AccessToken', 'AccessToken',
'JsTicket', 'JsTicket',
]; ];
/**
*
* 初始化微信令牌参数等
*
* @param bool $authSelf
* true : 自身维护微信令牌
* false: 第三方服务来维护
*
*/
static function certificate($authSelf = false){
if($authSelf){
self::readCertificates();
}else{
$appid = Config::$options['appid'];
$data = array(
'appid' => $appid,
'secret' => 'yeran'
);
$tokens = HttpFul::init()->handler(Config::$authThirdUrls['accessTokenUrl'],[],$data,'JSON','POST');
Config::$componentAccessToken = $tokens['componentAccessToken'];
Config::$accessToken = $tokens['accessToken'];
Config::$jsApiTicket = null;
Config::$CARDJSTICKET = null;
}
}
/** /**
* @throws \Exception * @throws \Exception
*/ */
static function readCertificates() static function readCertificates(){
{
debug('进入初始化微信信息' . PHP_EOL); debug('进入初始化微信信息' . PHP_EOL);
if (Config::$type == 'O') { if (Config::$type == 'O') {
...@@ -62,7 +97,7 @@ ...@@ -62,7 +97,7 @@
} }
} }
/** /**
* *
* 根据公众号的appid获取第三方平台对应的accesstoken * 根据公众号的appid获取第三方平台对应的accesstoken
* *
......
<?php
/**
* Created by IntelliJ IDEA.
* User: yeran
* Date: 2017/12/21
* Time: 下午3:08
*/
namespace wechatkit\Card;
class ApiConfig{
public static $cardDetail = 'https://api.weixin.qq.com/card/get?access_token=%1%';
public static $cardModifyStock = 'https://api.weixin.qq.com/card/modifystock?access_token=%1%';
public static $cardDelete = 'https://api.weixin.qq.com/card/delete?access_token=%1%';
public static $cardUnAvailable = 'https://api.weixin.qq.com/card/code/unavailable?access_token=%1%';//使卡券失效,code
public static $cardCodeUpdate = 'https://api.weixin.qq.com/card/code/update?access_token=%1%';//更改code,在卡券分享时候,用于更换被分享卡券的code值
public static $selfconsumecell = 'https://api.weixin.qq.com/card/selfconsumecell/set?access_token=%1%';//设置自主核销
public static $wxCardApiTicket = 'https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=%1%&type=wx_card'; //卡券api_ticket
/**
* 查询code接口可以查询当前code是否可以被核销并检查code状态。当前可以被定位的状态为正常、已核销、转赠中、已删除、已失效和无效code
* @var string
*/
public static $cardCodeDetail = 'https://api.weixin.qq.com/card/code/get?access_token=%1%';
/**
*
* 用于获取用户卡包里的,属于该appid下所有可用卡券,包括正常状态和异常状态
*
* @var string
*/
public static $userCardList = 'https://api.weixin.qq.com/card/user/getcardlist?access_token=%1%';
/**
* 拉取本商户的总体数据情况,包括时间区间内的各指标总量。
* @var string
*/
public static $cardStatistics = 'https://api.weixin.qq.com/datacube/getcardbizuininfo?access_token=%1%';
/**
* 拉取免费券(优惠券、团购券、折扣券、礼品券)在固定时间区间内的相关数据。
* @var string
*/
public static $certainCardStatistics = 'https://api.weixin.qq.com/datacube/getcardcardinfo?access_token=%1%';
/**
*
* 卡券消息解密接口
* @var string
*/
public static $decrypt = 'https://api.weixin.qq.com/card/code/decrypt?access_token=%1%';
/**
*
* 更新卡券基础信息
*
* @var string
*/
public static $update = 'https://api.weixin.qq.com/card/update?access_token=%1%';
public static $consumeCard = 'https://api.weixin.qq.com/card/code/consume?access_token=%1%';
}
\ No newline at end of file
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
use wechatkit\Core\Func; use wechatkit\Core\Func;
use wechatkit\HttpFul\HttpFul; use wechatkit\HttpFul\HttpFul;
class Card class Cards
{ {
public function logo($body) public function logo($body)
{ {
......
<?php
/**
* Created by IntelliJ IDEA.
* User: yeran
* Date: 2017/12/19
* Time: 下午5:49
*/
namespace wechatkit\Card;
class Color{
const GREEN_LIGHT = 'Color010'; //浅绿色:#63b359
const GREEN = 'Color020'; //绿色:#2c9f67
const BLUE_LIGHT = 'Color030'; //浅蓝色:#509fc9
const BLUE = 'Color040'; //蓝色:#5885cf
const PURPLE = 'Color050'; //紫色:#9062c0
const YELLOW_DARK = 'Color060'; //深黄色:#d09a45
const YELLOW_LIGHT = 'Color070'; //浅黄色:#e4b138
const YELLOW = 'Color080'; //黄色:#ee903c
const RED_LIGHT = 'Color090'; //浅红色:#dd6549
const RED = 'Color100'; //红色:#cc463d
public static function wxColor($name){
switch ($name){
case 'green': {
return self::GREEN;
}
case 'yellow':{
return self::YELLOW;
}
case 'red':{
return self::RED;
}
case 'blue':{
return self::BLUE;
}
default :
return self::GREEN;
}
}
}
\ No newline at end of file
...@@ -3,6 +3,7 @@ ...@@ -3,6 +3,7 @@
namespace wechatkit\Config; namespace wechatkit\Config;
class Config{ class Config{
static public $options = [ static public $options = [
'appid'=>null, 'appid'=>null,
'secret'=>null, 'secret'=>null,
...@@ -24,6 +25,20 @@ class Config{ ...@@ -24,6 +25,20 @@ class Config{
] ]
]; ];
/**
*
* 第三方授权维护服务的链接
*
* @var array
*/
static public $authThirdUrls = array(
'accessTokenUrl' => null,
'jsApiTicketUrl' => null,
'cardJsTicketUrl' => null
);
static public $authSelf = false; //是否本平台维护授权,默认为false
static public $typeList = [ static public $typeList = [
'openHandler'=>'O', //开放平台接入 'openHandler'=>'O', //开放平台接入
'mpHandler'=>'A' //普通接入 'mpHandler'=>'A' //普通接入
......
<?php
/**
* Created by IntelliJ IDEA.
* User: yeran
* Date: 2018/1/9
* Time: 下午5:59
*/
namespace wechatkit\Core;
class Common{
/**
*
* 文件下载
*
*/
static function httpcopy($url, $file = "", $timeout = 60){
$file = empty($file) ? pathinfo($url, PATHINFO_BASENAME) : $file;
$dir = pathinfo($file, PATHINFO_DIRNAME);
!is_dir($dir) && @mkdir($dir, 0777, true);
$url = str_replace(" ", "%20", $url);
if (function_exists('curl_init')) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
$temp = curl_exec($ch);
if (@file_put_contents($file, $temp) && !curl_error($ch)) {
return $file;
} else {
return false;
}
} else {
$opts = array(
"http" => array(
"method" => "GET",
"header" => "",
"timeout" => $timeout)
);
$context = stream_context_create($opts);
if (@copy($url, $file, $context)) {
//$http_response_header
return $file;
} else {
return false;
}
}
}
}
\ No newline at end of file
<?php
/**
* Created by IntelliJ IDEA.
* User: yeran
* Date: 2018/1/9
* Time: 下午1:37
*/
namespace wechatkit\Mini;
class ApiConfig{
/**
*
* 需要先将域名登记到第三方平台的小程序服务器域名中,才可以调用接口进行配置。
*
* @var string
*/
public static $modifyDomain = 'https://api.weixin.qq.com/wxa/modify_domain?access_token=%1%';
/**
*
* 授权给第三方的小程序,其业务域名只可以为第三方的服务器,当小程序通过第三方发布代码上线后,小程序原先自己配置的业务域名将被删除,只保留第三方平台的域名,所以第三方平台在代替小程序发布代码之前,需要调用接口为小程序添加业务域名。
* 提示:需要先将域名登记到第三方平台的小程序业务域名中,才可以调用接口进行配置
*
* @var string
*
*/
public static $setwebviewDomain = 'https://api.weixin.qq.com/wxa/setwebviewdomain?access_token=%1%';
/*---成员管理---*/
public static $bindTester = 'https://api.weixin.qq.com/wxa/bind_tester?access_token=%1%';
public static $unbindTester = 'https://api.weixin.qq.com/wxa/unbind_tester?access_token=%1%';
/*---代码管理----*/
/**
* 为授权的小程序帐号上传小程序代码
* @var string
*/
public static $commit = 'https://api.weixin.qq.com/wxa/commit?access_token=%1%';
/**
* 获取体验小程序的体验二维码
* @var string
*/
public static $get_qrcode = 'https://api.weixin.qq.com/wxa/get_qrcode?access_token=%1%';
/**
*
* 获取授权小程序帐号的可选类目
*
* @var string
*/
public static $get_category = 'https://api.weixin.qq.com/wxa/get_category?access_token=%1%';
/**
* 获取小程序的第三方提交代码的页面配置(仅供第三方开发者代小程序调用)
* @var string
*/
public static $get_page = 'https://api.weixin.qq.com/wxa/get_page?access_token=%1%';
/**
* 将第三方提交的代码包提交审核(仅供第三方开发者代小程序调用)
*
* @var string
*/
public static $submit_audit = 'https://api.weixin.qq.com/wxa/submit_audit?access_token=%1%';
/**
* 查询某个指定版本的审核状态(仅供第三方代小程序调用)
* @var string
*/
public static $get_auditstatus = 'https://api.weixin.qq.com/wxa/get_auditstatus?access_token=%1%';
/**
* 查询最新一次提交的审核状态(仅供第三方代小程序调用)
* @var string
*/
public static $get_latest_auditstatus = 'https://api.weixin.qq.com/wxa/get_latest_auditstatus?access_token=%1%';
/**
*
* 发布已通过审核的小程序(仅供第三方代小程序调用)
*
* @var string
*/
public static $release = 'https://api.weixin.qq.com/wxa/release?access_token=%1%';
/**
*
* 修改小程序线上代码的可见状态(仅供第三方代小程序调用)
*
* @var string
*/
public static $change_visitstatus ='https://api.weixin.qq.com/wxa/change_visitstatus?access_token=%1%';
/**
* 小程序版本回退(仅供第三方代小程序调用)
* @var string
*/
public static $revertcoderelease = 'https://api.weixin.qq.com/wxa/revertcoderelease?access_token=%1%';
/**
* 查询当前设置的最低基础库版本及各版本用户占比 (仅供第三方代小程序调用)
* @var string
*/
public static $getweappsupportversion = 'https://api.weixin.qq.com/cgi-bin/wxopen/getweappsupportversion?access_token=%1%';
/**
* 设置最低基础库版本(仅供第三方代小程序调用)
* @var string
*/
public static $setweappsupportversion = 'https://api.weixin.qq.com/cgi-bin/wxopen/setweappsupportversion?access_token=%1%';
/**
* 设置小程序“扫普通链接二维码打开小程序”能力
* 【增加或修改二维码规则】
*
* @var string
*/
public static $qrcodejumpadd = 'https://api.weixin.qq.com/cgi-bin/wxopen/qrcodejumpadd?access_token=%1%';
/**
* 设置小程序“扫普通链接二维码打开小程序”能力
* 【获取已设置的二维码规则】
* @var string
*/
public static $qrcodejumpget = 'https://api.weixin.qq.com/cgi-bin/wxopen/qrcodejumpget?access_token=%1%';
/**
* 设置小程序“扫普通链接二维码打开小程序”能力
* 获取校验文件名称及内容
* @var string
*/
public static $qrcodejumpdownload = 'https://api.weixin.qq.com/cgi-bin/wxopen/qrcodejumpdownload?access_token=%1%';
/**
* 设置小程序“扫普通链接二维码打开小程序”能力
* 删除已设置的二维码规则
* @var string
*/
public static $qrcodejumpdelete = 'https://api.weixin.qq.com/cgi-bin/wxopen/qrcodejumpdelete?access_token=%1%';
/**
* 设置小程序“扫普通链接二维码打开小程序”能力
* 发布已设置的二维码规则
* @var string
*/
public static $qrcodejumppublish = 'https://api.weixin.qq.com/cgi-bin/wxopen/qrcodejumppublish?access_token=%1%';
}
\ No newline at end of file
<?php
/**
* Created by IntelliJ IDEA.
* User: yeran
* Date: 2018/1/9
* Time: 下午2:21
*/
namespace wechatkit\Mini;
use wechatkit\Config\Config;
use wechatkit\HttpFul\HttpFul;
/**
*
* 代码管理
*
* Class Code
* @package wechatkit\Mini
*
*/
class Code {
/**
*
* 为授权的小程序帐号上传小程序代码
*
* @param $template_id //代码库中的代码模版ID
* @param $ext_json //第三方自定义的配置,如果代码中已经有配置,则配置的合并规则为:除了pages和tabBar.list直接覆盖原配置,其他都为插入或同级覆盖
* @param $user_version //代码版本号,开发者可自定义
* @param $user_desc //代码描述,开发者可自定义
* @param null $accessToken
*
* @return bool
*/
public function commitCode($template_id,$ext_json,$user_version='v1.0.0',$user_desc='第一次发布版本',$accessToken=null){
if(!$accessToken){
$accessToken = Config::$accessToken;
}
$data = array(
'template_id' => $template_id,
'ext_json' =>$ext_json,
'user_version' =>$user_version,
'user_desc' => $user_desc
);
$response = HttpFul::init()->handler(ApiConfig::$commit, [$accessToken], $data, 'JSON', 'POST');
if($response && ($response['errcode'] == 0)){
return true;
}
return false;
}
/**
*
* 获取体验小程序的体验二维码
*
* @param $accessToken
* @return bool|mixed
*/
public function getQrcode($accessToken=null){
if(!$accessToken){
$accessToken = Config::$accessToken;
}
$response = HttpFul::init()->handler(ApiConfig::$commit, [$accessToken], [], null, 'GET');
if(is_array($response) && $response['errcode'] == -1){
return false;
}else{
return $response;
}
}
/**
* 将第三方提交的代码包提交审核(仅供第三方开发者代小程序调用)
*
* @param $item_list
* @param null $accessToken
* @return bool|mixed
*/
public function submitAudit($item_list,$accessToken=null){
if(!$accessToken){
$accessToken = Config::$accessToken;
}
$data = array(
'item_list' => $item_list
);
$response = HttpFul::init()->handler(ApiConfig::$submit_audit, [$accessToken], $data, 'JSON', 'POST');
return $response;
}
/**
*
* 发布已通过审核的小程序(仅供第三方代小程序调用)
*
* @param null $accessToken
* @return bool|mixed
*/
public function release($accessToken=null){
if(!$accessToken){
$accessToken = Config::$accessToken;
}
$data = array();
$response = HttpFul::init()->handler(ApiConfig::$release, [$accessToken], $data, 'JSON', 'POST');
return $response;
}
/**
* 设置小程序是否用户可见,刚发布之后的小程序是默认为可见的,因此这里的默认值是不可见
* @param string $action
* @param null $accessToken
* @return bool|mixed
*/
public function changeVisitstatus($action='close',$accessToken=null){
if(!$accessToken){
$accessToken = Config::$accessToken;
}
$data = array(
'action' =>$action
);
$response = HttpFul::init()->handler(ApiConfig::$change_visitstatus, [$accessToken], $data, 'JSON', 'POST');
return $response;
}
/**
* 小程序版本回退(仅供第三方代小程序调用)
*
* @param null $accessToken
* @return bool|mixed
*/
public function revertCodeRelease($accessToken=null){
if(!$accessToken){
$accessToken = Config::$accessToken;
}
$response = HttpFul::init()->handler(ApiConfig::$revertcoderelease, [$accessToken], null, null, 'GET');
return $response;
}
}
\ No newline at end of file
<?php
/**
* Created by IntelliJ IDEA.
* User: yeran
* Date: 2018/1/9
* Time: 下午1:15
*/
namespace wechatkit\Mini;
use wechatkit\Config\Config;
use wechatkit\HttpFul\HttpFul;
/**
*
* 小程序域名设置
*
* Class Domain
* @package wechatkit\Mini
*
*/
class Domain{
/**
*
* 设置小程序服务器域名
*
* @param $action
* // add添加, delete删除, set覆盖, get获取。当参数是get时不需要填四个域名字段。
* @param $accessToken
* @param null $domains
* @return array|bool|null
*/
function modifyDomain($action,$domains=null,$accessToken=null){
if(!$accessToken){
$accessToken = Config::$accessToken;
}
$data = array(
'action' => $action
);
if($action != 'get' && !empty($domains)){
$data['requestdomain'] = $domains['requestdomain'];
$data['wsrequestdomain'] = $domains['wsrequestdomain'];
$data['uploaddomain'] = $domains['uploaddomain'];
$data['downloaddomain'] = $domains['downloaddomain'];
}
$response = HttpFul::init()->handler(ApiConfig::$modifyDomain, [$accessToken], $data, 'JSON', 'POST');
if($response && ($response['errcode'] == 0)){
if('get' == $action){
$domains = array(
'requestdomain' => $response['requestdomain'],
'wsrequestdomain' => $response['wsrequestdomain'],
'uploaddomain' => $response['uploaddomain'],
'downloaddomain' => $response['downloaddomain']
);
return $domains;
}
return true;
}
return false;
}
/**
*
* 授权给第三方的小程序,其业务域名只可以为第三方的服务器,当小程序通过第三方发布代码上线后,小程序原先自己配置的业务域名将被删除,只保留第三方平台的域名
*
* 提示:需要先将域名登记到第三方平台的小程序业务域名中,才可以调用接口进行配置
*
* @param $action
* @param $accessToken
* @param null $webviewdomain
* @return array|bool
*/
function setWebviewDomain($action,$webviewdomain=null,$accessToken=null){
if(!$accessToken){
$accessToken = Config::$accessToken;
}
$data = array(
'action' => $action
);
if($action != 'get' && !empty($domains)){
$data['webviewdomain'] = $webviewdomain;
}
$response = HttpFul::init()->handler(ApiConfig::$setwebviewDomain, [$accessToken], $data, 'JSON', 'POST');
if($response && ($response['errcode'] == 0)){
if('get' == $action){
$domains = array(
'webviewdomain' => $response['webviewdomain']
);
return $domains;
}
return true;
}
return false;
}
}
\ No newline at end of file
<?php
/**
* Created by IntelliJ IDEA.
* User: yeran
* Date: 2018/1/9
* Time: 下午2:53
*/
namespace wechatkit\Mini;
/**
*
* 微信授权登陆
*
* Class Login
* @package wechatkit\Mini
*/
class Login{
}
\ No newline at end of file
<?php
/**
* Created by IntelliJ IDEA.
* User: yeran
* Date: 2018/1/9
* Time: 下午2:06
*/
namespace wechatkit\Mini;
use wechatkit\Config\Config;
use wechatkit\HttpFul\HttpFul;
/**
*
* 小程序成员管理
*
* Class Member
* @package wechatkit\Mini
*/
class Member {
public function bindTester($wechatid,$accessToken=null){
if(!$accessToken){
$accessToken = Config::$accessToken;
}
$data = array(
'wechatid' => $wechatid
);
$response = HttpFul::init()->handler(ApiConfig::$bindTester, [$accessToken], $data, 'JSON', 'POST');
if($response && ($response['errcode'] == 0)){
return true;
}
return false;
}
public function unbindTester($wechatid,$accessToken=null){
if(!$accessToken){
$accessToken = Config::$accessToken;
}
$data = array(
'wechatid' => $wechatid
);
$response = HttpFul::init()->handler(ApiConfig::$unbindTester, [$accessToken], $data, 'JSON', 'POST');
if($response && ($response['errcode'] == 0)){
return true;
}
return false;
}
}
\ No newline at end of file
<?php
/**
* Created by IntelliJ IDEA.
* User: yeran
* Date: 2018/1/9
* Time: 下午2:55
*/
namespace wechatkit\Mini;
/**
*
* 模板消息管理
*
*
* Class MsgTemplate
* @package wechatkit\Mini
*/
class MsgTemplate{
}
\ No newline at end of file
<?php
/**
* Created by IntelliJ IDEA.
* User: yeran
* Date: 2018/1/9
* Time: 下午2:51
*/
namespace wechatkit\Mini;
/**
*
* 代码模板库管理
*
* Class Templet
* @package wechatkit\Mini
*/
class Templet{
}
\ No newline at end of file
<?php
/**
* Created by IntelliJ IDEA.
* User: yeran
* Date: 2018/1/9
* Time: 下午3:47
*/
namespace wechatkit\Mini;
/**
*
* 微信开放平台帐号管理
*
* 适用与统一主体小程序之间的用户互通
*
* Class UnionAccount
* @package wechatkit\Mini
*/
class UnionAccount{
}
\ No newline at end of file
...@@ -17,8 +17,10 @@ ...@@ -17,8 +17,10 @@
public function webOAuth2($url = NULL, $type = 'URL', $state = NULL, $wxLoginConfig = ['style' => 'black', public function webOAuth2($url = NULL, $type = 'URL', $state = NULL, $wxLoginConfig = ['style' => 'black',
'href' => NULL]) 'href' => NULL])
{ {
$http_type = ((isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') || (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https')) ? 'https://' : 'http://';
if(null == $url){ if(null == $url){
$url = 'http://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']; $url = $http_type.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
} }
if ('URL' == $type) { if ('URL' == $type) {
...@@ -67,7 +69,10 @@ ...@@ -67,7 +69,10 @@
$preAuthCode = HttpFul::init()->handler('preAuthCode',[Config::$componentAccessToken],['component_appid'=>Config::$options['open']['appid']],'JSON','POST'); $preAuthCode = HttpFul::init()->handler('preAuthCode',[Config::$componentAccessToken],['component_appid'=>Config::$options['open']['appid']],'JSON','POST');
if($preAuthCode){ if($preAuthCode){
if(null == $url){ if(null == $url){
$url = 'http://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
$http_type = ((isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') || (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https')) ? 'https://' : 'http://';
$url = $http_type.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
} }
header(sprintf('Location:https://mp.weixin.qq.com/cgi-bin/componentloginpage?component_appid=%s&pre_auth_code=%s&redirect_uri=%s',Config::$options['open']['appid'],$preAuthCode['pre_auth_code'],urlencode($url))); header(sprintf('Location:https://mp.weixin.qq.com/cgi-bin/componentloginpage?component_appid=%s&pre_auth_code=%s&redirect_uri=%s',Config::$options['open']['appid'],$preAuthCode['pre_auth_code'],urlencode($url)));
exit(255); exit(255);
......
...@@ -4,8 +4,7 @@ ...@@ -4,8 +4,7 @@
use wechatkit\Config, wechatkit\AccessToken; use wechatkit\Config, wechatkit\AccessToken;
class Run implements \wechatkit\Core\Run class Run implements \wechatkit\Core\Run{
{
static $self = NULL; static $self = NULL;
...@@ -27,7 +26,7 @@ ...@@ -27,7 +26,7 @@
Config\Config::$config = array_merge(Config\Config::$config, $config); Config\Config::$config = array_merge(Config\Config::$config, $config);
$this->AccessToken()->readCertificates(); $this->AccessToken()->certificate(false);
return $this; return $this;
} }
......
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!