1. <?php
  2. class JSSDK {
  3. private $appId;
  4. private $appSecret;
  5.  
  6. public function __construct($appId, $appSecret) {
  7. $this->appId = $appId;
  8. $this->appSecret = $appSecret;
  9. }
  10.  
  11. public function getSignPackage() {
  12. $jsapiTicket = $this->getJsApiTicket();
  13.  
  14. // 注意 URL 一定要动态获取,不能 hardcode.
  15. $protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' || $_SERVER['SERVER_PORT'] == 443) ? "https://" : "http://";
  16. $url = "$protocol$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";
  17.  
  18. $timestamp = time();
  19.  
  20. $nonceStr = $this->createNonceStr();
  21.  
  22. // 这里参数的顺序要按照 key 值 ASCII 码升序排序
  23. $string = "jsapi_ticket=$jsapiTicket&noncestr=$nonceStr&timestamp=$timestamp&url=$url";
  24. //$string = "jsapi_ticket=$jsapiTicket&noncestr=$nonceStr&timestamp=$timestamp&url=$url";
  25. //echo $string;
  26. $signature = sha1($string);
  27.  
  28. $signPackage = array(
  29. "appId" => $this->appId,
  30. "nonceStr" => $nonceStr,
  31. "timestamp" => $timestamp,
  32. "url" => $url,
  33. "signature" => $signature,
  34. "rawString" => $string
  35. );
  36. return $signPackage;
  37. }
  38.  
  39. private function createNonceStr($length = 16) {
  40. $chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
  41. $str = "";
  42. for ($i = 0; $i < $length; $i++) {
  43. $str .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);
  44. }
  45. return $str;
  46. }
  47.  
  48. private function getJsApiTicket() {
  49. // jsapi_ticket 应该全局存储与更新,以下代码以写入到文件中做示例
  50. $data = json_decode(file_get_contents("jsapi_ticket.json"));
  51. if ($data->expire_time < time()) {
  52. $accessToken = $this->getAccessToken();
  53. // 如果是企业号用以下 URL 获取 ticket
  54. // $url = "https://qyapi.weixin.qq.com/cgi-bin/get_jsapi_ticket?access_token=$accessToken";
  55. $url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?type=jsapi&access_token=$accessToken";
  56. $res = json_decode($this->httpGet($url));
  57. $ticket = $res->ticket;
  58. if ($ticket) {
  59. $data->expire_time = time() + 7000;
  60. $data->jsapi_ticket = $ticket;
  61. $fp = fopen("jsapi_ticket.json", "w");
  62. fwrite($fp, json_encode($data));
  63. fclose($fp);
  64. }
  65. } else {
  66. $ticket = $data->jsapi_ticket;
  67. }
  68.  
  69. return $ticket;
  70. }
  71.  
  72. private function getAccessToken() {
  73. // access_token 应该全局存储与更新,以下代码以写入到文件中做示例
  74. $data = json_decode(file_get_contents("access_token.json"));
  75. if ($data->expire_time < time()) {
  76. // 如果是企业号用以下URL获取access_token
  77. // $url = "https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=$this->appId&corpsecret=$this->appSecret";
  78. $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=$this->appId&secret=$this->appSecret";
  79. $res = json_decode($this->httpGet($url));
  80. $access_token = $res->access_token;
  81. if ($access_token) {
  82. $data->expire_time = time() + 7000;
  83. $data->access_token = $access_token;
  84. $fp = fopen("access_token.json", "w");
  85. fwrite($fp, json_encode($data));
  86. fclose($fp);
  87. }
  88. } else {
  89. $access_token = $data->access_token;
  90. }
  91. return $access_token;
  92. }
  93.  
  94. private function httpGet($url) {
  95. $curl = curl_init();
  96. curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
  97. curl_setopt($curl, CURLOPT_TIMEOUT, 500);
  98. curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
  99. curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
  100. curl_setopt($curl, CURLOPT_URL, $url);
  101.  
  102. $res = curl_exec($curl);
  103. curl_close($curl);
  104.  
  105. return $res;
  106. }
  107. }

  微信sdk php签名方法整理

