Jssdk.php 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. <?php
  2. namespace addons\cms\library;
  3. use fast\Http;
  4. use fast\Random;
  5. use think\Cache;
  6. class Jssdk
  7. {
  8. private $appId;
  9. private $appSecret;
  10. public function __construct()
  11. {
  12. $config = get_addon_config('third');
  13. $this->appId = $config['wechat']['app_id'];
  14. $this->appSecret = $config['wechat']['app_secret'];
  15. }
  16. public function getSignedPackage($url)
  17. {
  18. $jsapiTicket = $this->getJsApiTicket();
  19. $timestamp = time();
  20. $nonceStr = Random::alnum(16);
  21. // 这里参数的顺序要按照 key 值 ASCII 码升序排序
  22. $string = "jsapi_ticket={$jsapiTicket}&noncestr={$nonceStr}&timestamp={$timestamp}&url={$url}";
  23. $signature = sha1($string);
  24. $signPackage = array(
  25. "appId" => $this->appId,
  26. "nonceStr" => $nonceStr,
  27. "timestamp" => $timestamp,
  28. "url" => $url,
  29. "signature" => $signature,
  30. "rawString" => $string,
  31. "jsticket" => $jsapiTicket,
  32. );
  33. return $signPackage;
  34. }
  35. private function getJsApiTicket()
  36. {
  37. $ticket = Cache::get("wechat_jsapi_ticket");
  38. if (!$ticket) {
  39. $accessToken = $this->getAccessToken();
  40. // 如果是企业号用以下 URL 获取 ticket
  41. // $url = "https://qyapi.weixin.qq.com/cgi-bin/get_jsapi_ticket?access_token={$accessToken}";
  42. $url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?type=jsapi&access_token={$accessToken}";
  43. $ret = Http::get($url);
  44. $json = json_decode($ret, true);
  45. $ticket = isset($json['ticket']) ? $json['ticket'] : '';
  46. if ($ticket) {
  47. Cache::set('wechat_jsapi_ticket', $ticket, 7200);
  48. }
  49. }
  50. return $ticket;
  51. }
  52. private function getAccessToken()
  53. {
  54. $token = Cache::get("wechat_access_token");
  55. if (!$token) {
  56. // 如果是企业号用以下URL获取access_token
  57. // $url = "https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid={$this->appId}&corpsecret={$this->appSecret}";
  58. $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={$this->appId}&secret={$this->appSecret}";
  59. $ret = Http::get($url);
  60. $json = json_decode($ret, true);
  61. $token = isset($json['access_token']) ? $json['access_token'] : '';
  62. if ($token) {
  63. Cache::set('wechat_access_token', $token, 7200);
  64. }
  65. }
  66. return $token;
  67. }
  68. }