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; } }