PHP版微信公众平台红包API


Posted in PHP onApril 02, 2015

重写了一下PHP下面的微信API接口,

微信红包支持,JSAPI的动态参数接口支持

http://git.oschina.net/youkuiyuan/yky_test/blob/master/class/wxapi.class.php

微信API类 - 增加红包支持

<?php
  /********************************************************
   *   @author Kyler You <QQ:2444756311>
   *   @link http://mp.weixin.qq.com/wiki/home/index.html
   *   @version 2.0.1
   *   @uses $wxApi = new WxApi();
   *   @package 微信API接口 陆续会继续进行更新
   ********************************************************/
 
  class WxApi {
    const appId     = "";
    const appSecret   = ""; 
    const mchid     = ""; //商户号
    const privatekey  = ""; //私钥
    public $parameters = array();
 
    public function __construct(){
 
    }
 
    /****************************************************
     * 微信提交API方法,返回微信指定JSON
     ****************************************************/
 
    public function wxHttpsRequest($url,$data = null){
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_URL, $url);
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
        curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);
        if (!empty($data)){
            curl_setopt($curl, CURLOPT_POST, 1);
            curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
        }
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
        $output = curl_exec($curl);
        curl_close($curl);
        return $output;
    }
 
    /****************************************************
     * 微信带证书提交数据 - 微信红包使用
     ****************************************************/
 
    public function wxHttpsRequestPem($url, $vars, $second=30,$aHeader=array()){
        $ch = curl_init();
        //超时时间
        curl_setopt($ch,CURLOPT_TIMEOUT,$second);
        curl_setopt($ch,CURLOPT_RETURNTRANSFER, 1);
        //这里设置代理,如果有的话
        //curl_setopt($ch,CURLOPT_PROXY, '10.206.30.98');
        //curl_setopt($ch,CURLOPT_PROXYPORT, 8080);
        curl_setopt($ch,CURLOPT_URL,$url);
        curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,false);
        curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,false);
 
        //以下两种方式需选择一种
 
        //第一种方法,cert 与 key 分别属于两个.pem文件
        //默认格式为PEM,可以注释
        curl_setopt($ch,CURLOPT_SSLCERTTYPE,'PEM');
        curl_setopt($ch,CURLOPT_SSLCERT,getcwd().'/apiclient_cert.pem');
        //默认格式为PEM,可以注释
        curl_setopt($ch,CURLOPT_SSLKEYTYPE,'PEM');
        curl_setopt($ch,CURLOPT_SSLKEY,getcwd().'/apiclient_key.pem');
 
        curl_setopt($ch,CURLOPT_CAINFO,'PEM');
        curl_setopt($ch,CURLOPT_CAINFO,getcwd().'/rootca.pem');
 
        //第二种方式,两个文件合成一个.pem文件
        //curl_setopt($ch,CURLOPT_SSLCERT,getcwd().'/all.pem');
 
        if( count($aHeader) >= 1 ){
            curl_setopt($ch, CURLOPT_HTTPHEADER, $aHeader);
        }
 
        curl_setopt($ch,CURLOPT_POST, 1);
        curl_setopt($ch,CURLOPT_POSTFIELDS,$vars);
        $data = curl_exec($ch);
        if($data){
            curl_close($ch);
            return $data;
        }
        else { 
            $error = curl_errno($ch);
            echo "call faild, errorCode:$error\n"; 
            curl_close($ch);
            return false;
        }
    }
 
    /****************************************************
     * 微信获取AccessToken 返回指定微信公众号的at信息
     ****************************************************/
 
    public function wxAccessToken($appId = NULL , $appSecret = NULL){
        $appId     = is_null($appId) ? self::appId : $appId;
        $appSecret   = is_null($appSecret) ? self::appSecret : $appSecret;
        //echo $appId,$appSecret;
        $url      = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=".$appId."&secret=".$appSecret;
        $result     = $this->wxHttpsRequest($url);
        //print_r($result);
        $jsoninfo    = json_decode($result, true);
        $access_token  = $jsoninfo["access_token"];
        return $access_token;
    }
 
    /****************************************************
     * 微信通过OPENID获取用户信息,返回数组
     ****************************************************/
 
    public function wxGetUser($openId){
        $wxAccessToken = $this->wxAccessToken();
        $url      = "https://api.weixin.qq.com/cgi-bin/user/info?access_token=".$wxAccessToken."&openid=".$openId."&lang=zh_CN";
        $result     = $this->wxHttpsRequest($url);
        $jsoninfo    = json_decode($result, true);
        return $jsoninfo;
    }
 
    /****************************************************
     * 微信通过指定模板信息发送给指定用户,发送完成后返回指定JSON数据
     ****************************************************/
 
    public function wxSendTemplate($jsonData){
        $wxAccessToken = $this->wxAccessToken();
        $url      = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=".$wxAccessToken;
        $result     = $this->wxHttpsRequest($url,$jsonData);
        return $result;
    }
 
    /****************************************************
     *   发送自定义的模板消息
     ****************************************************/
 
    public function wxSetSend($touser, $template_id, $url, $data, $topcolor = '#7B68EE'){
        $template = array(
            'touser' => $touser,
            'template_id' => $template_id,
            'url' => $url,
            'topcolor' => $topcolor,
            'data' => $data
        );
        $jsonData = json_encode($template);
        $result = $this->wxSendTemplate($jsonData);
        return $result;
    }
 
    /****************************************************
     * 微信设置OAUTH跳转URL,返回字符串信息 - SCOPE = snsapi_base //验证时不返回确认页面,只能获取OPENID
     ****************************************************/
 
    public function wxOauthBase($redirectUrl,$state = "",$appId = NULL){
        $appId     = is_null($appId) ? self::appId : $appId;
        $url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=".$appId."&redirect_uri=".$redirectUrl."&response_type=code&scope=snsapi_base&state=".$state."#wechat_redirect";
        return $url;
    }
 
    /****************************************************
     * 微信设置OAUTH跳转URL,返回字符串信息 - SCOPE = snsapi_userinfo //获取用户完整信息
     ****************************************************/
 
    public function wxOauthUserinfo($redirectUrl,$state = "",$appId = NULL){
        $appId     = is_null($appId) ? self::appId : $appId;
        $url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=".$appId."&redirect_uri=".$redirectUrl."&response_type=code&scope=snsapi_userinfo&state=".$state."#wechat_redirect";
        return $url;
    }
 
    /****************************************************
     * 微信OAUTH跳转指定URL
     ****************************************************/
 
    public function wxHeader($url){
        header("location:".$url);
    }
 
    /****************************************************
     * 微信通过OAUTH返回页面中获取AT信息
     ****************************************************/
 
    public function wxOauthAccessToken($code,$appId = NULL , $appSecret = NULL){
        $appId     = is_null($appId) ? self::appId : $appId;
        $appSecret   = is_null($appSecret) ? self::appSecret : $appSecret;
        $url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=".$appId."&secret=".$appSecret."&code=".$code."&grant_type=authorization_code";
        $result     = $this->wxHttpsRequest($url);
        //print_r($result);
        $jsoninfo    = json_decode($result, true);
        //$access_token   = $jsoninfo["access_token"];
        return $jsoninfo;      
    }
 
    /****************************************************
     * 微信通过OAUTH的Access_Token的信息获取当前用户信息 // 只执行在snsapi_userinfo模式运行
     ****************************************************/
 
    public function wxOauthUser($OauthAT,$openId){
        $url      = "https://api.weixin.qq.com/sns/userinfo?access_token=".$OauthAT."&openid=".$openId."&lang=zh_CN";
        $result     = $this->wxHttpsRequest($url);
        $jsoninfo    = json_decode($result, true);
        return $jsoninfo;      
    }
     
    /*****************************************************
     *   生成随机字符串 - 最长为32位字符串
     *****************************************************/
    public function wxNonceStr($length = 16, $type = FALSE) {
      $chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
      $str = "";
      for ($i = 0; $i < $length; $i++) {
       $str .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);
      }
      if($type == TRUE){
        return strtoupper(md5(time() . $str));
      }
      else {
        return $str;
      }
    }
     
    /*******************************************************
     *   微信商户订单号 - 最长28位字符串
     *******************************************************/
     
    public function wxMchBillno($mchid = NULL) {
      if(is_null($mchid)){
        if(self::mchid == "" || is_null(self::mchid)){
          $mchid = time();
        }
        else{
          $mchid = self::mchid;
        }
      }
      else{
        $mchid = substr(addslashes($mchid),0,10);
      }
      return date("Ymd",time()).time().$mchid;
    }
     
    /*******************************************************
     *   微信格式化数组变成参数格式 - 支持url加密
     *******************************************************/   
     
    public function wxSetParam($parameters){
      if(is_array($parameters) && !empty($parameters)){
        $this->parameters = $parameters;
        return $this->parameters;
      }
      else{
        return array();
      }
    }
     
    /*******************************************************
     *   微信格式化数组变成参数格式 - 支持url加密
     *******************************************************/
     
  public function wxFormatArray($parameters = NULL, $urlencode = FALSE){
      if(is_null($parameters)){
        $parameters = $this->parameters;
      }
      $restr = "";//初始化空
      ksort($parameters);//排序参数
      foreach ($parameters as $k => $v){//循环定制参数
        if (null != $v && "null" != $v && "sign" != $k) {
          if($urlencode){//如果参数需要增加URL加密就增加,不需要则不需要
            $v = urlencode($v);
          }
          $restr .= $k . "=" . $v . "&";//返回完整字符串
        }
      }
      if (strlen($restr) > 0) {//如果存在数据则将最后“&”删除
        $restr = substr($restr, 0, strlen($restr)-1);
      }
      return $restr;//返回字符串
  }
     
    /*******************************************************
     *   微信MD5签名生成器 - 需要将参数数组转化成为字符串[wxFormatArray方法]
     *******************************************************/
    public function wxMd5Sign($content, $privatekey){
    try {
        if (is_null($key)) {
          throw new Exception("财付通签名key不能为空!");
        }
        if (is_null($content)) {
          throw new Exception("财付通签名内容不能为空");
        }
        $signStr = $content . "&key=" . $key;
        return strtoupper(md5($signStr));
      }
      catch (Exception $e)
      {
        die($e->getMessage());
      }
    }
     
    /*******************************************************
     *   微信Sha1签名生成器 - 需要将参数数组转化成为字符串[wxFormatArray方法]
     *******************************************************/
    public function wxSha1Sign($content, $privatekey){
    try {
        if (is_null($key)) {
          throw new Exception("财付通签名key不能为空!");
        }
        if (is_null($content)) {
          throw new Exception("财付通签名内容不能为空");
        }
        $signStr = $content . "&key=" . $key;
        return strtoupper(sha1($signStr));
      }
      catch (Exception $e)
      {
        die($e->getMessage());
      }
    }
 
    /*******************************************************
     *   将数组解析XML - 微信红包接口
     *******************************************************/
     
  public function wxArrayToXml($parameters = NULL){
      if(is_null($parameters)){
        $parameters = $this->parameters;
      }
       
      if(!is_array($parameters) || empty($parameters)){
        die("参数不为数组无法解析");
      }
       
      $xml = "<xml>";
      foreach ($arr as $key=>$val)
      {
        if (is_numeric($val))
        {
          $xml.="<".$key.">".$val."</".$key.">"; 
        }
        else
          $xml.="<".$key."><![CDATA[".$val."]]></".$key.">"; 
      }
      $xml.="</xml>";
      return $xml; 
    }
     
  }

