This commit is contained in:
Gitea
2022-01-24 10:43:35 +08:00
commit 15dfc6576b
786 changed files with 219240 additions and 0 deletions

View File

@@ -0,0 +1,49 @@
<?php
/**
* @copyright (C)2016-2099 Hnaoyun Inc.
* @author XingMeng
* @email hnxsh@foxmail.com
* @date 2019年05月27日
* 微信网页授权
*/
namespace core\weixin;
use core\basic\Config;
class WxAccessToken
{
// 获取全局access_token
public static function get()
{
if (! self::check()) {
$appid = Config::get('weixin_appid');
$secret = Config::get('weixin_secret');
$url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" . $appid . "&secret=" . $secret;
$result = json_decode(get_url($url));
if (isset($result->errcode) && $result->errcode) {
error('获取微信AccessToken发生错误' . $result->errmsg . '(' . $result->errcode . ')');
return false;
} else {
$data['weixin_access_token'] = $result->access_token;
$data['weixin_expires_in'] = $result->expires_in;
$data['weixin_timestamp'] = time();
Config::set(sha1('weixin_access_token'), $data); // 缓存数据
return $result->access_token;
}
} else {
return Config::get('weixin_access_token');
}
}
// 检查access_token是否可用
private static function check()
{
Config::assign(RUN_PATH . '/config/' . sha1('weixin_access_token') . '.php');
if (Config::get('weixin_access_token') && time() - Config::get('weixin_timestamp') < Config::get('weixin_expires_in')) {
return true;
} else {
return false;
}
}
}

79
core/weixin/WxJsSDK.php Normal file
View File

@@ -0,0 +1,79 @@
<?php
/**
* @copyright (C)2016-2099 Hnaoyun Inc.
* @author XingMeng
* @email hnxsh@foxmail.com
* @date 2019年05月27日
* 微信网页授权
*/
namespace core\weixin;
use core\basic\Config;
class WxJsSDK
{
protected $appid;
protected $secret;
protected $noncestr;
public function __construct()
{
$this->appid = Config::get('weixin_appid');
$this->secret = Config::get('weixin_secret');
$this->noncestr = get_uniqid();
}
// 获取JsAPI签名授权信息
public function getAuthInfo()
{
// 签名数据数组
$data['jsapi_ticket'] = $this->getJsapiTicket();
$data['noncestr'] = $this->noncestr;
$data['timestamp'] = time();
$data['url'] = get_current_url();
$signature = sha1(urldecode(http_build_query($data)));
// 返回数据数组
$result['appid'] = $this->appid;
$result['timestamp'] = $data['timestamp'];
$result['noncestr'] = $this->noncestr;
$result['signature'] = $signature;
return $result;
}
// 获取访问Ticket
private function getJsapiTicket()
{
if (! $this->checkJsapiTicket()) {
$access_token = WxAccessToken::get();
$url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=$access_token&type=jsapi";
$result = json_decode(get_url($url));
if (isset($result->errcode) && $result->errcode) {
error('获取微信JsapiTicket发生错误' . $result->errmsg . '(' . $result->errcode . ')');
return false;
} else {
$data['weixin_jsapi_ticket'] = $result->ticket;
$data['weixin_jsapi_ticket_expires_in'] = $result->expires_in;
$data['weixin_jsapi_ticket_timestamp'] = time();
Config::set(sha1('weixin_jsapi_ticket'), $data); // 缓存数据
return $result->ticket;
}
} else {
return Config::get('weixin_jsapi_ticket');
}
}
// 检查Ticket是否可用
private function checkJsapiTicket()
{
Config::assign(RUN_PATH . '/config/' . sha1('weixin_jsapi_ticket') . '.php');
if (Config::get('weixin_jsapi_ticket') && time() - Config::get('weixin_jsapi_ticket_timestamp') < Config::get('weixin_jsapi_ticket_expires_in')) {
return true;
} else {
return false;
}
}
}

147
core/weixin/WxTemplate.php Normal file
View File

