📖 File Reader
<?php
namespace app\common;
use app\BaseController;
use app\api\common\Common_config;
use think\facade\Db;
/*微信其他接口*/
class Common_wechat extends BaseController
{
protected $app_id = '';//app_id
protected $app_secret = '';//secret
public function initialize()
{
$config = Common_config::config("'app_id','app_secret','mch_id','mishi'");
$this->app_id = $config["app_id"];
$this->app_secret = $config["app_secret"];
}
/**
* 生成跳转到小程序地址
* @param string $link 小程序地址
* @param string $query 参数
*/
public function create_link($link = '', $query = '')
{
header('content-type:text/html;charset=utf-8');
//获取access_token
$access_token = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=$this->app_id&secret=$this->app_secret";
//缓存access_token
session_start();
$_SESSION['access_token'] = "";
$_SESSION['expires_in'] = 0;
$ACCESS_TOKEN = "";
if (!isset($_SESSION['access_token']) || (isset($_SESSION['expires_in']) && time() > $_SESSION['expires_in'])) {
$json = $this->httpRequest($access_token);
$json = json_decode($json, true);
$_SESSION['access_token'] = $json['access_token'];
$_SESSION['expires_in'] = time() + 7200;
$ACCESS_TOKEN = $json["access_token"];
} else {
$ACCESS_TOKEN = $_SESSION["access_token"];
}
$param = array(
'path' => $link,
'query' => $query,
'env_version' => 'release'//正式release、体验trial、开发develop
);
$param = json_encode($param);
$qcode = "https://api.weixin.qq.com/wxa/generate_urllink?access_token=" . $ACCESS_TOKEN;
$result = $this->httpRequest($qcode, $param, "POST");
$result_arr = json_decode($result, true);
$result_arr = [
'url_link' => $result_arr["url_link"],
];
return $result_arr;
}
/**
* 小程序二维码生成
* @param $path 小程序访问地址
*/
public function create_xcx($path)
{
header('content-type:text/html;charset=utf-8');
//获取access_token
$access_token = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=$this->app_id&secret=$this->app_secret";
//缓存access_token
session_start();
$_SESSION['access_token'] = "";
$_SESSION['expires_in'] = 0;
$ACCESS_TOKEN = "";
if (!isset($_SESSION['access_token']) || (isset($_SESSION['expires_in']) && time() > $_SESSION['expires_in'])) {
$json = $this->httpRequest($access_token);
$json = json_decode($json, true);
// var_dump($json);
$_SESSION['access_token'] = $json['access_token'];
$_SESSION['expires_in'] = time() + 7200;
$ACCESS_TOKEN = $json["access_token"];
} else {
$ACCESS_TOKEN = $_SESSION["access_token"];
}
//构建请求二维码参数
//path是扫描二维码跳转的小程序路径,可以带参数?id=xxx
//width是二维码宽度
//$qcode = "https://api.weixin.qq.com/cgi-bin/wxaapp/createwxaqrcode?access_token=$ACCESS_TOKEN";//正方形二维码
$qcode = "https://api.weixin.qq.com/wxa/getwxacode?access_token=$ACCESS_TOKEN";//圆形二维码
$param = json_encode(array("path" => $path, "width" => 150));
//POST参数
$result = $this->httpRequest($qcode, $param, "POST");
//生成二维码L
file_put_contents("qrcode.png", $result);
$base64_image = "data:image/jpeg;base64," . base64_encode($result);
return $base64_image;
}
//把请求发送到微信服务器换取二维码
public function httpRequest($url, $data = '', $method = 'GET')
{
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($curl, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($curl, CURLOPT_AUTOREFERER, 1);
if ($method == 'POST') {
curl_setopt($curl, CURLOPT_POST, 1);
if ($data != '') {
curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
}
}
curl_setopt($curl, CURLOPT_TIMEOUT, 30);
curl_setopt($curl, CURLOPT_HEADER, 0);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
$result = curl_exec($curl);
curl_close($curl);
return $result;
}
/**
* 公众号参数二维码
* @param array $data 参数
* @return string
*/
public function erweima_parameter($data=[])
{
//获取access_token
$access_token = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=$this->app_id&secret=$this->app_secret";
//缓存access_token
session_start();
$_SESSION['access_token'] = "";
$_SESSION['expires_in'] = 0;
$ACCESS_TOKEN = "";
if (!isset($_SESSION['access_token']) || (isset($_SESSION['expires_in']) && time() > $_SESSION['expires_in'])) {
$json = $this->httpRequest($access_token);
$json = json_decode($json, true);
$_SESSION['access_token'] = $json['access_token'];
$_SESSION['expires_in'] = time() + 7200;
$ACCESS_TOKEN = $json["access_token"];
} else {
$ACCESS_TOKEN = $_SESSION["access_token"];
}
$data=json_encode($data);
$arr=['action_name'=>'QR_LIMIT_STR_SCENE','action_info'=>['scene'=>['scene_str'=>$data]]];
$url='https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token='.$ACCESS_TOKEN;
$result= $this->https_request($url,json_encode($arr));
$results=json_decode($result,true);
$qecodeUrl='https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket='.UrlEncode($results['ticket']);
return $qecodeUrl;
}
/**
* 公众号调用扫一扫
* @param string $user_miyao
* @param string $url 页面URL地址(如uniapp打包成的h5直接获取不好用 例:http://zhanhui.jiboshimr.cn/h5/#/)
* @return array
*/
public function getConfig($user_miyao = '',$url='')
{
//微信 JS 接口签名校验工具: https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=jsapisign
$appid = $this->app_id;
$secret = $this->app_secret;
//获取token
$token = $this->get_token($appid, $secret, $user_miyao);
//获取ticket
$ticket = $this->get_ticket($token, $user_miyao);
//进行sha1签名
$timestamp = time();
$nonceStr = $this->createNonceStr();
if (empty($url)){
//注意 URL 建议动态获取(也可以写死).
$protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' || $_SERVER['SERVER_PORT'] == 443) ? "https://" : "http://";
$url = "$protocol$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]"; // 调用JSSDK的页面地址
}
$str = "jsapi_ticket={$ticket}&noncestr={$nonceStr}×tamp={$timestamp}&url={$url}";
$sha_str = sha1($str);
return ['appid' => $appid, 'timestamp' => $timestamp, 'nonceStr' => $nonceStr, 'sha_str' => $sha_str];
}
/**
* 公众号自定义分享
* @param string $url 分享地址
*/
public function wechat_share($url = '')
{
//获取access_token
$access_token = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=$this->app_id&secret=$this->app_secret";
//缓存access_token
session_start();
$_SESSION['access_token'] = "";
$_SESSION['expires_in'] = 0;
$ACCESS_TOKEN = "";
if (!isset($_SESSION['access_token']) || (isset($_SESSION['expires_in']) && time() > $_SESSION['expires_in'])) {
$json = $this->httpRequest($access_token);
$json = json_decode($json, true);
$_SESSION['access_token'] = $json['access_token'];
$_SESSION['expires_in'] = time() + 7200;
$ACCESS_TOKEN = $json["access_token"];
} else {
$ACCESS_TOKEN = $_SESSION["access_token"];
}
$curl = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=" . $ACCESS_TOKEN . "&type=jsapi";
$curl1 = curl_init(); // 启动一个CURL会话
curl_setopt($curl1, CURLOPT_URL, $curl); // 要访问的地址
curl_setopt($curl1, CURLOPT_SSL_VERIFYPEER, 0); // 对认证证书来源的检查
curl_setopt($curl1, CURLOPT_SSL_VERIFYHOST, 0); // 从证书中检查SSL加密算法是否存在
curl_setopt($curl1, CURLOPT_TIMEOUT, 30); // 设置超时限制防止死循环
curl_setopt($curl1, CURLOPT_HEADER, 0); // 显示返回的Header区域内容
curl_setopt($curl1, CURLOPT_RETURNTRANSFER, 1); // 获取的信息以文件流的形式返回
$response1 = curl_exec($curl1);// 执行操作
$err = curl_error($curl1);
curl_close($curl1);// 关闭请求
$response1 = json_decode($response1, true);
$nonceStr = $this->createNonceStr(32);
$timestamp = time();
$string = "jsapi_ticket=" . $response1['ticket'] . "&noncestr=" . $nonceStr . "×tamp=" . $timestamp . "&url=" . $url;
$signature = sha1($string);
$signPackage = array(
"appId" => $this->app_id,
"nonceStr" => $nonceStr,
"timestamp" => $timestamp,
"url" => $url,
"signature" => $signature,
"rawString" => $string
);
return $signPackage;
}
/**
* 设置公众号自定义菜单栏
* @param array $jsonmenu 菜单栏数据
* @return bool|string
*/
public function menu_bar($jsonmenu = [])
{
//获取token
$access_token = $this->get_token($this->app_id, $this->app_secret);
$url = "https://api.weixin.qq.com/cgi-bin/menu/create?access_token=" . $access_token;
$result = $this->https_request($url, $jsonmenu);
return $result;
}
/**
* 公众号消息发送(群发)
* @param array $data 发送数据
*/
public function message_push_all($data=[])
{
//获取access_token
$access_token = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=$this->app_id&secret=$this->app_secret";
//缓存access_token
session_start();
$_SESSION['access_token'] = "";
$_SESSION['expires_in'] = 0;
$ACCESS_TOKEN = "";
if (!isset($_SESSION['access_token']) || (isset($_SESSION['expires_in']) && time() > $_SESSION['expires_in'])) {
$json = $this->httpRequest($access_token);
$json = json_decode($json, true);
$_SESSION['access_token'] = $json['access_token'];
$_SESSION['expires_in'] = time() + 7200;
$ACCESS_TOKEN = $json["access_token"];
} else {
$ACCESS_TOKEN = $_SESSION["access_token"];
}
// 构造群发消息的URL
$url = 'https://api.weixin.qq.com/cgi-bin/message/mass/sendall?access_token=' . $ACCESS_TOKEN;
// 构造消息数据
$result = $this->https_request($url, $data);
return $result;
}
/**
* 公众号消息发送(单独)
* @param array $data 发送数据
*/
public function message_push($data=[])
{
//获取access_token
$access_token = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=$this->app_id&secret=$this->app_secret";
//缓存access_token
session_start();
$_SESSION['access_token'] = "";
$_SESSION['expires_in'] = 0;
$ACCESS_TOKEN = "";
if (!isset($_SESSION['access_token']) || (isset($_SESSION['expires_in']) && time() > $_SESSION['expires_in'])) {
$json = $this->httpRequest($access_token);
$json = json_decode($json, true);
$_SESSION['access_token'] = $json['access_token'];
$_SESSION['expires_in'] = time() + 7200;
$ACCESS_TOKEN = $json["access_token"];
} else {
$ACCESS_TOKEN = $_SESSION["access_token"];
}
$url = 'https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token=' . $ACCESS_TOKEN;
$result = $this->https_request($url, $data);
return $result;
}
/**
* 公众号模板消息
* @param string $open_id 用户openid
* @param string $template_id 公众号模板id
* @param array $data 发送参数
* @param string $url 点击模板跳转路径
*/
public function message_template($open_id='',$template_id='',$data=[],$url='')
{
//获取access_token
$access_token = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=$this->app_id&secret=$this->app_secret";
//缓存access_token
session_start();
$_SESSION['access_token'] = "";
$_SESSION['expires_in'] = 0;
$ACCESS_TOKEN = "";
if (!isset($_SESSION['access_token']) || (isset($_SESSION['expires_in']) && time() > $_SESSION['expires_in'])) {
$json = $this->httpRequest($access_token);
$json = json_decode($json, true);
$_SESSION['access_token'] = $json['access_token'];
$_SESSION['expires_in'] = time() + 7200;
$ACCESS_TOKEN = $json["access_token"];
} else {
$ACCESS_TOKEN = $_SESSION["access_token"];
}
$url="https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=".$ACCESS_TOKEN;
$data_request = [
'touser'=>$open_id,
'template_id'=>$template_id,
'url'=>'',//点击模板消息会跳转的链接
'topcolor'=>"#7B68EE",
'data'=>$data,
];
$data_request = urldecode(json_encode($data_request));
$ch1 = curl_init();
curl_setopt($ch1, CURLOPT_URL, $url);
curl_setopt($ch1, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch1, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch1, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt($ch1, CURLOPT_POST, 1);
curl_setopt($ch1, CURLOPT_POSTFIELDS, $data_request);
$output = curl_exec($ch1);
curl_close($ch1);
return $output;
}
/**
* 小程序订阅模板消息
* @param string $open_id 用户openid
* @param string $template_id 公众号模板id
* @param array $data 发送参数
* @param string $url 点击模板跳转路径
*/
public function message_subscribe($open_id='',$template_id='',$data=[],$url='')
{
//获取access_token
$access_token = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=$this->app_id&secret=$this->app_secret";
//缓存access_token
session_start();
$_SESSION['access_token'] = "";
$_SESSION['expires_in'] = 0;
$ACCESS_TOKEN = "";
if (!isset($_SESSION['access_token']) || (isset($_SESSION['expires_in']) && time() > $_SESSION['expires_in'])) {
$json = $this->httpRequest($access_token);
$json = json_decode($json, true);
$_SESSION['access_token'] = $json['access_token'];
$_SESSION['expires_in'] = time() + 7200;
$ACCESS_TOKEN = $json["access_token"];
} else {
$ACCESS_TOKEN = $_SESSION["access_token"];
}
$url="https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token=".$ACCESS_TOKEN;
$data_request = [
'touser'=>$open_id,
'template_id'=>$template_id,
'url'=>'',//点击模板消息会跳转的链接
'topcolor'=>"#7B68EE",
'data'=>$data,
];
$data_request = urldecode(json_encode($data_request));
$ch1 = curl_init();
curl_setopt($ch1, CURLOPT_URL, $url);
curl_setopt($ch1, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch1, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch1, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt($ch1, CURLOPT_POST, 1);
curl_setopt($ch1, CURLOPT_POSTFIELDS, $data_request);
$output = curl_exec($ch1);
curl_close($ch1);
return $output;
}
/**
* 获取token
* @param int $appid
* @param int $secret
* @param int $user_miyao 会员秘钥(用于文件创建)
* @return mixed
*/
public function get_token($appid = '', $secret = '', $user_miyao = '')
{
$url = dirname(dirname(dirname(__FILE__))) . '/public/uploads/wechat/wechat_token_' . $user_miyao . '.txt';
$token_data = @file_get_contents($url);
if (!empty($token_data)) {
$token_data = json_decode($token_data, true);
$time = time() - $token_data['time'];
if ($time > 3600) {
$token_url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={$appid}&secret={$secret}";
$token_res = $this->https_request($token_url);
$token_res = json_decode($token_res, true);
$token = $token_res['access_token'];
$data = array(
'time' => time(),
'token' => $token
);
file_put_contents($url, json_encode($data));
} else {
$token = $token_data['token'];
}
} else {
$token_url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={$appid}&secret={$secret}";
$token_res = $this->https_request($token_url);
$token_res = json_decode($token_res, true);
$token = $token_res['access_token'];
$data = array(
'time' => time(),
'token' => $token
);
file_put_contents($url, json_encode($data));
}
return $token;
}
/**
* 获取ticket
* @param string $token
* @param string $user_miyao 会员秘钥(用于文件创建)
* @return mixed
*/
function get_ticket($token = '', $user_miyao = '')
{
$url = dirname(dirname(dirname(__FILE__))) . '/public/uploads/wechat/wechat_ticket_' . $user_miyao . '.txt';
$ticket_data = @file_get_contents($url);
if (!empty($ticket_data)) {
$ticket_data = json_decode($ticket_data, true);
$time = time() - $ticket_data['time'];
if ($time > 3600) {
$ticket_url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token={$token}&type=jsapi";
$ticket_res = $this->https_request($ticket_url);
$ticket_res = json_decode($ticket_res, true);
$ticket = $ticket_res['ticket'];
$data = array(
'time' => time(),
'ticket' => $ticket
);
file_put_contents($url, json_encode($data));
} else {
$ticket = $ticket_data['ticket'];
}
} else {
$ticket_url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token={$token}&type=jsapi";
$ticket_res = $this->https_request($ticket_url);
$ticket_res = json_decode($ticket_res, true);
$ticket = $ticket_res['ticket'];
$data = array(
'time' => time(),
'ticket' => $ticket
);
file_put_contents($url, json_encode($data));
}
return $ticket;
}
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;
}
/**
* 模拟 http 请求
* @param String $url 请求网址
* @param Array $data 数据
*/
function https_request($url, $data = null)
{
// curl 初始化
$curl = curl_init();
// curl 设置
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);
// 判断 $data get or post
if (!empty($data)) {
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
}
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
// 执行
$res = curl_exec($curl);
curl_close($curl);
return $res;
}
}