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

时间:2022-10-24 17:02:04

一、说明

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.'&timestamp='.$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>