PHP部分

扩展类代码部分:

<?php
namespace Think; class JsSdk {
private $appId;
private $appSecret;
public $debug = false; public function __construct($appId, $appSecret) {
$this->appId = $appId;
$this->appSecret = $appSecret;
} public function getSignPackage() {
$jsapiTicket = $this->getJsApiTicket();
$url = "http://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";
$timestamp = time();
$nonceStr = $this->createNonceStr(); // 这里参数的顺序要按照 key 值 ASCII 码升序排序
$string = "jsapi_ticket=$jsapiTicket&noncestr=$nonceStr&timestamp=$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 = ) {
$chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
$str = "";
for ($i = ; $i < $length; $i++) {
$str .= substr($chars, mt_rand(, strlen($chars) - ), );
}
return $str;
} private function getJsApiTicket() {
//debug模式
if ($this->debug) {
// jsapi_ticket 应该全局存储与更新,以下代码以写入到文件中做示例
$data = json_decode(file_get_contents("jsapi_ticket.json"));
} else {
//从cache中读取,基于ThinkPHP的缓存机制
$data = (object)(S('jsapi_ticket_json'));
} if ($data->expire_time < time()) {
$accessToken = $this->getAccessToken();
$url = "http://api.weixin.qq.com/cgi-bin/ticket/getticket?type=1&access_token=$accessToken";
$res = json_decode($this->httpGet($url));
$ticket = $res->ticket; if ($ticket) {
$data->expire_time = time() + ;
$data->jsapi_ticket = $ticket; //debug模式
if ($this->debug) {
$fp = fopen("jsapi_ticket.json", "w");
fwrite($fp, json_encode($data));
fclose($fp);
} else {
//将对象以数组的形式进行缓存
S('jsapi_ticket_json', (array)$data);
} }
} else {
$ticket = $data->jsapi_ticket;
} return $ticket;
} private function getAccessToken() { //debug模式
if ($this->debug) {
// access_token 应该全局存储与更新,以下代码以写入到文件中做示例
$data = json_decode(file_get_contents("access_token.json"));
dump($data);
die();
} else {
//从缓存中读取数组并转成对象
$data = (Object)(S('access_token.json'));
} if ($data->expire_time < time()) {
$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() + ;
$data->access_token = $access_token; //debug模式
if ($this->debug) {
$fp = fopen("access_token.json", "w");
fwrite($fp, json_encode($data));
fclose($fp);
} else {
//缓存数组
S('access_token.json', (array)$data);
} }
} 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, );
curl_setopt($curl, CURLOPT_URL, $url);
$res = curl_exec($curl);
//错误检测
$error = curl_error($curl);
curl_close($curl); //发生错误,抛出异常
if($error) throw new \Exception('请求发生错误(表检查是否在授权域名下访问):' . $error); return $res;
}
}

控制器部分代码:

public function reurnWeixinCode() {
$jssdk = new \Think\Jssdk(WX_GONGZHONGHAO_APPID, WX_GONGZHONGHAO_APPSECRET);
$signPackage = $jssdk->GetSignPackage();
return $signPackage;
}

Html部分

 <script type="text/javascript">
var imgUrl = "{$img_url}";
var link = "{$huodong_url}";
var descContent = '{$desc}'; var shareTitle = '{$title}';
var appid = '';
</script>
<script type="text/javascript" src="http://res.wx.qq.com/open/js/jweixin-1.0.0.js";></script>
<script type="text/javascript">
wx.config({
// debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,
可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
appId: '{$signPackage['appId']}', // 必填,公众号的唯一标识
timestamp: {$signPackage['timestamp']}, // 必填,生成签名的时间戳
nonceStr: '{$signPackage['nonceStr']}', // 必填,生成签名的随机串
signature: '{$signPackage['signature']}',// 必填,签名,见附录1
jsApiList: [
'onMenuShareTimeline',
'onMenuShareAppMessage',
'onMenuShareQQ',
'onMenuShareWeibo'
] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2
});
wx.ready(function(){ //朋友圈
wx.onMenuShareTimeline({
title: shareTitle,
link: link,
imgUrl: imgUrl,
trigger: function (res) {
// alert('用户点击并朋友圈');
},
success: function () {
// 用户确认分享后执行的回调函数
//alert('Timeline分享成功');
},
cancel: function () {
// 用户取消分享后执行的回调函数
// alert('您取消了分享Timeline');
}
});
wx.onMenuShareAppMessage({
title: shareTitle,
link: link,
desc: descContent,
imgUrl: imgUrl,
type: '', // 分享类型,music、video或link,不填默认为link
dataUrl: '', // 如果type是music或video,则要提供数据链接,默认为空
success: function () {
// alert('分享给朋友分享成功');
},
cancel: function () {
// alert('您取消了分享给朋友');
}
});
wx.onMenuShareQQ({
title: shareTitle,
desc: descContent,
link: link,
imgUrl: imgUrl, success: function () {
// alert('qq分享成功');
},
cancel: function () {
// alert('您取消了分享给qq');
}
});
wx.onMenuShareWeibo({
title: shareTitle,
desc: descContent,
link: link,
imgUrl: imgUrl,
success: function () {
// alert('weibo分享成功');
},
cancel: function () {
// alert('weibo取消');
}
});
// config信息验证后会执行ready方法,所有接口调用都必须在config接口获得结果之后,
config是一个客户端的异步操作,所以如果需要在页面加载时就调用相关接口,
则须把相关接口放在ready函数中调用来确保正确执行。对于用户触发时才调用的接口,
则可以直接调用,不需要放在ready函数中。
});
wx.error(function (res) {
// alert(res.errMsg);
});
</script>

