<?php//控制器文件 namespace Home\Controller; use Think\Controller; class IndexController extends Controller { public function index(){ //获得参数 signature nonce token timestamp echostr $nonce = $_GET['nonce']; $token = 'cdbb'; $timestamp = $_GET['timestamp']; $echostr = $_GET['echostr']; $signature = $_GET['signature']; //形成数组,然后按字典序排序 $array = array(); $array = array($nonce, $timestamp, $token); sort($array); //拼接成字符串,sha1加密 ,然后与signature进行校验 $str = sha1( implode( $array ) ); if( $str == $signature && $echostr ){ //第一次接入weixin api接口的时候 echo $echostr; exit; }else{ } } //获取jsapi-ticket 全局票据 public function getJsApiTicket(){ //如果session中保存有效的jsapi-ticket if($_SESSION['jsapi-ticket-expire_time']>time() && $_SESSION['jsapi-ticket']){ $jsapi=$_SESSION['jsapi-ticket']; echo "aba"; }else{ echo "aaa"; $access_token= $this->getWxAccessToken(); var_dump($access_token); $url='https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token='.$access_token.'&type=jsapi'; $re=$this->http_curl($url); $jsapi=$re['ticket']; $_SESSION['jsapi-ticket']=$jsapi; $_SESSION['jsapi-ticket-expire_time']=time()+7000; } var_dump($access_token); return $jsapi; } /* public function a(){ //如果session中保存有效的jsapi-ticket if($_SESSION['expire_time']>time() && $_SESSION['access_token']){ $access_token=$_SESSION['access_token']; }else{ $appid = 'wxd1157c516b3578d8'; $appsecret = '26afef5b19e1ebfc3382604908460aa9'; $url= "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=".$appid."&secret=".$appsecret; $re=$this->http_curl($url); $re = json_decode($re, true); $access_token=$re['access_token']; var_dump($access_token); $_SESSION['access_token']=$access_token; $_SESSION['expire_time']=time()+7200; } return $access_token; }*/ //获取16位随机码 public function getRandCode(){ $num=16; $array=array( 'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z', 'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z', '0','1','2','3','4','5','6','7','8','9' ); $tmpstr=''; $max=count($array); for($i=1;$i<=$num;$i++){ $key = rand(0,$max-1); $tmpstr.=$array[$key]; }; return $tmpstr; } //js-sdk 分享朋友圈 public function share(){ //获取jsapi-ticket 票据 $jsapi=$this->getJsApiTicket(); $timestamp=time(); $nonceStr=$this->getRandCode(); //$url='http://114.215.134.149/dashboard/project/TP/weixin.php?a=share'; $protocol = (!empty($_SERVER[HTTPS]) && $_SERVER[HTTPS] !== off || $_SERVER[SERVER_PORT] == 443) ? "https://" : "http://"; $url = $protocol.$_SERVER[HTTP_HOST].$_SERVER[REQUEST_URI]; var_dump($url); //获取signature $signature='jsapi_ticket='.$jsapi.'&noncestr='.$nonceStr.'×tamp='.$timestamp.'&url='.$url; $signature=sha1($signature); $this->assign('name','慕课'); $this->assign('timestamp',$timestamp); $this->assign('nonceStr',$nonceStr); $this->assign('signature',$signature); $this->display(); } public function http_curl($url,$type='get',$res='json',$arr=''){ //1.初始化curl $ch =curl_init(); //2.设置curl的参数 curl_setopt($ch,CURLOPT_URL,$url); curl_setopt($ch,CURLOPT_RETURNTRANSFER,1); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 跳过证书检查 curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); if($type == 'post'){ curl_setopt($ch,CURLOPT_POST,1); curl_setopt($ch,CURLOPT_POSTFIELDS,$arr); } //3.采集 $output =curl_exec($ch); echo (curl_error($ch)); //4.关闭 curl_close($ch); if($res=='json'){ if(curl_error($ch)){ //请求失败,返回错误信息 return curl_error($ch); }else{ //请求成功,返回错误信息 return json_decode($output,true); } } echo var_dump( $output ); } public function getWxAccessToken(){ //1.请求url地址 $appid = 'wxd1157c516b3578d8'; $appsecret = '26afef5b19e1ebfc3382604908460aa9'; $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=".$appid."&secret=".$appsecret; //2初始化 $ch = curl_init(); //3.设置参数 curl_setopt($ch , CURLOPT_URL, $url); curl_setopt($ch , CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 跳过证书检查 curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); //4.调用接口 $res = curl_exec($ch); //5.关闭curl echo $res ; curl_close( $ch ); if( curl_errno($ch) ){ var_dump( curl_error($ch) ); } $arr = json_decode($res, true); var_dump($arr["access_token"]); return $arr["access_token"]; } }
<!doctype html>//VIEW文件 <html> <head> <title>微信js分享接口</title> <meta name="viewpoint" content = "initial-scale=1.0;width=device-width"/> <meta http-equiv="content" content = "text/html;charset=utf-8"/> <script src="http://res.wx.qq.com/open/js/jweixin-1.0.0.js"></script> <uses-permission android:name="android.permission.INTERNET"/> </head> <body> <script> wx.config({ debug: true, appId: 'wxd1157c516b3578d8', // 必填,公众号的唯一标识 timestamp:'<{$timestamp}>' , // 必填,生成签名的时间戳 nonceStr: '<{$nonceStr}>', // 必填,生成签名的随机串 signature: '<{$signature}>',// 必填,签名,见附录1 jsApiList: [ "onMenuShareTimeline", "onMenuShareAppMessage" ] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2 }); wx.ready(function(){ //分享到朋友圈 alert(location.href.split('#')[0]); wx.onMenuShareTimeline({ title: 'test1', // 分享标题 link: 'http://www.baidu.com', // 分享链接 imgUrl: 'https://www.baidu.com/img/bd_logo1.png', // 分享图标 success: function () { // 用户确认分享后执行的回调函数 alert("success"); }, cancel: function () { // 用户取消分享后执行的回调函数 alert("cancle"); } }); //分享给朋友 wx.onMenuShareAppMessage({ title: 'test1', // 分享标题 desc: 'test xjy', // 分享描述 link: 'http://www.baidu.com', // 分享链接 imgUrl: 'https://www.baidu.com/img/bd_logo1.png', // 分享图标 type: 'link', // 分享类型,music、video或link,不填默认为link dataUrl: '', // 如果type是music或video,则要提供数据链接,默认为空 success: function () { // 用户确认分享后执行的回调函数 }, cancel: function () { // 用户取消分享后执行的回调函数 } }); }); wx.error(function(res){ // config信息验证失败会执行error函数,如签名过期导致验证失败,具体错误信息可以打开config的debug模式查看,也可以在返回的res参数中查看,对于SPA可以在这里更新签名。 alert("shibai"); }); </script> </body> </html>
模板输出的问题,
把TP中的模板标签改为<{}>,这样和老师的一样,通过设置 TMPL_L_DELIM 和 TMPL_R_DELIM 进行更改。在项目配置文件中定义: 'TMPL_L_DELIM'=>'<{', 'TMPL_R_DELIM'=>'}>'
也可以在html中输出的时候改为这样 {$timestamp},{$noncestr},{$signature}
我也遇到了同样的问题
前后分离的情况下。android,正常,ios却invalid signature
前端是vue, vue-router ,后端是koa.
这个url打印window.location.href时没有带#的。直接传给koa服务器去算。
android正常使用jsdk,
ios报:invalid signature
打印出两部机子的请求url都是一模一样,没有# http://xxxx.xxx.cn/kqdd/kq
config:invalid signature