关于微信分享到朋友圈(Thinkphp框架下实现)
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×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 = ) {
$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框架下实现)的更多相关文章
- UC和QQ两个主流浏览器 * 点击触发微信分享到朋友圈或发送给朋友的功能(转载)
转载(声明:仅供学习使用) /** * 此插件主要作用是在UC和QQ两个主流浏览器 * 上面触发微信分享到朋友圈或发送给朋友的功能 * 代码编写过程中 参考: * http://mjs.sinaimg ...
- iOS - 社会化分享-微信分享,朋友圈分享
我仅仅做了文字和图片分享功能 1. TARGETS - Info - URL Types identifier -> weixin URL Schemes -> 应用id 2.在AppD ...
- 关于微信分享到朋友圈(Thinkphp-tp3.2框架下实现)
PHP部分 扩展类代码部分: <?php namespace Think; class JsSdk { private $appId; private $appSecret; public $d ...
- 在做微信分享到朋友圈时,手机扫码报config:invalid signature,分享后后正常的问题,是url问题
是按照以下步骤检查的 除了ACCESS_TOKEN没有缓存其他都可以 如果是invalid signature签名错误.建议按如下顺序检查: 1.确认签名算法正确,可用 http://mp.weixi ...
- webapp项目vue框架点击按钮实现微信好友分享,朋友圈分享
当时做这个这个效果真把人给*了,网上能搜到的基本是微信页面的分享,特征是方法是wx.**开头,不适用于app内.思路都是一样的,先调取服务(这里使用plus的内置方法),再发送分享请求 <tem ...
- golang-vue实现微信小程序分享到朋友圈
最近涉及到微信小程序分享到朋友圈,不知道微信为什么不直接接口分享,咱也不敢佛,咱也不敢问,只能百度问度娘,看官方文档,网上的一些分享五花八门,每一个重点的,所以整理了一下到底怎样生成二维码分享图片才是 ...
- UC浏览器 分享到朋友圈和微信好友 分类: JavaScript 2015-04-28 14:45 615人阅读 评论(1) 收藏
用手机UC浏览器访问新浪微博,会注意到有这样的两个分享按钮: 在手机端浏览器里,点击分享按钮,就可以启动微信客户端并分享到微信.研究了下其源代码,存在这样的一个js:http://mjs.sinaim ...
- 微信自定义分享到朋友圈API
<script src="http://s0.qhimg.com/!249ce048/WeixinApi.js" type="text/javascript&quo ...
- UC浏览器 分享到朋友圈和微信好友
用手机UC浏览器访问新浪微博,会注意到有这样的两个分享按钮: 在手机端浏览器里,点击分享按钮,就可以启动微信客户端并分享到微信.研究了下其源代码,存在这样的一个js:http://mjs.sinaim ...
随机推荐
- apache日志管理【转】
web服务器日志轮循比较好的方式有三种:第一种方法是利用Linux系统自身的日志文件轮循机制:logrotate:第二种方法是利用apache自带的日志轮循程序rotatelogs:第三种是使用在ap ...
- php 在foreach中循环数组的时候添加元素的属性
foreach($arr as $k => &$v){ //注意,由于上面遍历的时候写了地址传值符&, //所以下面可以直接给$v 赋值;如果不写&符号,下面这样写是没有 ...
- getRequestDispatcher()和response.sendRedirect()
request.getRequestDispatcher()是请求转发,前后页面共享一个request response.sendRedirect()是重新定向,前后页面不是一个request.
- SQL查询系列1---
1.查询关系为夫妻,年龄相加大于60的信息 表1 信息表 info id 编号 sex 性别 0-女,1-男 age 年龄 表2 关系表 rel id1 编号1 外键 id2 编号2 外键 r ...
- Struts2实现文件上传和下载,多文件上传,限制文件大小,限制文件类型
文件上传使用的包:commons-upload-xx.jar commons-io-xx.jar 一.实现文件上传: 1.在表单空间中添 ...
- jmeter用Firefox录制https协议证书问题解决
录制脚本的时候,比如录制https协议的百度网站 https://www.baidu.com ,所有录制设置均正常,但是在jmeter录制控制器里面就是没有任何录制的请求. 这个时候提示说证书不对 1 ...
- Django中不返回QuerySets的API -- Django从入门到精通系列教程
该系列教程系个人原创,并完整发布在个人官网刘江的博客和教程 所有转载本文者,需在顶部显著位置注明原作者及www.liujiangblog.com官网地址. Python及Django学习QQ群:453 ...
- C#基础(二)--之数据类型
在第一章我们了解了C#的输入.输出语句后,我这一节主要是介绍C#的基础知识,本节的内容也是后续章节的基础,好的开端等于成功的一半.在你阅读完本章后,你就有足够的C#知识编写简单的程序了.但还不能使用继 ...
- Asp.net mvc 下载文件
前言 最近有需求需要下载文件,可能是image的图片,也可能是pdf报告,也可能是微软的word或者excel文件. 这里就整理了asp.net mvc 和asp.net webapi 下载的方法 A ...
- [搬运] DotNetAnywhere:可供选择的 .NET 运行时
原文 : DotNetAnywhere: An Alternative .NET Runtime 作者 : Matt Warren 译者 : 张很水 我最近在收听一个名为DotNetRock 的优质播 ...