init
This commit is contained in:
49
core/weixin/WxAccessToken.php
Normal file
49
core/weixin/WxAccessToken.php
Normal 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
79
core/weixin/WxJsSDK.php
Normal 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
147
core/weixin/WxTemplate.php
Normal 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
61
core/weixin/WxUser.php
Normal 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
116
core/weixin/WxWebAuth.php
Normal 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;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user