@@ -0,0 +1,147 @@
<?php
/**
* @copyright (C)2016-2099 Hnaoyun Inc.
* @author XingMeng
* @email hnxsh@foxmail.com
* @date 2019年5月27日
* 模板消息
*/
namespace core\weixin;
class WxTemplate
{
// 设置行业信息
public function setIndustry($industry_id1, $industry_id2)
{
$access_token = WxAccessToken::get();
$url = "https://api.weixin.qq.com/cgi-bin/template/api_set_industry?access_token=" . $access_token;
$data = array(
'industry_id1' => $industry_id1,
'industry_id2' => $industry_id2
);
$result = json_decode(get_url($url, json_encode($data)));
if (isset($result->errcode) && $result->errcode) {
error('设置微信消息行业发生错误:' . $result->errmsg . '(' . $result->errcode . ')');
} else {
return true;
}
}
// 获取行业信息
public function getIndustry()
{
$access_token = WxAccessToken::get();
$url = "https://api.weixin.qq.com/cgi-bin/template/get_industry?access_token=" . $access_token;
$result = json_decode(get_url($url));
if (isset($result->errcode) && $result->errcode) {
error('获取微信消息行业发生错误:' . $result->errmsg . '(' . $result->errcode . ')');
} else {
return $result;
}
}
// 获取模板ID
public function getTemplateID($template_id_short)
{
$access_token = WxAccessToken::get();
$url = "https://api.weixin.qq.com/cgi-bin/template/api_add_template?access_token=" . $access_token;
$data = array(
'template_id_short' => $template_id_short
);
$result = json_decode(get_url($url, json_encode($data)));
if (isset($result->errcode) && $result->errcode) {
error('获取微信模板ID发生错误' . $result->errmsg . '(' . $result->errcode . ')');
} else {
return $result;
}
}
// 获取模板ID
public function getTemplateList()
{
$access_token = WxAccessToken::get();
$url = "https://api.weixin.qq.com/cgi-bin/template/get_all_private_template?access_token=" . $access_token;
$result = json_decode(get_url($url));
if (isset($result->errcode) && $result->errcode) {
error('获取微信模板列表发生错误:' . $result->errmsg . '(' . $result->errcode . ')');
} else {
return $result;
}
}
// 获取模板ID
public function delTemplate($template_id)
{
$access_token = WxAccessToken::get();
$url = "https://api.weixin.qq.com/cgi-bin/template/del_private_template?access_token=" . $access_token;
$data = array(
'template_id' => $template_id
);
$result = json_decode(get_url($url, json_encode($data)));
if (isset($result->errcode) && $result->errcode) {
error('删除微信模板发生错误:' . $result->errmsg . '(' . $result->errcode . ')');
} else {
return true;
}
}
// 发送模板消息
public function sendTemplateMsg($openid, $template_id, $data, $remark = null, $link = null)
{
$access_token = WxAccessToken::get();
$url = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" . $access_token;
// data只需传递数组数据即可自动生成格式化数据
if (! is_multi_array($data)) {
$i = 1;
$flag = true;
foreach ($data as $key => $value) {
if (is_numeric($key)) {
if ($flag && $i == 1 && ! isset($data['first'])) {
$post_data['first'] = array(
'value' => $value,
'color' => '#173177'
);
$flag = false;
} else {
$post_data['keyword' . $i] = array(
'value' => $value,
'color' => '#173177'
);
$i ++;
}
} else {
$post_data[$key] = array(
'value' => $value,
'color' => '#173177'
);
}
}
// 备注字段
if ($remark) {
$post_data['remark'] = array(
'value' => $remark,
'color' => '#173177'
);
}
}
// 生成完成数据数组
$send_data = array(
'touser' => $openid,
'template_id' => $template_id,
'data' => $post_data
);
// 有跳转时设置
if ($link) {
$send_data['url'] = $link;
}
// 执行发送
$result = json_decode(get_url($url, json_encode($send_data, JSON_FORCE_OBJECT)));
if (isset($result->errcode) && $result->errcode) {
error('微信消息发送错误:' . $result->errmsg . '(' . $result->errcode . ')');
} else {
return true;
}
}
}

61
core/weixin/WxUser.php Normal file
View File

@@ -0,0 +1,61 @@
<?php
/**
* @copyright (C)2016-2099 Hnaoyun Inc.
* @author XingMeng
* @email hnxsh@foxmail.com
* @date 2019年5月27日
*
*/
namespace core\weixin;
class WxUser
{
// 获取指定用户信息
public function getUserInfo($openid)
{
$access_token = WxAccessToken::get();
$url = "https://api.weixin.qq.com/cgi-bin/user/info?access_token=" . $access_token . "&openid=$openid&lang=zh_CN";
$result = json_decode(get_url($url));
if (isset($result->errcode) && $result->errcode) {
error('获取微信用户信息发生错误:' . $result->errmsg . '(' . $result->errcode . ')');
} else {
return $result;
}
}
// 获取用户列表
public function getUserList($getinfo = false, $next_openid = '')
{
$access_token = WxAccessToken::get();
$url = "https://api.weixin.qq.com/cgi-bin/user/get?access_token=" . $access_token . "&next_openid=" . $next_openid;
$result = json_decode(get_url($url));
if (isset($result->errcode) && $result->errcode) {
error('获取微信用户列表发生错误:' . $result->errmsg . '(' . $result->errcode . ')');
} else {
if ($getinfo) {
foreach ($result->data->openid as $key => $value) {
$result->data->userinfo[] = $this->getUserInfo($value);
}
}
return $result;
}
}
// 设置用户标记
public function setUserRemark($openid, $remark)
{
$access_token = WxAccessToken::get();
$url = "https://api.weixin.qq.com/cgi-bin/user/info/updateremark?access_token=" . $access_token;
$data = array(
'openid' => $openid,
'remark' => $remark
);
$result = json_decode(get_url($url, json_encode($data, JSON_UNESCAPED_UNICODE)));
if (isset($result->errcode) && $result->errcode) {
error('获取微信用户信息发生错误:' . $result->errmsg . '(' . $result->errcode . ')');
} else {
return true;
}
}
}