微信sdk php签名方法整理的更多相关文章

  1. 【Win10 UWP】微信SDK基本使用方法和基本原理

    上回讲到,作为一个长期散播温暖,散播希望的小清新无公害WP开发者,继QQ SDK之后,又把UWP微信SDK这茬了结了,仅供学习交流. 1.安装微信SDK for UWP 微信官方此前明确说明短时间内暂 ...

  2. asp.net 获得伪静态网址解决微信sdk签名问题

    手机网站是asp.net c#编写的,前几天因为要使用微信SDK在手机网站页面使用分享功能,但是程序使用了伪静态功能.如果原地址是:http://ww.xx.com/news/show.aspx?id ...

  3. 微信消息体签名及加解密功能详细解析以及.net实现

    原文:微信消息体签名及加解密功能详细解析以及.net实现 前言 微信消息体签名及加密功能已上线,明文传输确实存在安全风险,鉴于微信的用户范围使用之广泛,必定会成为众矢之的.所以大家还是尽快接入安全模式 ...

  4. iOS-不用微信SDK唤起微信支付

    作者:TianBai 原文链接:http://www.jianshu.com/p/8930b4496023 要想知道微信SDK是如何调起微信客户端,那么咱们先看看微信SDK到底做了什么 前期准备 接入 ...

  5. 调用微信内置的方法及wx.config的配置问题

    首先请看网址: https://www.w3cschool.cn/weixinkaifawendang/h8ap1qe5.html 重点说下怎么配置wx.config(为了安全,所有的参数都在服务端获 ...

  6. .NET平台下的微信SDK(Rabbit.WeiXin)开源发布

    在上一篇文章<RabbitHub开源情况及计划>上有提及到了一个新的开源项目——微信SDK,经过几天的努力现在开源发布Beta1版本. 目录 前言 特点 功能 支持的消息类型 请求消息 事 ...

  7. 【Win10 UWP】QQ SDK(一):SDK基本使用方法

    每当开发一个应用需要社交分享的应用时,总是心里咯噔一下:到底什么时候分享能加上QQ和微信?除了WP8.0版本的微信SDK,官方似乎从未正面发布过适应时代发展的QQ SDK,就连后台,也没有一个可以创建 ...

  8. react-native 的微信SDK辅助包,支持微信登录、微信分享、微信支付

    微信SDK集成示例,现已完成微信授权登录,之后将陆续包装分享等其他功能. ReactNative高级交流群 127482131 或访问  http://blog.1ygowu.com ReactNat ...

  9. 超级懒汉编写的基于.NET的微信SDK

    一.前言 特别不喜欢麻烦的一个人,最近碰到了微信开发.下载下来了一些其他人写的微信开发“框架”,但是被恶心到了,实现的太臃肿啦. 最不喜欢的就是把微信返回的xml消息在组装成实体类,所以会比较臃肿,现 ...

随机推荐

  1. 数值分析-Legendre正交多项式 实现函数逼近

    数值分析-Legendre正交多项式 实现函数逼近 2016年12月18日 21:27:54 冰三点水 阅读数 4057   版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请 ...

  2. php 处理数字为金钱格式

    number_format(需要转换的数字,保留小数个数,小数点符号,每三位的分隔符) echo number_format("1000000")."<br> ...

  3. luogu2858奶牛零食题解--区间DP

    题目链接 https://www.luogu.org/problemnew/show/P2858 一句话题意: https://cn.vjudge.net/problem/POJ-3186#autho ...

  4. luogu1731生日蛋糕题解--恶心剪枝

    题目链接 https://www.luogu.org/problemnew/show/P1731 分析 这题真[哔]恶心,加了一堆奇奇怪怪的优化 首先明确一点,半径和高都必须是正整数,意味着它们最小为 ...

  5. 使用webform、websevice来进行ajax请求操作

    通过使用webform(asp.net非mvc) .webservice 作为请求接口在前台发送ajax请求:1.前台代码: $.ajax({ type: "POST", //方法 ...

  6. 11.SSH整合

    由于自己学习的版本比较落后,这里就不总结了 在我这个版本整合的过程中的几点问题: 1.在web.xml的配置过程中: <!-- 如果使用的是load获取数据,在jsp页面申请取得数据时才真正的执 ...

  7. 深度学习_1_Tensorflow_1

    # 深度学习 # 图像识别,自然语言处理 # 机器学习 深度学习 # 分类:神经网络(简单) 神经网络(深度) # 回归 图像:卷积神经网络 # 自然语言处理:循环神经网络 # cpu:运行操作系统, ...

  8. Dedecms限制栏目列表生成的最大页数

    首先,我们要登陆DEDECMS后台 >> 系统 >> 站点设置 的同条栏目上,添加一个新的变量,变量名称:cfg_listmaxpage,变量说明:栏目生成列表最大页数,变量值 ...

  9. Form组件 cookie和session

    django form组件 1.渲染标签 2.校验数据 3.展示信息 第一步需要一个form类 from django import forms class MyForm(forms.Form): n ...

  10. web开发:jquery之DOM

    一.文档结构 二.文档操作 三.文档操作案例 四.form表单 五.正则 六.form案例 一.文档结构 ```jsvar $sup = $('.sup');console.log($sup.chil ...