关于微信分享到朋友圈(Thinkphp框架下实现)的更多相关文章

  1. UC和QQ两个主流浏览器 * 点击触发微信分享到朋友圈或发送给朋友的功能(转载)

    转载(声明:仅供学习使用) /** * 此插件主要作用是在UC和QQ两个主流浏览器 * 上面触发微信分享到朋友圈或发送给朋友的功能 * 代码编写过程中 参考: * http://mjs.sinaimg ...

  2. iOS - 社会化分享-微信分享,朋友圈分享

    我仅仅做了文字和图片分享功能 1. TARGETS - Info - URL Types identifier -> weixin URL Schemes ->  应用id 2.在AppD ...

  3. 关于微信分享到朋友圈(Thinkphp-tp3.2框架下实现)

    PHP部分 扩展类代码部分: <?php namespace Think; class JsSdk { private $appId; private $appSecret; public $d ...

  4. 在做微信分享到朋友圈时,手机扫码报config:invalid signature,分享后后正常的问题,是url问题

    是按照以下步骤检查的 除了ACCESS_TOKEN没有缓存其他都可以 如果是invalid signature签名错误.建议按如下顺序检查: 1.确认签名算法正确,可用 http://mp.weixi ...

  5. webapp项目vue框架点击按钮实现微信好友分享,朋友圈分享

    当时做这个这个效果真把人给*了,网上能搜到的基本是微信页面的分享,特征是方法是wx.**开头,不适用于app内.思路都是一样的,先调取服务(这里使用plus的内置方法),再发送分享请求 <tem ...

  6. golang-vue实现微信小程序分享到朋友圈

    最近涉及到微信小程序分享到朋友圈,不知道微信为什么不直接接口分享,咱也不敢佛,咱也不敢问,只能百度问度娘,看官方文档,网上的一些分享五花八门,每一个重点的,所以整理了一下到底怎样生成二维码分享图片才是 ...

  7. UC浏览器 分享到朋友圈和微信好友 分类: JavaScript 2015-04-28 14:45 615人阅读 评论(1) 收藏

    用手机UC浏览器访问新浪微博,会注意到有这样的两个分享按钮: 在手机端浏览器里,点击分享按钮,就可以启动微信客户端并分享到微信.研究了下其源代码,存在这样的一个js:http://mjs.sinaim ...

  8. 微信自定义分享到朋友圈API

    <script src="http://s0.qhimg.com/!249ce048/WeixinApi.js" type="text/javascript&quo ...

  9. UC浏览器 分享到朋友圈和微信好友

    用手机UC浏览器访问新浪微博,会注意到有这样的两个分享按钮: 在手机端浏览器里,点击分享按钮,就可以启动微信客户端并分享到微信.研究了下其源代码,存在这样的一个js:http://mjs.sinaim ...

随机推荐

  1. python 导入模块错误

    问题: 导入一些模块或者运行第三方软件的时候,会出现一下类似错误: ImportError: No module named future.utils 问题原因: 没有安装第三方库 future,这个 ...

  2. XML (二)

    1 SAX 在使用DOM解析XML文档的时候,需要读取整个XML文档,在内存中构架代表整个DOM树的Document对象,从而再对XML文档进行操作.此种情况下,如果XML文档特别大,就会消耗计算机的 ...

  3. 端口扫描命令nmap

    转:http://www.osyunwei.com/archives/2004.html 下面教大家在CentOS中用nmap查看主机端口: 一.安装nmap yum install nmap -y ...

  4. php之冒泡排序

    <?php//冒泡排序function shell_sort($arr){for($i=0;$i<count($arr)-1;$i++){for($j=0; $j< count($a ...

  5. java web 整合开发王者归来学习总结

    第一章java web开发概述 胖客户端CS,瘦客户端BS(Browser) 网址请求---服务器处理响应-----返回结果-----浏览器显示 CGI可以动态生成页面,但是每个进程都要启动一个CGI ...

  6. 【原创】源码角度分析Android的消息机制系列(二)——ThreadLocal的工作过程

    ι 版权声明:本文为博主原创文章,未经博主允许不得转载. 在上一篇文章中,我们已经提到了ThreadLocal,它并非线程,而是在线程中存储数据用的.数据存储以后,只能在指定的线程中获取到数据,对于其 ...

  7. Designing Data-Intensive Applications

    下面是这本书序言中的大部分内容,本人的英文水平有限,有理解不到位的地方还请大家指教,这算是自己对这本书的读书笔记和总结. 数据是当今系统设计中许多挑战的中心,一些难以解决的问题如系统的可扩展性,一致性 ...

  8. CentOS上安装MongoDB速记

    测试环境版本CentOS 6.5 先创建安装目标文件夹并进入至该文件夹: mkdir /opt/mongodb cd /opt/mongodb 给mongodb创建用户及用户组: groupadd m ...

  9. SpringMVC源码情操陶冶-InterceptorsBeanDefinitionParser拦截器解析器

    解析mvc:interceptors节点 观察下InterceptorsBeanDefinitionParser的源码备注 /** * {@link org.springframework.beans ...

  10. Java基础之Throwable,文件加载

    Java中的异常与错误都继承自Throwable,Exception又分为运行时异常(RuntimeException)和编译时异常. 运行时异常是程序的逻辑不够严谨或者特定条件下程序出现了错误,例如 ...