PHP微信公众平台开发高级篇—微信JS-SDK(分享接口)

一、说明

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代码


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 '
'
; $timestamp = time(); //echo '
';
$noncestr = $this->getRandCode(); //echo '
';
//$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 '
';
//2.获取signature $signature = 'jsapi_ticket='.$jsapi_ticket.'&noncestr='.$noncestr.'×tamp='.$timestamp.'&url='.$url; //echo '
';
$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代码


<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();'>imgbutton>
        <button onclick='scan();'>scanbutton>
    body>
html>

你可能感兴趣的:(微信公众号开发)