www.lightcourse.com/app/common/model/Wechat.php

403 lines
13 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<?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&timestamp=$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']);
}
}
}