热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

微信JS-SDK——微信分享给朋友

参考:微信JS-SDK文档其中包含有分享朋友圈、发送给朋友的js接口方法。(似乎不知道什么时候就会废弃)文档中有完整的步骤,麻烦的是第三步:通过config接口注入权限验证配置。其

    参考: 微信JS-SDK文档 其中包含有分享朋友圈、发送给朋友的js接口方法。(似乎不知道什么时候就会废弃)
    文档中有完整的步骤,麻烦的是第三步:通过config接口注入权限验证配置。其中需要获取 signature(签名) ,必须通过服务器端才行。

    本文主要是关于通过服务器获取签名的方法

  授权需要获取access_token,然后通过access_token取到jsapi_ticket再进行加密签名。

  微信公众号获取的access_token有两种:网页授权access_token、普通access_token,前者仅用于网页端请求用户授权,获取用户信息。后者则广泛用于微信各种接口。本文需要的就是后者:普通access_token。

  (另外备注一点:网页授权获取access_token是先获取到(用户同意授权之后的)code,再根据code获取access_token,而普通access_token直接通过appid、appsecret,请求一次就可获得)

       主要是获取access_token的,以后再用直接复制就行

php

class weixin{
    private $AppID = '';//自行填写
    private $AppSecret = '';//自行填写

    public $tokenFile = './wxtoken.txt';//保存token的文件,有效期2小时
    public $jsapiFile = './wxjsapi_ticket.txt';//保存 jsapi_ticket的文件,有限期2小时
    public $getTokenUrl = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET';
    public $getjsapiUrl = 'https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=ACCESS_TOKEN&type=jsapi';

    public function __construct(){
        $this->http_type = ((isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') || (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https')) ? 'https://' : 'http://';
    }

    public function index(){
      $action = isset($_GET['do']) ? $_GET['do'] : '';
      switch($action){
        case 'ApiJsSignature':
          $ret = $this->ApiJsSignature();//获取分享需要的签名等数据
          break;
        default:
          echo 'default';
          break;
      }
    }

    //用于微信分享到朋友圈或给朋友的参数
    public function ApiJsSignature(){
        $access_token = $this->get_access_token();
        $JsapiTicket = $this->get_jsapi_ticket($access_token);

        $signArr = array(
            'jsapi_ticket' => $JsapiTicket,
            'noncestr' => $this->str_rand(16),
            'timestamp' => time(),
            'url' => urldecode($_POST['jsapi_url'])
        );
        $signStr = 'jsapi_ticket='.$signArr['jsapi_ticket'].'&nOncestr='.$signArr['noncestr'].'×tamp='.$signArr['timestamp'].'&url='.$signArr['url'];
        //http_build_query()这个方法好像有问题,我使用之后返回的参数缺少字符

        $signArr['signature'] = sha1($signStr);
        $signArr['appid'] = $this->AppID;
        echo json_encode($signArr);
    }


    //第二步获取jsapi_ticket
    public function get_jsapi_ticket($access_token) {
        if(!file_exists($this->jsapiFile)) {
            $JsapiTicket = $this->resetJsapiTicket($access_token);
        }else{
            $fileContent=file_get_contents($this->jsapiFile);
            $ticketArr = json_decode($fileContent,true);
            if($ticketArr['expires_in'] <time()) {
                $JsapiTicket = $this->resetJsapiTicket($access_token);
            }else{
                $JsapiTicket = $ticketArr['ticket'];
            }
        }
        return $JsapiTicket;
    }
    public function resetJsapiTicket($access_token) {
        $url = str_replace('ACCESS_TOKEN', $access_token, $this->getjsapiUrl);

        $ticketJson = $this->curlPost($url);
        $ticketData = json_decode($ticketJson, true);

        $ticketData['expires_in'] = $ticketData['expires_in']+time();
        file_put_contents($this->jsapiFile, json_encode($ticketData));

        return $ticketData['ticket'];
    }

    //第一步获取access_token
    public function get_access_token() {
        if(!file_exists($this->tokenFile)) {
            $access_token = $this->resetToken();//重置token并写入文件 , 返回token值
        }else{
            $fileContent=file_get_contents($this->tokenFile);
            $tokenArr = json_decode($fileContent,true);
            if($tokenArr['expires_in'] <time()) {
                $access_token = $this->resetToken();
            }else{
                $access_token = $tokenArr['access_token'];
            }
        }
        return $access_token;
    }
    //刷新、重置token, 设置获取token事件并将json数据写入文件,最后返回token值,
    private function resetToken(){
        $url = str_replace('APPID', $this->AppID, $this->getTokenUrl);
        $url = str_replace('APPSECRET', $this->AppSecret, $url);

        $tokenJson = $this->curlPost($url);
        $tokenData = json_decode($tokenJson, true);

        $tokenData['expires_in'] = $tokenData['expires_in']+time();
        file_put_contents($this->tokenFile, json_encode($tokenData));

        return $tokenData['access_token'];
    }