116
core/weixin/WxWebAuth.php Normal file
View File

@@ -0,0 +1,116 @@
<?php
/**
* @copyright (C)2016-2099 Hnaoyun Inc.
* @author XingMeng
* @email hnxsh@foxmail.com
* @date 2019年05月27日
* 微信网页授权
*/
namespace core\weixin;
use core\basic\Config;
class WxWebAuth
{
protected $appid;
protected $secret;
protected $noncestr;
protected $redirect;
protected $snsapi = 'snsapi_userinfo';
public function __construct()
{
$this->appid = Config::get('weixin_appid');
$this->secret = Config::get('weixin_secret');
$this->noncestr = get_uniqid();
$this->redirect = Config::get('weixin_redirect');
}
// 获取授权
public function getAuthUser()
{
if (! ! $code = get('code')) { // 如果有code参数意味重新授权方式获取数据在用户点击同意授权后跳转地址带code参数
$result = $this->getAccessToken($code); // 获取网页授权access_token
$wx_user = $this->getAuthUserInfo($result->access_token, $result->openid);
} else {
// 在系统调取微信授权时,先检查是否已经缓存并且有效,如果无效则试着刷新,如果刷新失败则重新授权获取
if (($token = session('weixin_web_access_token')) && ($openid = session('weixin_web_openid')) && $this->checkAccessToken($token, $openid)) { // 未过期,直接获取
$wx_user = $this->getAuthUserInfo($token, $openid);
} elseif (! ! $refresh_token = session('auth_refresh_token') && $result = $this->refreshAccessToken($refresh_token)) { // 刷新后获取
$wx_user = $this->getAuthUserInfo($result->access_token, $result->openid);
} else { // 重新授权
$this->redirectWebAuth(get_current_url());
exit();
}
}
return $wx_user;
}
// 执行网页授权登录,返回指定地址
private function redirectWebAuth($redirectUrl)
{
if (strpos($redirectUrl, 'http') === FALSE) {
$http_type = is_https() ? 'https://' : 'http://';
$redirectUrl = $http_type . $_SERVER['HTTP_HOST'] . $redirectUrl;
}
$url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid={$this->appid}&redirect_uri=$redirectUrl&response_type=code&scope=" . $this->snsapi . "&state=weixin#wechat_redirect";
header('Location:' . $url);
}
// 获取网页授权后用户信息,传递用户令牌及用户识别码
private function getAuthUserInfo($token, $openid)
{
$url = "https://api.weixin.qq.com/sns/userinfo?access_token=$token&openid=$openid&lang=zh_CN";
$result = json_decode(get_url($url));
if (isset($result->errcode) && $result->errcode) {
error('获取用户基础信息发生错误,请关闭后重新进入,错误:' . $result->errmsg);
}
return $result;
}
// 获取微信网页授权token,这里通过code换取的是一个特殊的网页授权access_token,与基础支持中的access_token该access_token用于调用其他接口不同
private function getAccessToken($code)
{
$url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid={$this->appid}&secret={$this->secret}&code=$code&grant_type=authorization_code";
$result = json_decode(get_url($url));
if (isset($result->errcode) && $result->errcode) {
error('获取用户网页登录授权令牌发生错误,请关闭后重新进入,错误:' . $result->errmsg);
}
// 因为此access_token每个访问用户不同这里用session来缓存
session('weixin_web_access_token', $result->access_token);
session('weixin_web_refresh_token', $result->refresh_token);
session('weixin_web_openid', $result->openid);
return $result;
}
// 检验微信网页授权access_token是否有效
private function checkAccessToken($token, $openid)
{
$url = "https://api.weixin.qq.com/sns/auth?access_token=$token&openid=$openid";
$result = json_decode(get_url($url));
if (isset($result->errcode) && $result->errcode) {
return false;
} else {
return true;
}
}
// 刷新微信网页授权token传递用户上一次获取的刷新令牌
private function refreshAccessToken($refreshToken)
{
$url = "https://api.weixin.qq.com/sns/oauth2/refresh_token?appid={$this->appid}&grant_type=refresh_token&refresh_token=$refreshToken";
$result = json_decode(get_url($url));
if (isset($result->errcode) && $result->errcode) {
return false;
}
session('weixin_web_access_token', $result->access_token);
session('weixin_web_refresh_token', $result->refresh_token);
session('weixin_web_openid', $result->openid);
return $result;
}
}