一、说明
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['expire_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','y','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);
$tmpstr .= $array[$key];
}
return $tmpstr;
}
//分享页面
function shareWx(){
//1.获取jsapi_ticket票据
$jsapi_ticket = $this->getJsApiTicket();
$timestamp = time();
$noncestr = $this->getRandCode();
//动态获取当前页面URL
$protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' || $_SERVER['SERVER_PORT'] == 443) ? "https://" : "http://";
$url = $protocol.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
//2.获取signature
$signature = 'jsapi_ticket='.$jsapi_ticket.'&noncestr='.$noncestr.'×tamp='.$timestamp.'&url='.$url;
$signature = sha1($signature);
$this -> assign('name','慕课');
$this -> assign('timestamp',$timestamp);
$this -> assign('noncestr',$noncestr);
$this -> assign('signature',$signature);
$this -> display('Index/share');
}
}
三、share.html前端代码
<!DOCTYPE html>
<html lang="en">
<head>
<title>微信js分享接口</title>
<meta charset="utf-8">
<meta name="viewport" content="initial-scale=1.0,width=device-width" />
[removed][removed]
</head>
<body>
[removed]
wx.config({
debug: true, // 开启调试模式
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', // 分享链接
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', // 分享链接
imgUrl: 'https://www.baidu.com/img/bd_logo1.png?where=super', // 分享图标
type: '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列表
}
});
}
//扫一扫函数
function scan(){
wx.scanQRCode({
needResult: 0, // 默认为0,扫描结果由微信处理
scanType: ["qrCode","barCode"], // 扫二维码还是一维码
success: function (res) {
var result = res.resultStr; // 扫码返回的结果
}
});
}
wx.error(function(res){
// config信息验证失败会执行error函数
});
[removed]
<button onclick='showImg();'>选择图片</button>
<button onclick='scan();'>扫一扫</button>
</body>
</html>
四、开发步骤总结
第一步:绑定域名
先登录微信公众平台进入"公众号设置"的"功能设置"里填写"JS接口安全域名"。注意:域名不能包含http://,只需填写纯域名。
第二步:引入JS文件
在需要调用JS接口的页面引入微信JS文件:
[removed][removed]
第三步:通过config接口注入权限验证配置
所有需要使用JS-SDK的页面必须先注入配置信息,否则将无法调用。配置信息需要从后端获取signature、nonceStr、timestamp等参数。
第四步:通过ready接口处理成功验证
config信息验证后会执行ready方法,所有接口调用都必须在config接口获得结果之后。
五、核心流程说明
1. 获取access_token:通过appid和appsecret调用微信接口获取全局access_token,有效期7200秒,建议缓存存储。
2. 获取jsapi_ticket:使用access_token换取jsapi_ticket,这是调用JS-SDK的临时票据,同样需要缓存。
3. 生成签名signature:将jsapi_ticket、noncestr、timestamp、url按特定格式拼接后做sha1加密。
4. 前端配置wx.config:将获取到的配置参数传入wx.config进行权限验证。
5. 调用分享接口:在wx.ready回调中调用onMenuShareTimeline(分享到朋友圈)和onMenuShareAppMessage(分享给朋友)接口。

发表评论 取消回复