    //生成随机字符串
    public function str_rand($length = 32) {
        $char = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
        if(!is_int($length) || $length <0) {
            return false;
        }
        $string = '';
        for($i = $length; $i > 0; $i--) {
            $string .= $char[mt_rand(0, strlen($char) - 1)];
        }
        return $string;
    }

    //发送请求
    public function curlPost($url, $data = '') {
        if (! function_exists('curl_init')) {
            return '';
        }

        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);

        curl_setopt($ch, CURLOPT_POST, 1);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
        // curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data)); // 可提交数组参数
        $data = curl_exec($ch);

        if (! $data) {
            error_log(curl_error($ch));
        }

        curl_close($ch);
        return $data;
    }
}

// 调用方式: index.php?do=ApiJsSignature
$weixin = new weixin();
$weixin->index();

 


推荐阅读
  • 利用Visual Basic开发SAP接口程序初探的方法与原理
    本文介绍了利用Visual Basic开发SAP接口程序的方法与原理,以及SAP R/3系统的特点和二次开发平台ABAP的使用。通过程序接口自动读取SAP R/3的数据表或视图,在外部进行处理和利用水晶报表等工具生成符合中国人习惯的报表样式。具体介绍了RFC调用的原理和模型,并强调本文主要不讨论SAP R/3函数的开发,而是针对使用SAP的公司的非ABAP开发人员提供了初步的接口程序开发指导。 ... [详细]
  • 本文介绍了闭包的定义和运转机制,重点解释了闭包如何能够接触外部函数的作用域中的变量。通过词法作用域的查找规则,闭包可以访问外部函数的作用域。同时还提到了闭包的作用和影响。 ... [详细]
  • GetWindowLong函数
    今天在看一个代码里头写了GetWindowLong(hwnd,0),我当时就有点费解,靠,上网搜索函数原型说明,死活找不到第 ... [详细]
  • Commit1ced2a7433ea8937a1b260ea65d708f32ca7c95eintroduceda+Clonetraitboundtom ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • Imtryingtofigureoutawaytogeneratetorrentfilesfromabucket,usingtheAWSSDKforGo.我正 ... [详细]
  • 本文介绍了如何使用JSONObiect和Gson相关方法实现json数据与kotlin对象的相互转换。首先解释了JSON的概念和数据格式,然后详细介绍了相关API,包括JSONObject和Gson的使用方法。接着讲解了如何将json格式的字符串转换为kotlin对象或List,以及如何将kotlin对象转换为json字符串。最后提到了使用Map封装json对象的特殊情况。文章还对JSON和XML进行了比较,指出了JSON的优势和缺点。 ... [详细]
  • 图像因存在错误而无法显示 ... [详细]
  • 如何在HTML中获取鼠标的当前位置
    本文介绍了在HTML中获取鼠标当前位置的三种方法,分别是相对于屏幕的位置、相对于窗口的位置以及考虑了页面滚动因素的位置。通过这些方法可以准确获取鼠标的坐标信息。 ... [详细]
  • GreenDAO快速入门
    前言之前在自己做项目的时候,用到了GreenDAO数据库,其实对于数据库辅助工具库从OrmLite,到litePal再到GreenDAO,总是在不停的切换,但是没有真正去了解他们的 ... [详细]
  • Android实战——jsoup实现网络爬虫,糗事百科项目的起步
    本文介绍了Android实战中使用jsoup实现网络爬虫的方法,以糗事百科项目为例。对于初学者来说,数据源的缺乏是做项目的最大烦恼之一。本文讲述了如何使用网络爬虫获取数据,并以糗事百科作为练手项目。同时,提到了使用jsoup需要结合前端基础知识,以及如果学过JS的话可以更轻松地使用该框架。 ... [详细]
  • Android自定义控件绘图篇之Paint函数大汇总
    本文介绍了Android自定义控件绘图篇中的Paint函数大汇总,包括重置画笔、设置颜色、设置透明度、设置样式、设置宽度、设置抗锯齿等功能。通过学习这些函数,可以更好地掌握Paint的用法。 ... [详细]
author-avatar
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有