一、说明
1、本文主要是分享接口的实现和选择相册以及扫一扫的实现
2、参考慕课视频:https://www.imooc.com/video/11353
3、参考手册:
https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141115
4、微信分享JS接口目前已失效,以前可以自定义分享的标题、描述、图片、链接地址在微信6.0.2版本中失效:
http://www.cnblogs.com/txw1958/p/4197951.html
二、controller代码
<?php
namespace Weixin\Controller;
use Think\Controller;
class IndexController extends Controller{
/* *$url 接口url string *$type 请求类型 string *$res 返回数据类型 string *%$arr post 请求参数 string */
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);
if($type == 'post'){
curl_setopt($ch, CURLOPT_POST,1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $arr);
}
//3.采集
$output = curl_exec($ch);
//4.关闭
curl_close($ch);
if($res=='json'){
if(curl_error($ch)){
//请求失败,返回错误信息
return curl_error($ch);
}else{
//请求成功,返回错误信息
return json_decode($output,true);
}
}
}
/* *返回access_token *session解决办法 存mysql memcache */
public function getWxAccessToken(){
//将access_token 存在session/cookie中
if($_SESSION['access_token'] && $_SESSION['expire_time'] > time()){
//如果access_token在session中没有过期
return $_SESSION['access_token'];
}else{
//如果access_token在session中不存在或者已经过期
$appid = 'wxb20bebb764546087';
$appsecret = '64e22d215895d52af21c8fcbf6da3241';
$url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=".$appid."&secret=".$appsecret;
$res = $this->http_curl($url,'get','json');
$access_token = $res['access_token'];
//将重新获取到的access_token存到session中
$_SESSION['access_token'] = $access_token;
$_SESSION['erpire_time'] = time() + 7000;
return $access_token;
}
}
//获取jsapi_ticket全局票据
function getJsApiTicket(){
//如果session中保存有效的jsapi_ticket
if($_SESSION['jsapi_ticket_expire_time'] > time() && $_SESSION['jsapi_ticket']){
$jsapi_ticket = $_SESSION['jsapi_ticket'];
}else{
$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);
$jsapi_ticket = $res['ticket'];
$_SESSION['jsapi_ticket'] = $jsapi_ticket;
$_SESSION['jsapi_ticket_expire_time'] = time()+7000;
}
return $jsapi_ticket;
}
//获取随机码
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','v','z',
'1','2','3','4','5','6','7','8','9','0',
);
$tmpstr='';
$max = count($array);
for($i=1; $i<=$num; $i++){
$key = rand(0,$max-1); //'A' -> $array[0]
$tmpstr .= $array[$key];
}
return $tmpstr;
}
//
function shareWx(){
//1.获取jsapi_ticket票据
$jsapi_ticket = $this->getJsApiTicket();
echo $jsapi_ticket;
echo '<br>';
$timestamp = time();
//echo '<br>';
$noncestr = $this->getRandCode();
//echo '<br>';
//$url = 'http://www.cxf001.top/weixin.php/index/sharewx';
//动态获取url
$protocol = (!empty($_SERVER[HTTPS]) && $_SERVER[HTTPS] !== off || $_SERVER[SERVER_PORT] == 443) ? "https://" : "http://";
$url = $protocol.$_SERVER[HTTP_HOST].$_SERVER[REQUEST_URI];
echo $url;
//echo '<br>';
//2.获取signature
$signature = 'jsapi_ticket='.$jsapi_ticket.'&noncestr='.$noncestr.'×tamp='.$timestamp.'&url='.$url;
//echo '<br>';
$signature = sha1($signature);
$this -> assign('name','慕课');
$this -> assign('timestamp',$timestamp);
$this -> assign('noncestr',$noncestr);
$this -> assign('signature',$signature);
$this -> display('Index/share');
}
}//class end
三、share.html代码
<!DOCTYPE html>
<html lang="en">
<head>
<title>微信js分享接口</title>
<meta charset="utf-8">
<meta name="viewpoint" content="initial-scale=1.0;width=device-width" />
<script src="http://res.wx.qq.com/open/js/jweixin-1.2.0.js"></script>
</head>
<body>
{$name}
<script> alert(location.href.split('#')[0]); console.log(location.href.split('#')[0]) wx.config({ debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。 appId: 'wxb20bebb764546087', // 必填,公众号的唯一标识 timestamp: '{$timestamp}', // 必填,生成签名的时间戳 nonceStr: '{$noncestr}', // 必填,生成签名的随机串 signature: '{$signature}',// 必填,签名 jsApiList: [ 'onMenuShareTimeline', 'onMenuShareAppMessage', 'chooseImage', 'scanQRCode' ] // 必填,需要使用的JS接口列表 }); wx.ready(function(){ wx.onMenuShareTimeline({ title: 'test1', // 分享标题 link: 'http://www.cxf001.com', // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致 imgUrl: 'https://www.baidu.com/img/bd_logo1.png?where=super', // 分享图标 success: function () { // 用户点击了分享后执行的回调函数 }, cancel: function () { // 用户点击了取消分享后执行的回调函数 } }); wx.onMenuShareAppMessage({ title: 'test2', // 分享标题 desc: 'test imooc', // 分享描述 link: 'http://www.baidu,com', // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致 imgUrl: 'https://www.baidu.com/img/bd_logo1.png?where=super', // 分享图标 type: 'link', // 分享类型,music、video或link,不填默认为link dataUrl: '', // 如果type是music或video,则要提供数据链接,默认为空 success: function () { alert('分享成功'); // 用户点击了分享后执行的回调函数 } }); }); function showImg(){ wx.chooseImage({ count: 1, // 默认9 sizeType: ['original', 'compressed'], // 可以指定是原图还是压缩图,默认二者都有 sourceType: ['album', 'camera'], // 可以指定来源是相册还是相机,默认二者都有 success: function (res) { var localIds = res.localIds; // 返回选定照片的本地ID列表,localId可以作为img标签的src属性显示图片 } }); } function scan(){ wx.scanQRCode({ needResult: 0, // 默认为0,扫描结果由微信处理,1则直接返回扫描结果, scanType: ["qrCode","barCode"], // 可以指定扫二维码还是一维码,默认二者都有 success: function (res) { var result = res.resultStr; // 当needResult 为 1 时,扫码返回的结果 } }); } wx.error(function(res){ }); </script>
<button onclick='showImg();'>img</button>
<button onclick='scan();'>scan</button>
</body>
</html>