热门标签 | 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();

 


推荐阅读
  • 【实例简介】本文详细介绍了如何在PHP中实现微信支付的退款功能,并提供了订单创建类的完整代码及调用示例。在配置过程中,需确保正确设置相关参数,特别是证书路径应根据项目实际情况进行调整。为了保证系统的安全性,存放证书的目录需要设置为可读权限。值得注意的是,普通支付操作无需证书,但在执行退款操作时必须提供证书。此外,本文还对常见的错误处理和调试技巧进行了说明,帮助开发者快速定位和解决问题。 ... [详细]
  • 优化后的标题:深入探讨网关安全:将微服务升级为OAuth2资源服务器的最佳实践
    本文深入探讨了如何将微服务升级为OAuth2资源服务器,以订单服务为例,详细介绍了在POM文件中添加 `spring-cloud-starter-oauth2` 依赖,并配置Spring Security以实现对微服务的保护。通过这一过程,不仅增强了系统的安全性,还提高了资源访问的可控性和灵活性。文章还讨论了最佳实践,包括如何配置OAuth2客户端和资源服务器,以及如何处理常见的安全问题和错误。 ... [详细]
  • 如何在PHP中准确获取服务器IP地址?
    如何在PHP中准确获取服务器IP地址? ... [详细]
  • 本文介绍了如何利用Shell脚本高效地部署MHA(MySQL High Availability)高可用集群。通过详细的脚本编写和配置示例,展示了自动化部署过程中的关键步骤和注意事项。该方法不仅简化了集群的部署流程,还提高了系统的稳定性和可用性。 ... [详细]
  • 在Cisco IOS XR系统中,存在提供服务的服务器和使用这些服务的客户端。本文深入探讨了进程与线程状态转换机制,分析了其在系统性能优化中的关键作用,并提出了改进措施,以提高系统的响应速度和资源利用率。通过详细研究状态转换的各个环节,本文为开发人员和系统管理员提供了实用的指导,旨在提升整体系统效率和稳定性。 ... [详细]
  • 在本地环境中部署了两个不同版本的 Flink 集群,分别为 1.9.1 和 1.9.2。近期在尝试启动 1.9.1 版本的 Flink 任务时,遇到了 TaskExecutor 启动失败的问题。尽管 TaskManager 日志显示正常,但任务仍无法成功启动。经过详细分析,发现该问题是由 Kafka 版本不兼容引起的。通过调整 Kafka 客户端配置并升级相关依赖,最终成功解决了这一故障。 ... [详细]
  • FastDFS Nginx 扩展模块的源代码解析与技术剖析
    FastDFS Nginx 扩展模块的源代码解析与技术剖析 ... [详细]
  • 深入解析 Vue 中的 Axios 请求库
    本文深入探讨了 Vue 中的 Axios 请求库,详细解析了其核心功能与使用方法。Axios 是一个基于 Promise 的 HTTP 客户端,支持浏览器和 Node.js 环境。文章首先介绍了 Axios 的基本概念,随后通过具体示例展示了如何在 Vue 项目中集成和使用 Axios 进行数据请求。无论你是初学者还是有经验的开发者,本文都能为你解决 Vue.js 相关问题提供有价值的参考。 ... [详细]
  • 如何使用企业号实现文本、图片、文件、语音、视频、图文消息等消息的发送操作
    这篇文章主要为大家展示了“如何使用企业号实现文本、图片、文件、语音、视频、图文消息等消息的发送操作”,内容简而易懂,条理清晰,希望能够帮 ... [详细]
  • 包含phppdoerrorcode的词条 ... [详细]
  • 本文介绍了如何使用Python的Paramiko库批量更新多台服务器的登录密码。通过示例代码展示了具体实现方法,确保了操作的高效性和安全性。Paramiko库提供了强大的SSH2协议支持,使得远程服务器管理变得更加便捷。此外,文章还详细说明了代码的各个部分,帮助读者更好地理解和应用这一技术。 ... [详细]
  • Unity与MySQL连接过程中出现的新挑战及解决方案探析 ... [详细]
  • 在浏览器进行微信h5支付时出现:在https:pay.weixin.qq.comwikidocapiH5.php?chapter15_4官 ... [详细]
  • asp.net微信开发中有关高级群发文本的示例分析
    小编给大家分享一下asp.net微信开发中有关高级群发文本的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读 ... [详细]
  • 微信登录(网站应用)ASP.NET第一步:请求CODE.第二步:通过CODE获取access_token.第三步:通过access_token调用接 ... [详细]
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社区 版权所有