转载自
https://blog.csdn.net/zhangweiguangsunjiao/article/details/95622411
https://blog.csdn.net/weixin_30748995/article/details/98294137
tp3.2中
<script type="text/javascript" src="https://res.wx.qq.com/open/js/jweixin-1.2.0.js"></script>
<script src="__PUBLIC__/activity/js/jquery-1.11.3.js"></script>
<script src="__PUBLIC__/activity/js/common.js"></script>
<script src="__PUBLIC__/activity/js/jquery.SuperSlide.2.1.1.js">
<section class="fix-bottom">
<a href="{:U('Community/Menzhen/ecode')}" data-id="663439" id="J_addfav" title="关注我们"><i class="icon-gongzhonghao iconfont"></i><br>关注我们</a>
<a href="javascript:void(0);" data-wzid="{$id}" data-title="{$title}"data-suoshu="zj" id="shoucang" title="收藏"><i class="icon-shoucang iconfont"></i><br />收藏</a>
<a href="{:U('Report/Index/index',array('id'=>$id,'suoshu'=>tz))}"><i class="icon-jubao iconfont"></i><br />举报</a>
<a href="#"><i class="icon-fenxiang1 iconfont"></i><div class="-mob-share-ui-button -mob-share-open" style="display: block;padding:0;text-align:center;cursor:pointer;background: #fff;color:#333333;font-weight:100;">分享</div></a>
<!--MOB SHARE BEGIN-->
<!-- <div class="-mob-share-ui-button -mob-share-open">分享</div> -->
<div class="-mob-share-ui" style="display: none">
<ul class="-mob-share-list">
<li class="-mob-share-weixin fenxiang"><p>微信</p></li>
<li class="-mob-share-weibo fenxiang" ><p>新浪微博</p></li>
<li class="-mob-share-qzone fenxiang" ><p>QQ空间</p></li>
</ul>
<div class="-mob-share-close">取消</div>
</div>
<div class="-mob-share-ui-bg"></div>
<script id="-mob-share" src="http://f1.webshare.mob.com/code/mob-share.js?appkey=1eacbb2cc64e7"></script>
<!--MOB SHARE END-->
</section>
<script>
/*
* 注意:
* 1. 所有的JS接口只能在公众号绑定的域名下调用,公众号开发者需要先登录微信公众平台进入“公众号设置”的“功能设置”里填写“JS接口安全域名”。
* 2. 如果发现在 Android 不能分享自定义内容,请到官网下载最新的包覆盖安装,Android 自定义分享接口需升级至 6.0.2.58 版本及以上。
* 3. 常见问题及完整 JS-SDK 文档地址:http://mp.weixin.qq.com/wiki/7/aaa137b55fb2e0456bf8dd9148dd613f.html
*
* 开发中遇到问题详见文档“附录5-常见错误及解决办法”解决,如仍未能解决可通过以下渠道反馈:
* 邮箱地址:weixin-open@qq.com
* 邮件主题:【微信JS-SDK反馈】具体问题
* 邮件内容说明:用简明的语言描述问题所在,并交代清楚遇到该问题的场景,可附上截屏图片,微信团队会尽快处理你的反馈。
*/
wx.config({
debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
appId: '{$appid}', // 必填,公众号的唯一标识
timestamp: '{$timestamp}', // 必填,生成签名的时间戳
nonceStr: '{$noncestr}', // 必填,生成签名的随机串
signature: '{$signature}',// 必填,签名,见附录1
jsApiList: [
'onMenuShareTimeline',
'onMenuShareAppMessage',
'onMenuShareQQ',
'onMenuShareQZone',
'chooseImage',
'startRecord',
'scanQRCode'
] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2
});
wx.ready(function(){
// config信息验证后会执行ready方法,所有接口调用都必须在config接口获得结果之后,
// config是一个客户端的异步操作,所以如果需要在页面加载时就调用相关接口,则须把相关接口放在ready函数中调用来确保正确执行。
// 对于用户触发时才调用的接口,则可以直接调用,不需要放在ready函数中。
var tk='{$appid}';
//分享至朋友圈
wx.onMenuShareTimeline({
title: '{$title}', // 分享标题
link: '{$url}', // 分享链接
imgUrl: 'https://www.hswhcy.com/public/images/logo.png', // 分享图标
success: function () {
// 用户确认分享后执行的回调函数
$.post("{:U('User/Public/share')}",{token:tk,},function(result){
swal({
title: "分享成功",
text: "1秒后自动关闭。",
timer: 1500,
showConfirmButton: false
});
});
},
cancel: function () {
// 用户取消分享后执行的回调函数
swal({
title: "您已取消分享",
text: "1秒后自动关闭。",
timer: 1500,
showConfirmButton: false
});
}
});
wx.onMenuShareAppMessage({
title: '{$title}', // 分享标题
desc: '{$miaoshu}', // 分享描述
link: '{$url}', // 分享链接
imgUrl: 'http://www.hswhcy.com/public/images/logo.png', // 分享图标
type: 'link', // 分享类型,music、video或link,不填默认为link
dataUrl: '', // 如果type是music或video,则要提供数据链接,默认为空
success: function () {
// 用户确认分享后执行的回调函数
$.post("{:U('User/Public/share')}",{token:tk,},function(result){
swal({
title: "分享成功",
text: "1秒后自动关闭。",
timer: 1500,
showConfirmButton: false
});
});
},
cancel: function () {
// 用户取消分享后执行的回调函数
swal({
title: "您已取消分享",
text: "1秒后自动关闭。",
timer: 1500,
showConfirmButton: false
});
}
});
//分享到QQ好友
wx.onMenuShareQQ({
title: '{$title}', // 分享标题
desc: '{$miaoshu}', // 分享描述
link: '{$url}', // 分享链接
imgUrl: 'http://www.hswhcy.com/public/images/logo.png', // 分享图标
success: function () {
$.post("{:U('User/Public/share')}",{token:tk,},function(result){
swal({
title: "分享成功",
text: "1秒后自动关闭。",
timer: 1500,
showConfirmButton: false
});
});
},
cancel: function () {
swal({
title: "您已取消分享",
text: "1秒后自动关闭。",
timer: 1500,
showConfirmButton: false
});
}
});
//分享到QQ空间
wx.onMenuShareQZone({
title: '{$title}', // 分享标题
desc: '{$miaoshu}', // 分享描述
link: '{$url}', // 分享链接
imgUrl: 'http://www.hswhcy.com/public/images/logo.png', // 分享图标
success: function () {
$.post("{:U('User/Public/share')}",{token:tk,},function(result){
swal({
title: "分享成功",
text: "1秒后自动关闭。",
timer: 1500,
showConfirmButton: false
});
});
// 用户确认分享后执行的回调函数
},
cancel: function () {
// 用户取消分享后执行的回调函数
swal({
title: "您已取消分享",
text: "1秒后自动关闭。",
timer: 1500,
showConfirmButton: false
});
}
});
});
//拍照或从手机相册中选图接口
function show()
{
wx.chooseImage({
count: 1, // 默认9
sizeType: ['original', 'compressed'], // 可以指定是原图还是压缩图,默认二者都有
sourceType: ['album', 'camera'], // 可以指定来源是相册还是相机,默认二者都有
success: function (res) {
var localIds = res.localIds; // 返回选定照片的本地ID列表,localId可以作为img标签的src属性显示图片
alert(localIds);
}
});
}
//开始录音
function startRecord(){
wx.startRecord();
};
//扫码
function scan()
{
wx.scanQRCode({
needResult: 1, // 默认为0,扫描结果由微信处理,1则直接返回扫描结果,
scanType: ["qrCode","barCode"], // 可以指定扫二维码还是一维码,默认二者都有
success: function (res) {
var result = res.resultStr; // 当needResult 为 1 时,扫码返回的结果
}
});
}
wx.error(function(res){
// config信息验证失败会执行error函数,如签名过期导致验证失败,具体错误信息可以打开config的debug模式查看,也可以在返回的res参数中查看,对于SPA可以在这里更新签名。
});
</script>
控制器中
public function index() {
$keyword=I('request.keyword');
$shaixuan=I('get.shaixuan');
$share = new \Common\Controller\BaseController;
$share->shareWx();
$this->assign('post',$data);
$this->assign("formget",array_merge($_GET,$_POST));
$this -> display();
}
下面是调用的方法
public function shareWx()
{
//1、获取jsapi_ticket票据
$appid='wx......';
$jsapi_ticket = $this -> getJsApiTicket();
//2、获取timestamp
$timestamp = time();
//3、获取noncestr
$noncestr = $this -> getNoncestr();
// 注意 URL 一定要动态获取,不能 hardcode.
$protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' || $_SERVER['SERVER_PORT'] == 443) ? "https://" : "http://";
$url = "$protocol$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";
//3、获取signature 并sha1加密
$signature = "jsapi_ticket=".$jsapi_ticket."&noncestr=".$noncestr."×tamp=".$timestamp."&url=".$url;
$signature = sha1($signature);
$this -> assign('appid',$appid);
$this -> assign('url',$url);
$this -> assign('timestamp',$timestamp);
$this -> assign('noncestr',$noncestr);
$this -> assign('signature',$signature);
// $this -> display('share');
}
下面是上面方法调用的方法
//获取jsapi_ticket全局票据
private function getJsApiTicket()
{
//将jsapi_ticket存于memcache/session/cookie中
$jsapi_ticket = session('jsapi_ticket');
$ticket_expire_time = session('ticket_expire_time');
if($jsapi_ticket && $ticket_expire_time > time())
{
//如果jsapi_ticket存在,并且没有过期
return $jsapi_ticket;
} else
{
//如果jsapi_ticket不存在或者过期,重新获取jsapi_ticket
$access_token = $this ->getWxAccessToken();
$url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=".$access_token."&type=jsapi";
$res = $this -> http_curl($url, 'get', 'json');
$jsapi_ticket = $res['ticket'];
//将新的access_token存储到session中
session('jsapi_ticket',$jsapi_ticket);
session('ticket_expire_time',time() + 7000);
return $jsapi_ticket;
}
}
//获取16位随机字符串
private function getNoncestr($num = 16)
{
$array = array('1','2','3','4','5','6','7','8','9','0','q','w','e','r','t','y','u',
'i','o','p','a','s','d','f','g','h','h','j','k','l','z','x','c','v','b','n','m',
'Q','W','E','R', 'T','Y','U','I','O','P','A','S','D','F','G','H','J','K','L','Z',
'X','C','V','B', 'N','M');
$tmpstr = "";
$max = count($array);
for($i = 1; $i <= $num; $i ++)
{
$key = rand(0,$max - 1);
$tmpstr .= $array[$key];
}
return $tmpstr;
}