thinkphp后端 微信朋友圈分享

2017-09-13 16:20:56

<?php
class JSSDKAction extends Action {
    public function _initialize(){
        define('APP_ID','xxxxxxxxxxxxxxxx');
        define('APP_SEC','xxxxxxxxxxxxxxxxxxxxxxxx');
    }

    public function deal(){
        if(!empty($_POST['curl'])){
            $url = $_POST['curl'];
            $wx_token = $this->getAccessToken(APP_ID,APP_SEC); //获取ac_token  (生存时间7200  , 获取后需设置缓存)
            $ticket =  $this->getTicket($wx_token); // 使用token 获取JsApiTicket(调用微信临时票据;生存时间7200  , 获取后需设置缓存)
            $signPackage = $this->getSignPackage($url, $ticket['ticket'], APP_ID);//获取JSSDK签名信息 ,通过config接口注入权限验证配置
            echo json_encode($signPackage);
        }
    }
    /**
     * 获取微信基础AccessToken
     * @param type $getNewToken 是否强制刷新
     * @return type
     */
    public function getAccessToken($appid,$appsecret) {
        $key = 'AccessToken_' . $appid . '_' . $appsecret;
        $wx_token = '';
        $accessToken = $this->getWxAccessToken( $appid, $appsecret);
        $wx_token = $accessToken['access_token'];
        return $wx_token;
    }



    /**
     * 获取基础AccessToken
     * @param type $appid
     * @param type $appSecret
     * @param type $type
     * @return type
     */
    public function getWxAccessToken($appid, $appSecret, $type = 'client_credential') {
        $url = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=' . $type . '&appid=' . $appid . '&secret=' . $appSecret;
        $data = $this->http($url,null ,'GET');
        $json = json_decode($data, true);
        return $json;
    }

    /**
     * 获取调用微信临时票据
     * @param type $access_token 全局唯一票据
     * @param type $type
     * @return type
     */
    public function getTicket($access_token, $type = 'jsapi') {
        $url = 'https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=' . $access_token . '&type=' . $type;
        $result = $this->http($url);
        $json = json_decode($result, true);
        return $json;
    }

    /**
     * 获取JSSDK签名信息
     * @param type $url
     * @param type $ticket
     * @return type
     */
    public function getSignPackage($url, $ticket ,$appId) {
        $timestamp = time();
        $nonceStr = $this->getNonceStr();
        // 这里参数的顺序要按照 key 值 ASCII 码升序排序
        $string = "jsapi_ticket=$ticket&noncestr=$nonceStr&timestamp=$timestamp&url=$url";
        $signature = sha1($string);
        $signPackage = array(
            'appId' => $appId,
            'nonceStr' => $nonceStr,
            'timestamp' => $timestamp,
            'url' => $url,
            'signature' => $signature,
        );
        return $signPackage;
    }

    public function getNonceStr($length = 16) {
        $chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
        $str = '';
        for ($i = 0; $i < $length; $i++) {
            $str .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);
        }
        return $str;
    }



    public function http($url, $param = null, $method = 'POST') {
        try {
            $opts = array(
                CURLOPT_TIMEOUT => 30,
                CURLOPT_RETURNTRANSFER => 1,
                CURLOPT_SSL_VERIFYPEER => false,
                CURLOPT_SSL_VERIFYHOST => false,
            );
            /* 根据请求类型设置特定参数 */
            $opts[CURLOPT_URL] = $url;
            if (strtoupper($method) == 'POST' && !is_null($param)) {
                $opts[CURLOPT_POST] = 1;
                $opts[CURLOPT_POSTFIELDS] = $param;
                if (is_string($param)) { //发送JSON数据
                    $opts[CURLOPT_HTTPHEADER] = array(
                        'Content-Type: application/json; charset=utf-8',
                        'Content-Length: ' . strlen($param),
                    );
                }
            }
            /* 初始化并执行curl请求 */
            $ch = curl_init();
            curl_setopt_array($ch, $opts);
            $data = curl_exec($ch);
            $error = curl_error($ch);
            curl_close($ch);
            if ($error) {//发生错误
                //throw new \Exception('请求发生错误:' . $error);
                $data = array('errcode' => -1, 'errmsg' => $error);
            }
        } catch (\Exception $ex) {
            $data = array('errcode' => -1, 'errmsg' => $ex->getMessage());
        }
        return $data;
    }
}


前台

var curl = location.href;
    $.post("{:U('JSSDK/deal')}",{"curl":curl},function(data){

        var info = eval("("+data+")");

        wx.config({
            debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
            appId: info.appId, // 必填,公众号的唯一标识
            timestamp: info.timestamp, // 必填,生成签名的时间戳
            nonceStr: info.nonceStr, // 必填,生成签名的随机串
            signature: info.signature,// 必填,签名,见附录1
            jsApiList: ['onMenuShareTimeline'] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2
        });

        wx.ready(function(){
            wx.onMenuShareTimeline({
                title: '明日学院发现作品', // 分享标题
                link: curl, // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致
                imgUrl: '{:UPLOAD_SERVER}{$info.cover}', // 分享图标
                success: function () {
                    // 用户确认分享后执行的回调函数
                },
                cancel: function () {
                    // 用户取消分享后执行的回调函数
                }
            });
        });
    });
点赞

发表回复

电子邮件地址不会被公开。必填项已用 * 标注