403 lines
13 KiB
PHP
403 lines
13 KiB
PHP
|
<?php
|
|||
|
namespace app\common\model;
|
|||
|
use think\facade\Db;
|
|||
|
|
|||
|
/**
|
|||
|
* ============================================================================
|
|||
|
* 联课教育商城系统
|
|||
|
* ============================================================================
|
|||
|
* 版权所有 2022 刻羽互动科技有限公司,并保留所有权利。
|
|||
|
* 网站地址: http://www.o1h.cn
|
|||
|
* ----------------------------------------------------------------------------
|
|||
|
* 这不是一个自由软件!您只能在不用于商业目的的前提下对程序代码进行修改和使用 .
|
|||
|
* 不允许对程序代码以任何形式任何目的的再发布。
|
|||
|
* ============================================================================
|
|||
|
* 数据层模型
|
|||
|
*/
|
|||
|
class Wechat extends BaseModel
|
|||
|
{
|
|||
|
public $page_info;
|
|||
|
public $wxconfig;
|
|||
|
public $error_message='';
|
|||
|
public $error_code=0;
|
|||
|
/**
|
|||
|
* 获取公众号配置信息
|
|||
|
* @access public
|
|||
|
* @author o1h.cn
|
|||
|
* @return type
|
|||
|
*/
|
|||
|
public function getOneWxconfig(){
|
|||
|
$this->wxconfig=Db::name('wxconfig')->where('1=1')->find();
|
|||
|
return $this->wxconfig;
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* 增加微信配置
|
|||
|
* @access public
|
|||
|
* @author o1h.cn
|
|||
|
*/
|
|||
|
public function addWxconfig($data) {
|
|||
|
return Db::name('wxconfig')->insert($data);
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* 编辑微信配置
|
|||
|
* @access public
|
|||
|
* @author o1h.cn
|
|||
|
*/
|
|||
|
public function editWxconfig($condition, $data) {
|
|||
|
return Db::name('wxconfig')->where($condition)->update($data);
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* 获取微信菜单列表
|
|||
|
* @access public
|
|||
|
* @author o1h.cn
|
|||
|
*/
|
|||
|
public function getWxmenuList($condition, $order = 'id asc', $field = '*') {
|
|||
|
return Db::name('wxmenu')->field($field)->where($condition)->order($order)->select()->toArray();
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* 关键字查询
|
|||
|
* @access public
|
|||
|
* @author o1h.cn
|
|||
|
* @param type $field 字段
|
|||
|
* @param type $wh 条件
|
|||
|
* @param type $order 排序
|
|||
|
* @return type
|
|||
|
*/
|
|||
|
public function getOneJoinWxkeyword($condition, $field = '', $order = 't.createtime DESC') {
|
|||
|
$condition[]=array('k.type','=','TEXT');
|
|||
|
$lists = Db::name('wxkeyword')->alias('k')->join('wxtext t', 't.id=k.pid', 'LEFT')->where($condition)->field($field)->order($order)->find();
|
|||
|
return $lists;
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* 获取单个关键词回复
|
|||
|
* @param type $condition
|
|||
|
* @return type
|
|||
|
*/
|
|||
|
public function getOneWxkeyword($condition) {
|
|||
|
return Db::name('wxkeyword')->where($condition)->find();
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* 获取关键词回复列表
|
|||
|
* @param type $condition
|
|||
|
* @param type $field
|
|||
|
* @param type $pagesize
|
|||
|
* @param type $order
|
|||
|
* @return type
|
|||
|
*/
|
|||
|
public function getWxkeywordList($condition, $field = '*', $pagesize='', $order='t.createtime DESC') {
|
|||
|
if ($pagesize) {
|
|||
|
$lists = Db::name('wxkeyword')->alias('k')->join('wxtext t', 't.id=k.pid', 'LEFT')->where($condition)->field($field)->order($order)->paginate(['list_rows'=>10,'query' => request()->param()],false);
|
|||
|
$this->page_info = $lists;
|
|||
|
return $lists->items();
|
|||
|
} else {
|
|||
|
return $lists = Db::name('wxkeyword')->alias('k')->join('wxtext t', 't.id=k.pid', 'LEFT')->where($condition)->field($field)->order($order)->select()->toArray();
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* 新增关键词回复
|
|||
|
* @param type $add
|
|||
|
* @return type
|
|||
|
*/
|
|||
|
public function addWxkeyword($add) {
|
|||
|
return Db::name('wxkeyword')->insert($add);
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* 编辑关键词回复
|
|||
|
* @param type $condition
|
|||
|
* @param type $data
|
|||
|
* @return type
|
|||
|
*/
|
|||
|
public function editWxkeyword($condition, $data) {
|
|||
|
return Db::name('wxkeyword')->where($condition)->update($data);
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* 删除关键词回复
|
|||
|
* @param type $condition
|
|||
|
* @return type
|
|||
|
*/
|
|||
|
public function delWxkeyword($condition) {
|
|||
|
return Db::name('wxkeyword')->where($condition)->delete();
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* 新增文本回复
|
|||
|
* @param array $add
|
|||
|
* @return type
|
|||
|
*/
|
|||
|
public function addWxtext($add) {
|
|||
|
return Db::name('wxtext')->insertGetId($add);
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* 编辑文本回复
|
|||
|
* @param type $condition
|
|||
|
* @param type $data
|
|||
|
* @return type
|
|||
|
*/
|
|||
|
public function editWxtext($condition, $data) {
|
|||
|
return Db::name('wxtext')->where($condition)->update($data);
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* 删除文本回复
|
|||
|
* @param type $condition
|
|||
|
* @return type
|
|||
|
*/
|
|||
|
public function delWxtext($condition) {
|
|||
|
return Db::name('wxtext')->where($condition)->delete();
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* 会员查询
|
|||
|
* @access public
|
|||
|
* @author o1h.cn
|
|||
|
* @return type
|
|||
|
*/
|
|||
|
public function getWxmemberList() {
|
|||
|
$info = Db::name('member')->where('member_wxinfo','not null')->where('member_wxopenid','<>','')->where('member_wxunionid','<>','')->field('member_name,member_addtime,member_wxunionid,member_wxopenid,member_id')->paginate(['list_rows'=>8,'query' => request()->param()],false);
|
|||
|
$this->page_info = $info;
|
|||
|
return $info->items();
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* 增加
|
|||
|
* @access public
|
|||
|
* @author o1h.cn
|
|||
|
* @param type $data 数据
|
|||
|
* @return type
|
|||
|
*/
|
|||
|
public function addWxmsg($data) {
|
|||
|
Db::name('wxmsg')->insertGetId($data);
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* 获取列表
|
|||
|
* @access public
|
|||
|
* @author o1h.cn
|
|||
|
* @param type $where 条件
|
|||
|
* @return type
|
|||
|
*/
|
|||
|
public function getWxmsgList($where = '') {
|
|||
|
$res = Db::name('wxmsg')->alias('w')->join('member m', 'w.member_id=m.member_id', 'LEFT')->where($where)->field('w.*,m.member_name')->order('createtime DESC')->paginate(['list_rows'=>10,'query' => request()->param()],false);
|
|||
|
$this->page_info = $res;
|
|||
|
return $res->items();
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* 删除消息推送
|
|||
|
* @param type $condition
|
|||
|
* @return type
|
|||
|
*/
|
|||
|
public function delWxmsg($condition){
|
|||
|
return Db::name('wxmsg')->where($condition)->delete();
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* 获取单个微信菜单
|
|||
|
* @param type $condition
|
|||
|
* @return type
|
|||
|
*/
|
|||
|
public function getOneWxmenu($condition) {
|
|||
|
return Db::name('wxmenu')->where($condition)->find();
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* 获取微信菜单数量
|
|||
|
* @param type $condition
|
|||
|
* @return type
|
|||
|
*/
|
|||
|
public function getWxmenuCount($condition) {
|
|||
|
return Db::name('wxmenu')->where($condition)->count();
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* 编辑微信菜单
|
|||
|
* @param type $condition
|
|||
|
* @param type $data
|
|||
|
* @return type
|
|||
|
*/
|
|||
|
public function editWxmenu($condition, $data) {
|
|||
|
return Db::name('wxmenu')->where($condition)->update($data);
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* 新增微信菜单
|
|||
|
* @param type $data
|
|||
|
* @return type
|
|||
|
*/
|
|||
|
public function addWxmenu($data) {
|
|||
|
return Db::name('wxmenu')->insert($data);
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* 删除微信菜单
|
|||
|
* @param type $condition
|
|||
|
* @return type
|
|||
|
*/
|
|||
|
public function delWxmenu($condition) {
|
|||
|
return Db::name('wxmenu')->where($condition)->delete();
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* 获取微信菜单列表
|
|||
|
* @param type $condition
|
|||
|
* @return type
|
|||
|
*/
|
|||
|
public function getMenulist($condition) {
|
|||
|
return Db::name('wxmenu')->where($condition)->select()->toArray();
|
|||
|
}
|
|||
|
//校验AccessToken 是否可用及返回新的
|
|||
|
public function getAccessToken($from='',$force=0) {
|
|||
|
|
|||
|
if($from=='miniprogram'){
|
|||
|
$expires_in=$this->wxconfig['xcx_expires_in'];
|
|||
|
$appid=$this->wxconfig['xcx_appid'];
|
|||
|
$appsecret=$this->wxconfig['xcx_appsecret'];
|
|||
|
$access_token = $this->wxconfig['xcx_access_token'];
|
|||
|
}else{
|
|||
|
$expires_in=$this->wxconfig['expires_in'];
|
|||
|
$appid=$this->wxconfig['appid'];
|
|||
|
$appsecret=$this->wxconfig['appsecret'];
|
|||
|
$access_token = $this->wxconfig['access_token'];
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
//token过期,重新拉去
|
|||
|
if ($expires_in < TIMESTAMP + 7200) {
|
|||
|
$url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=$appid&secret=$appsecret";
|
|||
|
$res = json_decode(http_request($url));
|
|||
|
if (isset($res->access_token)) {
|
|||
|
$access_token = $res->access_token;
|
|||
|
$this->error_message='';
|
|||
|
$this->error_code=0;
|
|||
|
$expire_time = TIMESTAMP + 7000;
|
|||
|
if($from=='miniprogram'){
|
|||
|
$data=array('xcx_access_token' => $access_token, 'xcx_expires_in' => $expire_time);
|
|||
|
}else{
|
|||
|
$data=array('access_token' => $access_token, 'expires_in' => $expire_time);
|
|||
|
}
|
|||
|
Db::name('wxconfig')->where(array('id' => $this->wxconfig['id']))->update($data);
|
|||
|
}else{
|
|||
|
$this->error_message=$res->errmsg;
|
|||
|
$this->error_code=$res->errcode;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
return $access_token;
|
|||
|
}
|
|||
|
function getMiniProCode($scene,$page='pages/index/index'){
|
|||
|
$accessToken = $this->getAccessToken('miniprogram',0);
|
|||
|
$url = "https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=".$accessToken;
|
|||
|
$data = http_request($url,'POST', json_encode(array(
|
|||
|
'scene'=>$scene,
|
|||
|
'page'=>$page,
|
|||
|
)));
|
|||
|
if(isset($data->errcode) && $data->errcode=='42001'){
|
|||
|
$accessToken = $this->getAccessToken('miniprogram',0);
|
|||
|
$url = "https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=".$accessToken;
|
|||
|
$data = http_request($url,'POST', json_encode(array(
|
|||
|
'scene'=>$scene,
|
|||
|
'page'=>$page,
|
|||
|
)));
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
return $data;
|
|||
|
|
|||
|
}
|
|||
|
function getJsapiTicket() {
|
|||
|
$ticket=$this->wxconfig['ticket'];
|
|||
|
if($this->wxconfig['ticket_expires_in'] < TIMESTAMP){
|
|||
|
$accessToken = $this->getAccessToken();
|
|||
|
|
|||
|
$url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=".$accessToken."&type=jsapi";
|
|||
|
$data = http_request($url);
|
|||
|
$data = json_decode($data, true);
|
|||
|
|
|||
|
if(isset($data['ticket'])){
|
|||
|
Db::name('wxconfig')->where(array('id' => $this->wxconfig['id']))->update(array('ticket' => $data['ticket'], 'ticket_expires_in' => (TIMESTAMP+$data['expires_in'])));
|
|||
|
$ticket=$data['ticket'];
|
|||
|
}else{
|
|||
|
$this->error_message=$data['errmsg'];
|
|||
|
$this->error_code=$data['errcode'];
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
return $ticket;
|
|||
|
}
|
|||
|
public function getSignPackage($url='') {
|
|||
|
$jsapiTicket = $this->getJsapiTicket();
|
|||
|
|
|||
|
// 注意 URL 一定要动态获取,不能 hardcode.
|
|||
|
$protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' || $_SERVER['SERVER_PORT'] == 443) ? "https://" : "http://";
|
|||
|
if(!$url){
|
|||
|
$url = "$protocol$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";
|
|||
|
}
|
|||
|
|
|||
|
$timestamp = TIMESTAMP;
|
|||
|
$chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
|
|||
|
$nonceStr = "";
|
|||
|
for ($i = 0; $i < 16; $i++) {
|
|||
|
$nonceStr .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);
|
|||
|
}
|
|||
|
|
|||
|
// 这里参数的顺序要按照 key 值 ASCII 码升序排序
|
|||
|
$string = "jsapi_ticket=$jsapiTicket&noncestr=$nonceStr×tamp=$timestamp&url=$url";
|
|||
|
|
|||
|
$signature = sha1($string);
|
|||
|
|
|||
|
$signPackage = array(
|
|||
|
"appId" => $this->wxconfig['appid'],
|
|||
|
"nonceStr" => $nonceStr,
|
|||
|
"timestamp" => $timestamp,
|
|||
|
"url" => $url,
|
|||
|
"signature" => $signature,
|
|||
|
"rawString" => $string
|
|||
|
);
|
|||
|
return $signPackage;
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* 发送模板消息
|
|||
|
* @param type $accessToken
|
|||
|
* @param type $openid
|
|||
|
* @param type $template_id
|
|||
|
* @param type $url
|
|||
|
* @param type $data
|
|||
|
* @param type $topcolor
|
|||
|
*/
|
|||
|
function sendMessageTemplate($openid, $template_id, $url, $data, $topcolor = '#333') {
|
|||
|
|
|||
|
$accessToken = $this->getAccessToken();
|
|||
|
if ($this->error_code) {
|
|||
|
return ds_callback(false, $this->error_message);
|
|||
|
}
|
|||
|
|
|||
|
$template = array(
|
|||
|
'touser' => $openid,
|
|||
|
'template_id' => $template_id,
|
|||
|
'url' => $url,
|
|||
|
'topcolor' => $topcolor,
|
|||
|
'data' => $data
|
|||
|
);
|
|||
|
$json_template = json_encode($template);
|
|||
|
$post_url = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" . $accessToken;
|
|||
|
$dataRes = http_request($post_url,'POST', $json_template);
|
|||
|
$dataRes= json_decode($dataRes,true);
|
|||
|
if ($dataRes['errcode']==0) {
|
|||
|
return ds_callback(true);
|
|||
|
} else {
|
|||
|
return ds_callback(false, $dataRes['errmsg']);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|