微信封装的调用微信签名包的类库


Posted in PHP onJune 08, 2017

废话不多说了,直接给大家贴代码了,具体代码如下所示:

<?php
namespace Home\Model;
use Think\Model;
class WechatModel extends Model {
private $_token = ''; //令牌
    private $appid;
    private $appsecret;
  public function __construct()
  {
    $this->appid = C('APPID');//公众号的appid
    $this->appsecret = C('APPSECRET');//公众号的秘钥
  }
  //调用js-sdk的签名包
  public function getSignPackage() {
  $jsapiTicket = $this->getJsApiTicket();
  // 注意 URL 一定要动态获取,不能 hardcode.(获取当前网页的url)
  $protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' || $_SERVER['SERVER_PORT'] == 443) ? "https://" : "http://";
  $url = "$protocol$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";
  //时间戳
  $timestamp = time();
  //随机字符串获取
  $nonceStr = $this->createNonceStr();
  // 这里参数的顺序要按照 key 值 ASCII 码升序排序
  $string = "jsapi_ticket=$jsapiTicket&noncestr=$nonceStr×tamp=$timestamp&url=$url";
  //生成字符串是用来签名用的
  $signature = sha1($string);
  $signPackage = array(
   "appId"   => $this->appid,
   "nonceStr" => $nonceStr,
   "timestamp" => $timestamp,
   "url"    => $url,
   "signature" => $signature,
   "rawString" => $string
  );
  return $signPackage; 
 }
 //使用会员卡领取的签名包
 public function getHuiYuanSignPackage() {
  $apiTicket = $this->getApiTicket();
  // 注意 URL 一定要动态获取,不能 hardcode.(获取当前网页的url)
  $protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' || $_SERVER['SERVER_PORT'] == 443) ? "https://" : "http://";
  $url = "$protocol$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";
  //时间戳
  $timestamp = time();
  //随机字符串获取
  // $nonceStr = $this->createNonceStr();
  // 这里参数的顺序要按照 key 值 ASCII 码升序排序
  $string = $timestamp.$apiTicket."car_id";//card_id为自己创建的会员卡的id
  //生成字符串是用来签名用的
  $signature = sha1($string);
  $signPackage = array(
   "timestamp" => $timestamp,
   "signature" => $signature,
  );
  return $signPackage; 
 }
 //获取会员卡的api_ticket
 public function getApiTicket(){
 $data = json_decode(file_get_contents("api_ticket.json"));
  if ($data->expire_time < time()) {
   $accessToken = $this->getAccessToken();
   $url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?type=wx_card&access_token=$accessToken";
   $res = json_decode($this->httpGet($url));
   $ticket = $res->ticket;
   if ($ticket) {
    $data->expire_time = time() + 7000;
    $data->jsapi_ticket = $ticket;
    $fp = fopen("api_ticket.json", "w");
    fwrite($fp, json_encode($data));
    fclose($fp);
   }
  } else {
   $ticket = $data->jsapi_ticket;
  }
  return $ticket;
 }
 //获取随机字符串
 private function createNonceStr($length = 16) {
  $chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
  $str = "";
  for ($i = 0; $i < $length; $i++) {
   $str .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);
  }
  return $str;
 }
  //获取Access Token
  public function getAccessToken(){
  //将json字符串转换为json对象(json_encode是将数组转换为json字符串,json_decode("",true) 如果加true是将json字符串转化为php数组,不加true转换为PHP对象)
  $data = json_decode(file_get_contents("access_token.json"));
  if ($data->expire_time < time()) {
   // 如果是企业号用以下URL获取access_token
   $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=$this->appid&secret=$this->appsecret";
   $res = json_decode($this->httpGet($url));
   $access_token = $res->access_token;
 if ($access_token) {
    $data->expire_time = time() + 7000;
    $data->access_token = $access_token;
    $fp = fopen("access_token.json", "w");
    fwrite($fp, json_encode($data));
    fclose($fp);
 }
  } else {
   $access_token = $data->access_token;
  }
  return $access_token;
  }
 //获取jsapi_ticket(jsapi_ticket是公众号用于调用微信JS接口的临时票据)
  private function getJsApiTicket() {
  // jsapi_ticket 应该全局存储与更新,以下代码以写入到文件中做示例
  $data = json_decode(file_get_contents("jsapi_ticket.json"));
  if ($data->expire_time < time()) {
   $accessToken = $this->getAccessToken();
   // 如果是企业号用以下 URL 获取 ticket
   // $url = "https://qyapi.weixin.qq.com/cgi-bin/get_jsapi_ticket?access_token=$accessToken";
   $url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?type=jsapi&access_token=$accessToken";
   $res = json_decode($this->httpGet($url));
   $ticket = $res->ticket;
   if ($ticket) {
    $data->expire_time = time() + 7000;
    $data->jsapi_ticket = $ticket;
    $fp = fopen("jsapi_ticket.json", "w");
    fwrite($fp, json_encode($data));
    fclose($fp);
   }
  } else {
   $ticket = $data->jsapi_ticket;
  }
  return $ticket;
 }
  //获取用户的openid
  public function openId(){
  $url = $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']; 
    if (!isset($_GET['code'])) {
     //获取组装的url
      $openidUrl = $this->snsapi_base($url);
      redirect($openidUrl);
    }else{
      $openidAccess_token = $this->openidAccess_token($_GET['code']);
      return $openidAccess_token;
    }
  }
   //获取微信用户的opnid
  public function getOpenId($openid,$access_token)
  {
    $userInfo = $this->getUserInfo($openid,$access_token);
    return $userInfo;
  }
   public function snsapi_base($redirect_uri, $scope = "snsapi_userinfo", $state = 0)
  {
    $appId = $this->appid;
    $url = "https://open.weixin.qq.com/connect/oauth2/authorize";
    $url .= "?appid=$appId";
    $url .= "&redirect_uri=http://$redirect_uri";
    $url .= "&response_type=code";
    $url .= "&scope=$scope";
    $url .= "&state=$state#wechat_redirect";
    return $url;
  }
