appId = $appId;
$this->appSecret = $appSecret;
}
// 签名
public function getSignPackage($url = '')
{
mlog($this->appId,"getSignPackage");
$jsapiTicket = $this->getJsApiTicket();
// 注意 URL 一定要动态获取,不能 hardcode.
$protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' || $_SERVER['SERVER_PORT'] == 443) ? "https://" : "http://";
$url = empty($url) ? "$protocol$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]" : $url;
$timestamp = time();
$nonceStr = $this->createNonceStr();
// 这里参数的顺序要按照 key 值 ASCII 码升序排序
$string = "jsapi_ticket=$jsapiTicket&noncestr=$nonceStr×tamp=$timestamp&url=$url";
$signature = sha1($string);
$signPackage = array(
"appId" => $this->appId,
"nonceStr" => $nonceStr,
"timestamp" => $timestamp,
"url" => $url,
"rawString" => $string,
"signature" => $signature
);
return $signPackage;
}
// 随机字符串
private 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;
}
/**
* 根据 access_token 获取 icket
* @return type
*/
public function getJsApiTicket()
{
$ticket = S('ticket');
if (!empty($ticket))
return $ticket;
$access_token = $this->get_access_token();
$url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token={$access_token}&type=jsapi";
$return = httpRequest($url, 'GET');
$return = json_decode($return, 1);
S('ticket', $return['ticket'], 7000);
return $return['ticket'];
}
/**
* 获取 网页授权登录access token
* @return type
*/
public function getAccessToken()
{
//判断是否过了缓存期
$access_token = S('access_token');
if (!empty($access_token))
return $access_token;
$url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={$this->appId}&secret={$this->appSecret}";
$return = httpRequest($url, 'GET');
$return = json_decode($return, 1);
S('access_token', $return['access_token'], 7000);
return $return['access_token'];
}
// 获取一般的 access_token
public function get_access_token()
{
//判断是否过了缓存期
$wechat = M('wx_user')->where(array('appid' => $this->appId))->find();
mlog($this->appId, "Jssk");
$expire_time = $wechat['web_expires'];
if ($expire_time > time()) {
return $wechat['web_access_token'];
}
$url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={$wechat['appid']}&secret={$wechat['appsecret']}";
$return = httpRequest($url, 'GET');
$return = json_decode($return, 1);
$web_expires = time() + 2000; // 提前200秒过期
M('wx_user')->where(array('id' => $wechat['id']))->save(array('web_access_token' => $return['access_token'], 'web_expires' => $web_expires));
return $return['access_token'];
}
/*
* 向用户推送普通消息
*/
public function push_msg($openid, $content)
{
$access_token = $this->get_access_token();
$url = "https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token={$access_token}";
$post_arr = array(
'touser' => $openid,
'msgtype' => 'text',
'text' => array(
'content' => $content,
)
);
$post_str = json_encode($post_arr, JSON_UNESCAPED_UNICODE);
$return = httpRequest($url, 'POST', $post_str);
$return = json_decode($return, true);
}
///
/// 微信消息模板方法 ------手店线下ERP接口(使用中)
///
/// 商户ID
/// 消息模板推送客户微信id
/// 模板类型,例:1001、1002
/// 消息模版点击跳转url地址 为空取值数据库
/// 消息推送后微信方返回详细结果接收网址,如不需要详细可随意传值
/// 模板参数集合,务必根据模板参数的顺序传入对应的值
public function WeiXin_MassageModelSend($stoid, $OpenId, $typeid, $backurl, $Object)
{
//根据方法获取微信参数Access_token
$str_WeiXinAccessToken = $this->get_access_token();
//组合要发送的微信接口地址
$url = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=".$str_WeiXinAccessToken;
$res = M("wx_sendlist")->where("store_id", $stoid)->where("typeid", $typeid)->find();
if ($res && !empty($res["template_id"])) {
$IsBackMessage;
//模版消息跳转地址获取原则 若接口有传入url参数 则取接口url值 若没有参数参数取数据库设置url值
$defaulturl=curHostURL()+"/mobile/User/index/stoid/".$stoid;
if (empty($backurl)) $backurl = empty($res["htmlurl"]) ? "test.html" : $res["htmlurl"];
/*--获取发报的内容--*/
$strPost =$this->GetWeiXinMessageModelStr($typeid, $OpenId, $res["template_id"], $backurl, $Object);
mlog($strPost,"send_res");
if(!empty($strPost)){
$return = httpRequest($url, 'POST', $strPost);
mlog("结果:".$OpenId.$return,"send_res/".$stoid);
$data = json_decode($return,true);
//{"errcode":0,"errmsg":"ok","msgid":202582287}
if (!empty($data) && $data["errcode"] ==0) {
return ['wxcode'=>0,'msg'=>'ok'];
} else if(!empty($data) && $data["errcode"] != 0 ) {
$result = "发送失败,报文错误:".(empty($data["errmsg"])?"":$data["errmsg"]);
return ['wxcode'=>$data["errcode"],'msg'=>$result];
}else{
$result = "发送失败,报文获取失败";
return ['wxcode'=>-9999,'msg'=>$result];
}
}else{
$result = "发送失败,报文获取失败";
return ['wxcode'=>-9999,'msg'=>$result];
}
}else{
$result = "发送失败,商户未选择该模板";
return ['wxcode'=>-9999,'msg'=>$result];
}
//return $result;
}
///
/// 获取微信发送报文
///
/// 模板本地id
/// 发送方openid
/// 模板微信id
/// 获取信息url
/// 其他参数
///
public function GetWeiXinMessageModelStr($typeid, $openid, $template_id, $url, $Object)
{
$result = "";
if (count($Object) > 7) {
$Object[7]=urldecode($Object[7]);
$arrcolor = explode('|', $Object[7]);
} else
$arrcolor = ["#f00", "#173177", "#173177", "#173177", "#173177", "#173177", "#f00", "#f00"];
$post_arr['touser']=$openid;
$post_arr['template_id']=$template_id;
$post_arr['url']=$url;
$post_arr['topcolor']=$arrcolor[0];
$rs=M("wx_sendtype")->where("typeid",$typeid)->find();
if($rs['myremark']) {
$renarr=explode(",",$rs['myremark']);
foreach ($renarr as $k=>$v){
$post_arr['data'][$v]['value']=$Object[$k];
$post_arr['data'][$v]['color']=$arrcolor[$k];
}
try {
$result = json_encode($post_arr, JSON_UNESCAPED_UNICODE);
}catch (Exception $e){
mlog("转码失败","send_res");
}
return $result;
}
return $result;
}
}