静态页实现微信页面的分享
来源:互联网 发布:淘宝代购是真货么 编辑:程序博客网 时间:2024/06/05 15:23
网上看了许多静态页面分享,大多数都有很大的问题,那就是签名不正确 invalid signature,总结了一下,基本问题都是PHP里的string里面不对,string要这么写
$string = "jsapi_ticket=$jsapiTicket&noncestr=$nonceStr×tamp=$timestamp&url=$url";
还有script获取的地址一定是要转码过的,不带#的,下面这段话是微信官方给的
- 确保你获取用来签名的url是动态获取的,动态页面可参见实例代码中php的实现方式。如果是html的静态页面在前端通过ajax将url传到后台签名,前端需要用js获取当前页面除去'#'hash部分的链接(可用location.href.split('#')[0]获取,而且需要encodeURIComponent),因为页面一旦分享,微信客户端会在你的链接末尾加入其它参数,如果不是动态获取当前链接,将导致分享后的页面签名失败。
下面是PHP代码:(更改倒数第六行的两个参数,APPID和APPSECRET)
<?php $url = $_GET['url']; class JSSDK { private $appId; private $appSecret; private $url; public function __construct($appId, $appSecret,$url) { $this->appId = $appId; $this->appSecret = $appSecret; $this->url = $url; } public function getSignPackage() { $jsapiTicket = $this->getJsApiTicket(); $protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' || $_SERVER['SERVER_PORT'] == 443) ? "https://" : "http://"; // $url = "$protocol$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]"; $url =$this->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, "signature" => $signature, "rawString" => $string ); 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; } private function getJsApiTicket() { // jsapi_ticket 应该全局存储与更新,以下代码以写入到文件中做示例 $data = json_decode(file_get_contents("jsapi_ticket.json")); if ($data->expire_time < time()) { $accessToken = $this->getAccessToken(); // 如果是企业号用以下 URL 获取 ticket // $url = "https://qyapi.weixin.qq.com/cgi-bin/get_jsapi_ticket?access_token=$accessToken"; $url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?type=jsapi&access_token=$accessToken"; $res = json_decode($this->httpGet($url)); $ticket = $res->ticket; if ($ticket) { $data->expire_time = time() + 7000; $data->jsapi_ticket = $ticket; $fp = fopen("jsapi_ticket.json", "w"); fwrite($fp, json_encode($data)); fclose($fp); } } else { $ticket = $data->jsapi_ticket; } return $ticket; } private function getAccessToken() { // access_token 应该全局存储与更新,以下代码以写入到文件中做示例 $data = json_decode(file_get_contents("access_token.json")); if ($data->expire_time < time()) { // 如果是企业号用以下URL获取access_token // $url = "https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=$this->appId&corpsecret=$this->appSecret"; $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=$this->appId&secret=$this->appSecret"; $res = json_decode($this->httpGet($url)); $access_token = $res->access_token; if ($access_token) { $data->expire_time = time() + 7000; $data->access_token = $access_token; $fp = fopen("access_token.json", "w"); fwrite($fp, json_encode($data)); fclose($fp); } } else { $access_token = $data->access_token; } return $access_token; } private function httpGet($url) { $curl = curl_init(); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); curl_setopt($curl, CURLOPT_TIMEOUT, 500); curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($curl, CURLOPT_URL, $url); $res = curl_exec($curl); curl_close($curl); return $res; } } $jssdk = new JSSDK("APPID", "APPSECRET",$url);//按照自己的公众号填写 $signPackage = $jssdk->GetSignPackage(); // var_dump($signPackage);$tmp=json_encode(array ('appId'=>$signPackage["appId"],'timestamp'=>$signPackage["timestamp"],'nonceStr'=>$signPackage["nonceStr"],'signature'=>$signPackage["signature"],'url'=>$signPackage["url"])); $callback = $_GET['callback']; echo $callback.'('.$tmp.')'; exit; ?>
<script src="http://res.wx.qq.com/open/js/jweixin-1.0.0.js"></script> <script> url = location.href.split('#')[0];url = encodeURIComponent(url); $.ajax({ type : "get", url : "http://xxxxx.com/jssdk.php?url="+url,//替换网址,xxx根据自己jssdk文件位置修改 dataType : "jsonp", jsonp: "callback", jsonpCallback:"success_jsonpCallback", success : function(data){ wx.config({ debug:false, appId: data.appId, timestamp: data.timestamp, nonceStr: data.nonceStr, signature: data.signature, jsApiList: [ "onMenuShareTimeline", //分享给好友 "onMenuShareAppMessage", //分享到朋友圈 "onMenuShareQQ", //分享到QQ "onMenuShareWeibo" //分享到微博 ] }); }, error:function(data){ alert("连接失败!"); } }); wx.ready(function (){ var shareData = { title: '更换标题', desc: '更换内容',//这里请特别注意是要去除html link: '更换链接', imgUrl: '更换图片' }; wx.onMenuShareAppMessage(shareData); wx.onMenuShareTimeline(shareData); wx.onMenuShareQQ(shareData); wx.onMenuShareWeibo(shareData); }); </script> </html>
0 0
- 静态页实现微信页面的分享
- 静态页面实现微信分享
- html静态页面实现微信分享思路
- html静态页面实现微信分享思路
- 微信分享链接title,图片的实现(多页面)
- 页面静态化的实现实例分享
- 静态html利用ajax实现微信jssdk分享
- html(h5)页面实现微信js分享
- 微信服务号页面实现分享操作流程
- 微信 页面分享功能
- 微信分享页面配置
- 微信分享功能的实现
- vue 微信分享的实现
- 微信分享的代码实现
- H5活动页面遇到的坑+微信分享代码
- 关于微信公众号安卓的静态页面缓存问题
- vue微信分享(在当前页面分享其他页面)
- Android微信实现分享
- APP中https证书有效性验证引发安全问题(例Fiddler可抓https包)
- nyoj120校园网络_强连通问题
- activemq的消息持久化存储
- 钢琴练习的基本步骤
- 学习搭建ssh
- 静态页实现微信页面的分享
- linux设备上的Onvif 实现3 :gSOAP嵌入式linux下的移植与程序开发
- CodeForces 735 B.Urbanization(贪心)
- BZOJ1030: [JSOI2007]文本生成器
- TCP/IP协议分层详解
- 2017年微商行业八大趋势
- 关于iOS原生和react-native的交互
- JAVA集合框架——线性表
- CodeForces