一、说明

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(分享给朋友)接口。

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论
立即
投稿

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部