signaturer.php 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. <?php
  2. /**
  3. * Created by PhpStorm.
  4. * User: stanley-king
  5. * Date: 2017/6/20
  6. * Time: 上午10:25
  7. */
  8. namespace thrid_author;
  9. use Log;
  10. class signaturer
  11. {
  12. const appid = 'wx6b42e00ecaade538';
  13. const appsecret ='ee64233b3144d76217161666f8cb4c86';
  14. const access_token_url = "https://api.weixin.qq.com/cgi-bin/token";
  15. const ticket_url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket";
  16. const prefix = 'signaturer';
  17. private $mData;
  18. private static $stInstance = null;
  19. public static function instance()
  20. {
  21. if(self::$stInstance == null) {
  22. self::$stInstance = new signaturer();
  23. }
  24. return self::$stInstance;
  25. }
  26. private function __construct()
  27. {
  28. $this->mData = [];
  29. }
  30. public function signurl()
  31. {
  32. $ticket = $this->jsapi_ticket();
  33. if($ticket == false) {
  34. Log::record(__METHOD__ . " sign error",Log::ERR);
  35. return false;
  36. }
  37. $protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' || $_SERVER['SERVER_PORT'] == 443) ? "https://" : "http://";
  38. $url = "$protocol$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";
  39. $timestamp = time();
  40. $nonceStr = $this->noncestr();
  41. $string = "jsapi_ticket={$ticket}&noncestr={$nonceStr}&timestamp={$timestamp}&url=$url";
  42. $signature = sha1($string);
  43. $sign = array(
  44. "appId" => signaturer::appid,
  45. "nonceStr" => $nonceStr,
  46. "timestamp" => $timestamp,
  47. "url" => $url,
  48. "signature" => $signature,
  49. "rawString" => $string
  50. );
  51. return $sign;
  52. }
  53. private function noncestr($length = 16)
  54. {
  55. $chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
  56. $str = "";
  57. for ($i = 0; $i < $length; $i++) {
  58. $str .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);
  59. }
  60. return $str;
  61. }
  62. private function jsapi_ticket()
  63. {
  64. $ticket = $this->rjsapi_ticket();
  65. if($ticket == false)
  66. {
  67. $accessToken = $this->access_token();
  68. if($accessToken == false) {
  69. return false;
  70. }
  71. $params = ['type' => 'jsapi','access_token' => $accessToken];
  72. $res = http_request(self::ticket_url,$params);
  73. if($res == false) return false;
  74. $res = json_decode($res,true);
  75. if($res['errcode'] != 0) {
  76. Log::record("jsapi_ticket error : code={$res['errcode']} msg={$res['errmsg']}",Log::ERR);
  77. return false;
  78. }
  79. $ticket['expires'] = time() + intval($res['expires_in']) - 5;
  80. $ticket['ticket'] = $res['ticket'];
  81. wcache('jsapi_ticket',$ticket,self::prefix);
  82. $this->mData['jsapi_ticket'] = $ticket;
  83. $ticket = $ticket['ticket'];
  84. }
  85. return $ticket;
  86. }
  87. private function rjsapi_ticket()
  88. {
  89. if(empty($this->mData) || empty($this->mData['jsapi_ticket']))
  90. {
  91. $items = rcache('jsapi_ticket',self::prefix);
  92. if(empty($items)) {
  93. return false;
  94. } else {
  95. $this->mData['jsapi_ticket'] = $items;
  96. }
  97. }
  98. $expires = $this->mData['jsapi_ticket']['expires'];
  99. if(time() >= $expires) {
  100. return false;
  101. }
  102. return $this->mData['jsapi_ticket']['ticket'];
  103. }
  104. private function access_token()
  105. {
  106. $acctoken = $this->raccess_token();
  107. if($acctoken == false)
  108. {
  109. $params = ['grant_type' => 'client_credential','appid' => signaturer::appid,'secret' => signaturer::appsecret];
  110. $res = http_request(self::access_token_url,$params);
  111. if($res == false) return false;
  112. $res = json_decode($res,true);
  113. $token['expires'] = time() + intval($res['expires_in']) - 5;
  114. $token['token'] = $res['access_token'];
  115. wcache('access_token',$token,self::prefix);
  116. $this->mData['access_token'] = $token;
  117. $acctoken = $token['token'];
  118. }
  119. return $acctoken;
  120. }
  121. private function raccess_token()
  122. {
  123. if(empty($this->mData) || empty($this->mData['access_token']))
  124. {
  125. $token = rcache('access_token',self::prefix);
  126. if(empty($token)) {
  127. return false;
  128. } else {
  129. $this->mData['access_token'] = $token;
  130. }
  131. }
  132. $expires = $this->mData['access_token']['expires'];
  133. if(time() >= $expires) {
  134. return false;
  135. }
  136. return $this->mData['access_token']['token'];
  137. }
  138. }