后期还是会增加在一起的把这个CLASS做起来,网上资源很多,但是都是有一定基础的人去看看改改可以,对于没有接触刚刚接触的新手还是需要给予支持的。帮助用户屡屡思路。

以上所述就是本文的全部内容了,希望大家能够喜欢。

PHP 相关文章推荐
example2.php
Oct 09 PHP
php对数组排序代码分享
Feb 24 PHP
ThinkPHP基本的增删查改操作实例教程
Aug 22 PHP
php轻松实现文件上传功能
Mar 03 PHP
php生成txt文件实例代码介绍
Apr 28 PHP
Apache无法自动跳转却显示目录的解决方法
Nov 30 PHP
phalcon model在插入或更新时会自动验证非空字段的解决办法
Dec 29 PHP
php中请求url的五种方法总结
Jul 13 PHP
PHP中strtr与str_replace函数运行性能简单测试示例
Jun 22 PHP
php 实现简单的登录功能示例【基于thinkPHP框架】
Dec 02 PHP
PHP实现新型冠状病毒疫情实时图的实例
Feb 04 PHP
php中使用array_filter()函数过滤数组实例讲解
Mar 03 PHP
php实现TCP端口检测的方法
Apr 01 #PHP
Yii实现自动加载类地图的方法
Apr 01 #PHP
PHP递归调用数组值并用其执行指定函数的方法
Apr 01 #PHP
php微信公众平台开发类实例
Apr 01 #PHP
PHP生成指定随机字符串的简单实现方法
Apr 01 #PHP
php使用Image Magick将PDF文件转换为JPG文件的方法
Apr 01 #PHP
php快速查找数据库中恶意代码的方法
Apr 01 #PHP
You might like
我用php+mysql写的留言本
2006/10/09 PHP
dhtmlxTree目录树增加右键菜单以及拖拽排序的实现方法
2013/04/26 PHP
php快递单号查询接口使用示例
2014/05/05 PHP
php实例分享之二维数组排序
2014/05/15 PHP
服务器迁移php版本不同可能诱发的问题
2015/12/22 PHP
php封装的page分页类完整实例
2016/10/18 PHP
PHP实现绘制二叉树图形显示功能详解【包括二叉搜索树、平衡树及红黑树】
2017/11/16 PHP
Thinkphp5+Redis实现商品秒杀代码实例讲解
2020/12/29 PHP
JS DOM 操作实现代码
2010/08/01 Javascript
jQuery的观察者模式详解
2014/12/22 Javascript
原生js实现jquery函数animate()动画效果的简单实例
2016/08/21 Javascript
jQuery插件fullPage.js实现全屏滚动效果
2016/12/02 Javascript
基于jquery实现五星好评
2017/11/18 jQuery
js正则表达式校验指定字符串的方法
2018/07/23 Javascript
详解小程序退出页面时清除定时器
2019/04/28 Javascript
vue使用recorder.js实现录音功能
2019/11/22 Javascript
[10:39]DOTA2上海特级锦标赛音乐会纪录片
2016/03/21 DOTA
python进程管理工具supervisor的安装与使用教程
2017/09/05 Python
Django实战之用户认证(用户登录与注销)
2018/07/16 Python
python 把列表转化为字符串的方法
2018/10/23 Python
详解python深浅拷贝区别
2019/06/24 Python
pymysql模块的使用(增删改查)详解
2019/09/09 Python
Django实现简单网页弹出警告代码
2019/11/15 Python
Python使用jpype模块调用jar包过程解析
2020/07/29 Python
HTML5+CSS3实现无插件拖拽上传图片(支持预览与批量)
2017/01/05 HTML / CSS
Stylenanda中文站:韩国一线网络服装品牌
2016/12/22 全球购物
美国环保婴儿用品公司:The Honest Company
2017/11/23 全球购物
FOREO斐珞尔官方旗舰店:LUNA露娜洁面仪
2018/03/11 全球购物
联想西班牙官网:Lenovo西班牙
2018/08/28 全球购物
自动化毕业生专业自荐书范文
2014/02/04 职场文书
文明寄语大全
2014/04/11 职场文书
我的中国梦演讲稿高中篇
2014/08/19 职场文书
公司放假通知范文
2015/04/14 职场文书
2016暑期校本培训心得体会
2016/01/08 职场文书
小学一年级语文教学反思
2016/03/03 职场文书
PostgreSQL并行计算算法及参数强制并行度设置方法
2022/04/06 PostgreSQL