Files
2019-02-28 19:48:21 +08:00

484 lines
17 KiB
PHP
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
/**
* tpshop
* ============================================================================
* 版权所有 2015-2027 深圳搜豹网络科技有限公司,并保留所有权利。
* 网站地址: http://www.tp-shop.cn
* ----------------------------------------------------------------------------
* 这不是一个自由软件!您只能在不用于商业目的的前提下对程序代码进行修改和使用 .
* 不允许对程序代码以任何形式任何目的的再发布。
* 如果商业用途务必到官方购买正版授权, 以免引起不必要的法律纠纷.
* ============================================================================
* @author lhb
*/
namespace app\common\logic\saas\wechat;
use app\common\model\saas\Miniapp;
/**
* 微信小程序第三方平台操作类
*/
class MiniApp3rd extends WxCommon
{
private $config = []; //小程序配置
/**
* @param array|string $config 授权用户的配置或者appid
*/
public function __construct($config)
{
if (is_string($config)) {
$config = Miniapp::get(['appid' => $config]);
}
if ($config instanceof Miniapp) {
$config = $config->toArray();
}
$this->config = $config ?: [];
}
/**
* 获取小程序session信息
* @param string $code 登录码
* @return array|bool
*/
public function getSessionInfo($code)
{
$appId = $this->config['appid'];
if (!$appId) {
$this->setError('授权用户不存在');
return false;
}
$wx3rd = Wx3rdPlatform::getInstance();
$wx3rdCfg = $wx3rd->getConfig();
if (!$wx3rdCfg) {
$this->setError('第三方平台信息未完善');
return false;
}
$url = 'https://api.weixin.qq.com/sns/component/jscode2session';
$fields = [
'appid' => $appId,
'js_code' => $code,
'grant_type' => 'authorization_code',
'component_appid' => $wx3rdCfg['appid'],
'component_access_token' => $wx3rdCfg['access_token']
];
$wxdata = $this->requestAndCheck($url, 'GET', $fields);
if ($wxdata === false) {
return false;
}
return $wxdata;
}
/**
* 获取授权者的authorizer_access_token
* @return boolean
*/
public function getAccessToken()
{
$config = $this->config;
if (empty($config) || !$config['appid'] || !$config['access_token'] || !$config['refresh_token']) {
$this->setError("授权信息不全,请先授权");
return false;
}
//判断是否过了缓存期
if ($config['access_token_expires'] > time()) {
return $config['access_token'];
}
$wx3rd = Wx3rdPlatform::getInstance();
$return = $wx3rd->getAuthorizerToken($config['appid'], $config['refresh_token']);
if ($return === false) {
$this->setError($wx3rd->getError());
$this->config['access_token_expires'] = 0;
Miniapp::update(['access_token_expires' => 0], ['user_id' => $config['user_id']]);
return false;
}
$data = [
'access_token' => $return['authorizer_access_token'],
'access_token_expires' => $return['expires_in'] + time() - 200, //提前200s失效
'refresh_token' => $return['authorizer_refresh_token'],
];
Miniapp::update($data, ['user_id' => $config['user_id']]);
$this->config = array_merge($config, $data);
return $return['authorizer_access_token'];
}
/**
* 修改服务器地址
* 详看https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1489138143_WPbOO&token=&lang=zh_CN
* @param string $action add添加, delete删除, set覆盖
* @param array $domains
* requestDomain request合法域名
* wsrequestDomain socket合法域名
* uploadDomain uploadFile合法域名
* downloadDomain downloadFile合法域名
* @return boolean
*/
public function modifyDomain($action, $domains)
{
$accessToken = $this->getAccessToken();
if (!$accessToken) {
return false;
}
$url ="https://api.weixin.qq.com/wxa/modify_domain?access_token={$accessToken}";
$post = $this->toJson([
'action' => $action,
'requestdomain' => $domains['requestdomain'],
'wsrequestdomain' => $domains['wsrequestdomain'],
'uploaddomain' => $domains['uploaddomain'],
'downloaddomain' => $domains['downloaddomain'],
]);
$wxdata = $this->requestAndCheck($url, 'POST', $post);
return $wxdata !== false;
}
/**
* 设置业务域名
* @return bool
*/
public function setWebViewDomain($action, $webviewdomain)
{
if (!$accessToken = $this->getAccessToken()) {
return false;
}
$post = $this->toJson([
'action' => $action,
'webviewdomain' => $webviewdomain,
]);
// $post = '{}'; //官方要求空的数据包
$url ="https://api.weixin.qq.com/wxa/setwebviewdomain?access_token={$accessToken}";
$wxdata = $this->requestAndCheck($url, 'POST', $post);
return $wxdata !== false;
}
/**
* 获取服务器地址
* 详看https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1489138143_WPbOO&token=&lang=zh_CN
* @return mixed
*/
public function getDomain()
{
$accessToken = $this->getAccessToken();
if (!$accessToken) {
return false;
}
$url ="https://api.weixin.qq.com/wxa/modify_domain?access_token={$accessToken}";
$post = $this->toJson([
'action' => 'get',
]);
$wxdata = $this->requestAndCheck($url, 'POST', $post);
if ($wxdata === false) {
return false;
}
return [
'requestdomain' => $wxdata['requestdomain'],
'wsrequestdomain' => $wxdata['wsrequestdomain'],
'uploaddomain' => $wxdata['uploaddomain'],
'downloaddomain' => $wxdata['downloaddomain'],
];
}
/**
* 绑定微信用户为小程序体验者
* 详见https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1489140588_nVUgx&token=&lang=zh_CN
* @param string $wechatId 微信号
* @return boolean
*/
public function bindTester($wechatId)
{
$accessToken = $this->getAccessToken();
if (!$accessToken) {
return false;
}
$url ="https://api.weixin.qq.com/wxa/bind_tester?access_token={$accessToken}";
$post = $this->toJson([
'wechatid' => $wechatId,
]);
$wxdata = $this->requestAndCheck($url, 'POST', $post);
return $wxdata !== false;
}
/**
* 解绑体验者
* @param $wechatId
* @return bool
*/
public function unbindTester($wechatId)
{
$accessToken = $this->getAccessToken();
if (!$accessToken) {
return false;
}
$url ="https://api.weixin.qq.com/wxa/unbind_tester?access_token={$accessToken}";
$post = $this->toJson([
'wechatid' => $wechatId,
]);
$wxdata = $this->requestAndCheck($url, 'POST', $post);
return $wxdata !== false;
}
/**
* 为授权的小程序帐号上传小程序代码
* 详见https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1489140610_Uavc4&token=&lang=zh_CN
* @param string $templateId 代码库中的代码模版ID
* @param string|array $extCfg 第三方自定义的配置json
* @param string $version 代码版本号,开发者可自定义
* @param string $description 代码描述,开发者可自定义
* @return boolean
*/
public function commit($templateId, $extCfg, $version, $description)
{
$accessToken = $this->getAccessToken();
if (!$accessToken) {
return false;
}
if (!is_string($extCfg)) {
$extCfg = $this->toJson($extCfg);
}
$url ="https://api.weixin.qq.com/wxa/commit?access_token={$accessToken}";
$post = $this->toJson([
'template_id' => $templateId,
'ext_json' => $extCfg, //需为string类型
'user_version' => $version, //代码版本号
'user_desc' => $description,
]);
$wxdata = $this->requestAndCheck($url, 'POST', $post);
return $wxdata !== false;
}
/**
* 获取体验小程序的体验二维码链接
* 详见https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1489140610_Uavc4&token=&lang=zh_CN
* @return string
*/
public function getTestQrcode()
{
$accessToken = $this->getAccessToken();
if (!$accessToken) {
return false;
}
$url ="https://api.weixin.qq.com/wxa/get_qrcode?access_token={$accessToken}";
$wxdata = $this->requestAndCheck($url, 'GET', [], false);
return $wxdata;
}
/**
* 获取授权小程序帐号的可选类目
* 详见https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1489140610_Uavc4&token=&lang=zh_CN
* @return mixed
*/
public function getCategory()
{
$accessToken = $this->getAccessToken();
if (!$accessToken) {
return false;
}
$url ="https://api.weixin.qq.com/wxa/get_category?access_token={$accessToken}";
$wxdata = $this->requestAndCheck($url);
if ($wxdata === false) {
return false;
}
//返回格式:如下:
// [{
// "first_class":"教育", //一级类目名称
// "second_class":"学历教育",
// "third_class":"高等"
// "first_id":3, //一级类目的ID编号
// "second_id":4,
// "third_id":5,
// }]
return $wxdata['category_list'];
}
/**
* 获取小程序的第三方提交代码的页面配置(仅供第三方开发者代小程序调用)
* 详见https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1489140610_Uavc4&token=&lang=zh_CN
* @return mixed
*/
public function getPage()
{
$accessToken = $this->getAccessToken();
if (!$accessToken) {
return false;
}
$url ="https://api.weixin.qq.com/wxa/get_page?access_token={$accessToken}";
$wxdata = $this->requestAndCheck($url);
if ($wxdata === false) {
return false;
}
return $wxdata['page_list'];
}
/**
* 将第三方提交的代码包提交审核(仅供第三方开发者代小程序调用)
* 详见https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1489140610_Uavc4&token=&lang=zh_CN
* @param array $itemList
* 示例:[{
"address":"page/logs/logs",//小程序的页面,可通过“获取小程序的第三方提交代码的页面配置”接口获得
"tag":"学习 工作", //小程序的标签多个标签用空格分隔标签不能多于10个标签长度不超过20
"first_class": "教育", //一级类目名称,可通过“获取授权小程序帐号的可选类目”接口获得
"second_class": "学历教育", //二级类目(同上)
"third_class": "高等", //三级类目(同上)
"first_id":3, //一级类目的ID可通过“获取授权小程序帐号的可选类目”接口获得
"second_id":4, //二级类目的ID(同上)
"third_id":5, //三级类目的ID(同上)
"title": "日志" //小程序页面的标题,标题长度不超过32
}]
* @return mixed 审核编号
*/
public function submitAudit($itemList)
{
$accessToken = $this->getAccessToken();
if (!$accessToken) {
return false;
}
$url ="https://api.weixin.qq.com/wxa/submit_audit?access_token={$accessToken}";
$post = $this->toJson([
'item_list' => $itemList
]);
$wxdata = $this->requestAndCheck($url, 'POST', $post);
if ($wxdata === false) {
return false;
}
return $wxdata['auditid'];
}
/**
* 查询某个指定版本的审核状态(仅供第三方代小程序调用)
* 详见https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1489140610_Uavc4&token=&lang=zh_CN
* @param string $auditId 提交审核时获得的审核id
* @return mixed 审核结果数组
*/
public function getAuditStatus($auditId)
{
$accessToken = $this->getAccessToken();
if (!$accessToken) {
return false;
}
$url ="https://api.weixin.qq.com/wxa/get_auditstatus?access_token={$accessToken}";
$post = $this->toJson([
'auditid' => $auditId
]);
$wxdata = $this->requestAndCheck($url, 'POST', $post);
if ($wxdata === false) {
return false;
}
return [
'status' => $wxdata['status'], //0为审核成功1为审核失败2为审核中
'reason' => isset($wxdata['reason']) ? $wxdata['reason'] : '' //当status=1审核被拒绝时返回的拒绝原因
];
}
/**
* 查询最新一次提交的审核状态(仅供第三方代小程序调用)
* 详见https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1489140610_Uavc4&token=&lang=zh_CN
* @return mixed 审核结果数组
*/
public function getLatestAuditStatus()
{
$accessToken = $this->getAccessToken();
if (!$accessToken) {
return false;
}
$url ="https://api.weixin.qq.com/wxa/get_latest_auditstatus?access_token={$accessToken}";
$wxdata = $this->requestAndCheck($url);
if ($wxdata === false) {
return false;
}
return [
'auditid' => $wxdata['auditid'], //最新的审核ID
'status' => $wxdata['status'], //0为审核成功1为审核失败2为审核中
'reason' => isset($wxdata['reason']) ? $wxdata['reason'] : '' //当status=1审核被拒绝时返回的拒绝原因
];
}
/**
* 发布已通过审核的小程序(仅供第三方代小程序调用)
* 详见https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1489140610_Uavc4&token=&lang=zh_CN
* @return boolean
*/
public function release()
{
$accessToken = $this->getAccessToken();
if (!$accessToken) {
return false;
}
$url ="https://api.weixin.qq.com/wxa/release?access_token={$accessToken}";
$post = '{}'; //官方要求空的数据包
$wxdata = $this->requestAndCheck($url, 'POST', $post);
return $wxdata !== false;
}
/**
* 修改小程序线上代码的可见状态(仅供第三方代小程序调用)
* @param string $action 设置可访问状态发布后默认可访问1可见 0不可见
* @return boolean
*/
public function changeVisitStatus($action)
{
$accessToken = $this->getAccessToken();
if (!$accessToken) {
return false;
}
$url ="https://api.weixin.qq.com/wxa/change_visitstatus?access_token={$accessToken}";
$post = $this->toJson([
'action' => $action ? 'open' : 'close'
]);
$wxdata = $this->requestAndCheck($url, 'POST', $post);
return $wxdata !== false;
}
/**
* 获取授权用户的详细信息
* @return boolean | array
*/
public function getAuthUserInfo()
{
$appId = $this->config['appid'];
if (!$appId) {
$this->setError('授权用户不存在');
return false;
}
$wx3rd = Wx3rdPlatform::getInstance();
return $wx3rd->getAuthorizerInfo($appId);
}
}