public function openidAccess_token($code){
    $appId = $this->appid;
    $appSecret= $this->appsecret;
    $url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=$appId&secret=$appSecret&code=$code&grant_type=authorization_code";
    return json_decode($this->httpGet($url),true);
  }
  //获取用户信息
  public function getUserInfo($openid, $access_token){
  $url = "https://api.weixin.qq.com/sns/userinfo?access_token=$access_token&openid=$openid&lang=zh_CN ";
    return json_decode($this->httpGet($url),true);
   //请求
  }
private function httpGet($url) {
  $curl = curl_init();
  curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
  curl_setopt($curl, CURLOPT_TIMEOUT, 500);
  curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
  curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
  curl_setopt($curl, CURLOPT_URL, $url);
  $res = curl_exec($curl);
  curl_close($curl);
  return $res;
 }
}

以上所述是小编给大家介绍的微信封装的调用微信签名包的类库,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

PHP 相关文章推荐
模拟OICQ的实现思路和核心程序(三)
Oct 09 PHP
基于mysql的bbs设计(二)
Oct 09 PHP
在JavaScript中调用php程序
Mar 09 PHP
PHP中__get()和__set()的用法实例详解
Jun 04 PHP
php中adodbzip类实例
Dec 08 PHP
PHP的数组中提高元素查找与元素去重的效率的技巧解析
Mar 03 PHP
简单谈谈php浮点数精确运算
Mar 10 PHP
php微信公众号开发模式详解
Nov 28 PHP
php单元测试phpunit入门实例教程
Nov 17 PHP
PHP实现单文件、多个单文件、多文件上传函数的封装示例
Sep 02 PHP
PDO实现学生管理系统
Mar 21 PHP
PHP使用QR Code生成二维码实例
Jul 07 PHP
微信公众号实现会员卡领取功能
Jun 08 #PHP
php图像验证码生成代码
Jun 08 #PHP
php面向对象的用户登录身份验证
Jun 08 #PHP
php实现用户注册密码的crypt加密
Jun 08 #PHP
php封装一个异常的处理类
Jun 08 #PHP
php简单构造json多维数组的方法示例
Jun 08 #PHP
php显示页码分页类的封装
Jun 08 #PHP
You might like
php缩放gif和png图透明背景变成黑色的解决方法
2014/10/14 PHP
PHP实现微信商户支付企业付款到零钱功能
2018/09/30 PHP
Laravel事件监听器用法实例分析
2019/03/12 PHP
Laravel 解决composer相关操作提示php相关异常的问题
2019/10/23 PHP
JavaScript 异步调用框架 (Part 4 - 链式调用)
2009/08/04 Javascript
扩展JavaScript功能的正确方法(译文)
2012/04/12 Javascript
js中window.open()的所有参数详细解析
2014/01/09 Javascript
JS实现网页表格自动变大缩小的方法
2015/03/09 Javascript
jfinal与bootstrap的登录跳转实战演习
2015/09/22 Javascript
使用jQuery的easydrag插件实现可拖动的DIV弹出框
2016/02/19 Javascript
jQuery弹出层后禁用底部滚动条(移动端关闭回到原位置)
2016/08/29 Javascript
用js控件div的滚动条,让它在内容更新时自动滚到底部的实现方法
2016/10/27 Javascript
JS仿JQuery选择器功能
2017/03/08 Javascript
Vue计算属性的学习笔记
2017/03/22 Javascript
微信小程序之数据双向绑定与数据操作
2017/05/12 Javascript
微信小程序onLaunch异步,首页onLoad先执行?
2018/09/20 Javascript
详解关于微信setData回调函数中的坑
2019/02/18 Javascript
vue项目里面引用svg文件并给svg里面的元素赋值
2020/08/17 Javascript
[01:02]DOTA2辉夜杯决赛日 CDEC.Y对阵VG赛前花絮
2015/12/27 DOTA
Python中实现参数类型检查的简单方法
2015/04/21 Python
Python使用pylab库实现画线功能的方法详解
2017/06/08 Python
python3+PyQt5实现拖放功能
2018/04/24 Python
使用tensorflow实现VGG网络,训练mnist数据集方式
2020/05/26 Python
CSS3动画效果回调处理详解
2014/12/10 HTML / CSS
某科技软件测试面试题
2013/05/19 面试题
财务会计毕业生自荐信
2013/11/02 职场文书
教导主任竞聘演讲稿
2014/05/16 职场文书
企业趣味活动方案
2014/08/21 职场文书
2014企业领导班子四风对照检查材料思想汇报
2014/09/17 职场文书
小学生自我评价100字(15篇)
2014/09/18 职场文书
雷锋的故事观后感
2015/06/10 职场文书
2015年秋季学校开学标语
2015/07/16 职场文书
创业计划书之服装
2019/10/07 职场文书
Python数据分析入门之教你怎么搭建环境
2021/05/13 Python
Python关于OS文件目录处理的实例分享
2021/05/23 Python
Nginx性能优化之Gzip压缩设置详解(最大程度提高页面打开速度)
2022/02/12 Servers