PHP实现微信随机红包算法和微信红包的架构设计简介
1、微信的金额什么时候算？ 答：微信金额是拆的时候实时算出来，不是预先分配的，采用的是纯内存计算，不需要预算空间存储。。 采取实时计算金额的考虑：预算需要占存储，实时效率很高，预算才效率低。2、实时性：为什么明明抢到红包，点开后发现没有？ 答：2014年的红包一点开就知道金额，分两次操作，先抢到金额，然后再转账。 2015年的红包的拆和抢是分离的，需要点两次，因此会出现抢到红包了，但点开后告知红包已经被领完的状况。进入到第一个页面不代表抢到，只表示当时红包还有。3、分配：红包里的金额怎么算？为什么出现各个红包金额相差很大？ 答：随机，额度在0.01和剩余平均值*2之间。 例如：发100块钱，总共10个红包，那么平均值是10块钱一个，那么发出来的红包的额度在0.01元～20元之间波动。 当前面3个红包总共被领了40块钱时，剩下60块钱，总共7个红包，那么这7个红包的额度在：0.01～（60/7*2）=17.14之间。 注意：这里的算法是每被抢一个后，剩下的会再次执行上面的这样的算法（Tim老师也觉得上述算法太复杂，不知基于什么样的考虑）。这样算下去，会超过最开始的全部金额，因此到了最后面如果不够这么算，那么会采取如下算法：保证剩余用户能拿到最低1分钱即可。如果前面的人手气不好，那么后面的余额越多，红包额度也就越多，因此实际概率一样的。4、红包的设计 答：微信从财付通拉取金额数据郭莱，生成个数/红包类型/金额放到redis集群里，app端将红包ID的请求放入请求队列中，如果发现超过红包的个数，直接返回。根据红包的裸祭处理成功得到令牌请求，则由财付通进行一致性调用，通过像比特币一样，两边保存交易记录，交易后交给第三方服务审计，如果交易过程中出现不一致就强制回归。5、发性处理：红包如何计算被抢完？ 答：cache会抵抗无效请求，将无效的请求过滤掉，实际进入到后台的量不大。cache记录红包个数，原子操作进行个数递减，到0表示被抢光。财付通按照20万笔每秒入账准备，但实际还不到8万每秒。6、通如何保持8w每秒的写入？ 答：多主sharding，水平扩展机器。7、据容量多少？ 答：一个红包只占一条记录，有效期只有几天，因此不需要太多空间。8、询红包分配，压力大不？ 答：抢到红包的人数和红包都在一条cache记录上，没有太大的查询压力。9、一个红包一个队列？ 答：没有队列，一个红包一条数据，数据上有一个计数器字段。10、有没有从数据上证明每个红包的概率是不是均等？ 答：不是绝对均等，就是一个简单的拍脑袋算法。11、拍脑袋算法，会不会出现两个最佳？ 答：会出现金额一样的，但是手气最佳只有一个，先抢到的那个最佳。12、每领一个红包就更新数据么？ 答：每抢到一个红包，就cas更新剩余金额和红包个数。13、红包如何入库入账？ 数据库会累加已经领取的个数与金额，插入一条领取记录。入账则是后台异步操作。14、入帐出错怎么办？比如红包个数没了，但余额还有？ 答：最后会有一个take all操作。另外还有一个对账来保障。 使用PHP发红包，当我们输入红包数量和总金额后，PHP会根据这两个值进行随机分配每个金额，保证每个人都能领取到一个红包，每个红包金额不等，就是要求红包金额要有差异，所有红包金额总额应该等于总金额。首先给大家分析下规律：设定总金额为10元，有N个人随机领取：N=1 第一个则红包金额=X元；N=2 第二个为保证第二个红包可以正常发出，第一个红包金额=0.01至9.99之间的某个随机数。第二个红包=10-第一个红包金额；N=3 第三个红包1=0.01至9.99之间的某个随机数红包2=0.01至(10-红包1-0.01)的某个随机数红包3=10-红包1-红包2……于是我们得到一个规律，在分配当前红包金额时，先预留剩余红白所需最少金额，然后在0.01至总金额-预留金额间取随机数，得到的随机数就是当前红包分配的金额。实际应用中，程序先将红包金额分配好，即发红包时，红包个数以及每个红包的金额都分配好了，那么用户来抢红包时，我们随机给用户返回一个红包即可。微信红包分配算法代码： $total=19.5;//红包总金额 $num=9;// 分成10个红包，支持10人随机领取 $min=0.01;//每个人最少能收到0.01元 $money_arr=array(); //存入随机红包金额结果 for ($i=1;$i<$num;$i++) { $safe_total=($total-($num-$i)*$min)/($num-$i);//随机安全上限 $money= mt_rand($min*100,$safe_total*100)/100; $total=$total-$money; $money_arr[]= $money; echo '第'.$i.'个红包：'.$money.' 元，余额：'.$total.' 元 '." "; } echo '第'.$num.'个红包：'.round($total,2).' 元，余额：0 元'; $money_arr[] = round($total,2); dd($money_arr); 运行以上代码，会输出以下结果：第1个红包：2.15 元，余额：17.35 元 第2个红包：1.46 元，余额：15.89 元 第3个红包：2.23 元，余额：13.66 元 第4个红包：2.43 元，余额：11.23 元 第5个红包：2.37 元，余额：8.86 元 第6个红包：0.1 元，余额：8.76 元 第7个红包：2.26 元，余额：6.5 元 第8个红包：2.09 元，余额：4.41 元 第9个红包：4.41 元，余额：0 元以上就是使用php实现微信发红包程序，希望对大家有所帮助！
这篇文章主要为大家详细介绍了php微信公众号开发之欢迎老朋友，具有一定的参考价值，感兴趣的小伙伴们可以参考一下本文实例为大家分享了php微信公众号开发之欢迎老朋友的具体代码，供大家参考，具体内容如下介绍数据库inserticonv 进行数据库转码函数fromusername关键代码如下：$postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA); $fromUsername = $postObj->FromUserName; $toUsername = $postObj->ToUserName; $keyword = trim($postObj->Content); $time = time(); $textTpl = "<xml> <ToUserName> %s </ToUserName> <FromUserName> %s </FromUserName> <CreateTime>%s</CreateTime> <MsgType> %s </MsgType> <Content> %s </Content> <FuncFlag>0</FuncFlag> </xml>"; if(!empty( $keyword )) { //用 户 名 : $user //密 码 : $pwd //主库域名 : $host //从库域名 : SAE_MYSQL_HOST_S //端 口 : $port //数据库名 : $dbname $dbname = "app_dq095"; $host = "w.rdc.sae.sina.com.cn"; $port = "3306"; $user = "4k514n103z"; $pwd = "2402314li2j1i5im1xy2xizj5y332w2x41k2z203"; /*接着调用mysql_connect()连接服务器*/ // 连主库 $db = mysql_connect($host,$user,$pwd); if(!$db){ die("Connect Server Failed: " . mysql_error($db)); } /*连接成功后立即调用mysql_select_db()选中需要连接的数据库*/ if (!mysql_select_db($dbname)) { die("Select Database Failed: " . mysql_error($db)); } mysql_query("set names utf-8",$db); /*至此连接已完全建立，就可对当前数据库进行相应的操作了*/ /*！！！注意，无法再通过本次连接调用mysql_select_db来切换到其它数据库了！！！*/ /* 需要再连接其它数据库，请再使用mysql_connect+mysql_select_db启动另一个连接*/ /** * 接下来就可以使用其它标准php mysql函数操作进行数据库操作 */ $sql="SELECT * FROM `welcome`WHERE `user`= '" . iconv("UTF-8","GBK",$fromUsername) . "'"; $query=mysql_query($sql); $rs=mysql_fetch_array($query); $b= $rs['user']; $c=iconv("GBK","UTF-8",$b); $msgType = "text"; if ($c==$fromUsername) { $contentStr = "欢迎老朋友!"; }else{ $sql="INSERT INTO `welcome`(`id`,`user`) VALUES (NULL,'{$fromUsername}')"; mysql_query($sql); $contentStr = "欢迎新朋友!"; } $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr); echo $resultStr; mysql_close($db); }else{ echo "Input something..."; }完整代码如下： <?php /** * wechat php test */ //define your token define("TOKEN", "weixin"); $wechatObj = new wechatCallbackapiTest(); $wechatObj->responseMsg(); class wechatCallbackapiTest { public function valid() { $echoStr = $_GET["echostr"]; //valid signature , option if($this->checkSignature()){ echo $echoStr; exit; } } public function responseMsg() { //get post data, May be due to the different environments $postStr = $GLOBALS["HTTP_RAW_POST_DATA"]; //extract post data if (!empty($postStr)){ $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA); $fromUsername = $postObj->FromUserName; $toUsername = $postObj->ToUserName; $keyword = trim($postObj->Content); $time = time(); $textTpl = "<xml> <ToUserName> %s </ToUserName> <FromUserName> %s </FromUserName> <CreateTime>%s</CreateTime> <MsgType> %s </MsgType> <Content> %s </Content> <FuncFlag>0</FuncFlag> </xml>"; if(!empty( $keyword )) { //用 户 名 : $user //密 码 : $pwd //主库域名 : $host //从库域名 : SAE_MYSQL_HOST_S //端 口 : $port //数据库名 : $dbname $dbname = "app_dq095"; $host = "w.rdc.sae.sina.com.cn"; $port = "3306"; $user = "4k514n103z"; $pwd = "2402314li2j1i5im1xy2xizj5y332w2x41k2z203"; /*接着调用mysql_connect()连接服务器*/ // 连主库 $db = mysql_connect($host,$user,$pwd); if(!$db){ die("Connect Server Failed: " . mysql_error($db)); } /*连接成功后立即调用mysql_select_db()选中需要连接的数据库*/ if (!mysql_select_db($dbname)) { die("Select Database Failed: " . mysql_error($db)); } mysql_query("set names utf-8",$db); /*至此连接已完全建立，就可对当前数据库进行相应的操作了*/ /*！！！注意，无法再通过本次连接调用mysql_select_db来切换到其它数据库了！！！*/ /* 需要再连接其它数据库，请再使用mysql_connect+mysql_select_db启动另一个连接*/ /** * 接下来就可以使用其它标准php mysql函数操作进行数据库操作 */ $sql="SELECT * FROM `welcome`WHERE `user`= '" . iconv("UTF-8","GBK",$fromUsername) . "'"; $query=mysql_query($sql); $rs=mysql_fetch_array($query); $b= $rs['user']; $c=iconv("GBK","UTF-8",$b); $msgType = "text"; if ($c==$fromUsername) { $contentStr = "欢迎老朋友!"; }else{ $sql="INSERT INTO `welcome`(`id`,`user`) VALUES (NULL,'{$fromUsername}')"; mysql_query($sql); $contentStr = "欢迎新朋友!"; } $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr); echo $resultStr; mysql_close($db); }else{ echo "Input something..."; } }else { echo ""; exit; } } private function checkSignature() { $signature = $_GET["signature"]; $timestamp = $_GET["timestamp"]; $nonce = $_GET["nonce"]; $token = TOKEN; $tmpArr = array($token, $timestamp, $nonce); sort($tmpArr); $tmpStr = implode( $tmpArr ); $tmpStr = sha1( $tmpStr ); if( $tmpStr == $signature ){ return true; }else{ return false; } } } ?> 以上就是本文的全部内容，希望对大家的学习有所帮助，也希望大家多多支持脚本之家。
PHP实现微信自定义分享图片，标题，描述
PHP实现微信自定义分享图片，标题，描述weshare.php<?php // 步骤1.设置appid和appsecret $appid = 'wxabcddefjfgghg'; $appsecret = 'fdsfagewafasdf125f1d5f15e3fc'; // 步骤2.生成签名的随机串 function nonceStr($length){ $str = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';//62个字符 $strlen = 62; while($length > $strlen){ $str .= $str; $strlen += 62; } $str = str_shuffle($str); return substr($str,0,$length); } // 步骤3.获取access_token $result = http_get('https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid='.$appid.'&secret='.$appsecret); $json = json_decode($result,true); $access_token = $json['access_token']; function http_get($url){ $oCurl = curl_init(); if(stripos($url,"https://")!==FALSE){ curl_setopt($oCurl, CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt($oCurl, CURLOPT_SSL_VERIFYHOST, FALSE); curl_setopt($oCurl, CURLOPT_SSLVERSION, 1); //CURL_SSLVERSION_TLSv1 } curl_setopt($oCurl, CURLOPT_URL, $url); curl_setopt($oCurl, CURLOPT_RETURNTRANSFER, 1 ); $sContent = curl_exec($oCurl); $aStatus = curl_getinfo($oCurl); curl_close($oCurl); if(intval($aStatus["http_code"])==200){ return $sContent; }else{ return false; } } // 步骤4.获取ticket $url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?type=jsapi&access_token=$access_token"; $res = json_decode ( http_get ( $url ) ); $ticket = $res->ticket; function getWxConfig($appid,$jsapiTicket,$url,$timestamp,$nonceStr) { $string = "jsapi_ticket=$jsapiTicket&noncestr=$nonceStr&timestamp=$timestamp&url=$url"; $signature = sha1 ( $string ); $WxConfig["appId"] = $appid; $WxConfig["nonceStr"] = $nonceStr; $WxConfig["timestamp"] = $timestamp; $WxConfig["url"] = $url; $WxConfig["signature"] = $signature; $WxConfig["rawString"] = $string; return $WxConfig; } // 步骤5.生成wx.config需要的参数 $surl = 'http://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']; $ws = getWxConfig( $appid,$ticket,$surl,time(),nonceStr(16) ); ?> demo.php<?php //require .'/weshare.php';// define('ROOT_PATH', dirname(__FILE__)); //define("MUYU" , true);//全局网站标示(防止恶意访问) 然而并没有卵用 require ROOT_PATH.'/weshare.php' ?> Share Demo // 步骤6.调用JS接口
PHP微信公众号开发之微信企业付款给个人
这篇文章主要为大家详细介绍了php微信公众号开发之微信企业付款给个人，具有一定的参考价值，感兴趣的小伙伴们可以参考一下本文实例为大家分享了php微信企业付款给个人的具体代码，供大家参考，具体内容如下以下有关微信支付中企业付款的介绍及编码参考自微信支付开发文档，如图所示<?php /* <!--微信企业付款给个人--!> 具体细节参考微信支付开发文档 参数 $openid个人openid $re_user_name个人真实姓名 $amount付款金额 $partner_trade_no商户订单号 $desc描述 如果付款成功，返回true,否则返回false */ private function weixin_transfer_money($openid,$re_user_name,$amount,$partner_trade_no,$desc){ //请求参数 //公众号appid（字段名）--mch_appid(变量名)--1(必填) //输入你的公众号appid $data['mch_appid']="**************"; //商户号--mchid--1 //输入你的商户号 $data['mchid']="*************"; //设备号--device_info--0 //随机字符串--nonce_str--1 $data['nonce_str']=$this->get_unique_value(); //签名--sign--1 $data['sign']=""; //商户订单号--partner_trade_no--1 $data['partner_trade_no']=$partner_trade_no; //用户openid--openid--1 $data['openid']=$openid; //校验用户姓名选项--check_name--1 $data['check_name']="OPTION_CHECK"; //收款用户姓名--re_user_name--0 $data['re_user_name']=$re_user_name; //金额--amount--1 $data['amount']=$amount; //企业付款描述信息--desc--1 $data['desc']=$desc; //IP地址--spbill_create_ip--1 $data['spbill_create_ip']=$_SERVER['LOCAL_ADDR']; //生成签名 //对数据数组进行处理 //API密钥，输入你的appsecret $appsecret="*************"; $data=array_filter($data); ksort($data); $str=""; foreach($data as $k=>$v){ $str.=$k."=".$v."&"; } $str.="key=".$appsecret; $data['sign']=strtoupper(MD5($str)); /* 付款操作： 1.将请求数据转换成xml 2.发送请求 3.将请求结果转换为数组 4.将请求信息和请求结果录入到数据库中 5.判断是否通信成功 6.判断是否付款成功 */ //企业付款接口地址 $url="https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers"; //1.将请求数据由数组转换成xml $xml=$this->arraytoxml($data); //2.进行请求操作 $res=$this->curl($xml,$url); //3.将请求结果由xml转换成数组 $arr=$this->xmltoarray($res); //4.将请求信息和请求结果录入到数据库中，可以根据自己的需要进行处理，$arr是返回的结果数组 $transfer['partner_trade_no']=$data['partner_trade_no']; $transfer['request_data']=serialize($data); $transfer['response_data']=serialize($arr); if($arr['return_code']=="SUCCESS" && $arr['result_code']=="SUCCESS"){ //5. 判断是否通讯成功 6.判断是否付款成功 $transfer['success']=1; $transfer_res['success']=1; }else{ $transfer['success']=0; $transfer_res['success']=0; $transfer_res['desc']=$arr['return_msg']; } $transfer['add_time']=time(); D("weixin_transfer")->add($transfer); return $transfer_res; } // 生成32位唯一随机字符串 private function get_unique_value(){ $str=uniqid(mt_rand(),1); $str=sha1($str); return md5($str); } // 将数组转换成xml private function arraytoxml($arr){ $xml="<xml>"; foreach($arr as $k=>$v){ $xml.="<".$k.">".$v."</".$k.">"; } $xml.="</xml>"; return $xml; } // 将xml转换成数组 private function xmltoarray($xml){ //禁止引用外部xml实体 libxml_disable_entity_loader(true); $xmlstring=simplexml_load_string($xml,"SimpleXMLElement",LIBXML_NOCDATA); $arr=json_decode(json_encode($xmlstring),true); return $arr; } //进行curl操作 private function curl($param="",$url) { $postUrl = $url; $curlPost = $param; //初始化curl $ch = curl_init(); //抓取指定网页 curl_setopt($ch, CURLOPT_URL,$postUrl); //设置header curl_setopt($ch, CURLOPT_HEADER, 0); //要求结果为字符串且输出到屏幕上 curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); //post提交方式 curl_setopt($ch, CURLOPT_POST, 1); // 增加 HTTP Header（头）里的字段 curl_setopt($ch, CURLOPT_POSTFIELDS, $curlPost); // 终止从服务端进行验证 curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); //这个是证书的位置 curl_setopt($ch,CURLOPT_SSLCERT,getcwd().'\cert\apiclient_cert.pem'); //这个也是证书的位置 curl_setopt($ch,CURLOPT_SSLKEY,getcwd().'\cert\apiclient_key.pem'); //运行curl $data = curl_exec($ch); //关闭curl curl_close($ch); //返回结果 return $data; }以上就是本文的全部内容，希望对大家的学习有所帮助，也希望大家多多支持轩宇网。
这篇文章主要为大家详细介绍了php实现微信企业转账功能，具有一定的参考价值，感兴趣的小伙伴们可以参考一下本文实例为大家分享了php实现微信企业转账的具体代码，供大家参考，具体内容如下：WxTransfers.Config.php<?php /** * 配置账号信息 * 配置要和证书在一起！！！！ */ class WxTransfersConfig { //=======【基本信息设置】============== // /** * TODO: 修改这里配置为您自己申请的商户信息 * 微信公众号信息配置 * * APPID：绑定支付的APPID（必须配置，开户邮件中可查看） * * MCHID：商户号（必须配置，开户邮件中可查看） * * KEY：商户支付密钥，参考开户邮件设置（必须配置，登录商户平台自行设置） * 设置地址：https://pay.weixin.qq.com/index.php/account/api_cert * */ const APPID = ''; const MCHID = ''; const KEY = ''; //=======【证书路径设置】===================================== /** * TODO：设置商户证书路径 * 证书路径,注意应该填写绝对路径,发送红包和查询需要，可登录商户平台下载 * API证书下载地址：https://pay.weixin.qq.com/index.php/account/api_cert，下载之前需要安装商户操作证书） * @var path 跟这个文件同一目录下的cert文件夹放置证书！！！！ */ const SSLCRET12 = 'cert/apiclient_cert.p12'; const SSLCERT_PATH = 'cert/apiclient_cert.pem'; const SSLKEY_PATH = 'cert/apiclient_key.pem'; const SSLROOTCA = 'cert/rootca.pem'; //=======【证书路径设置】===================================== /** * 获取文件的路径，证书需要完整路径 * @return string */ public static function getRealPath(){ return __DIR__.'/'; } } WxTransfers.Api.php<?php require_once "WxTransfers.Config.php"; /** * 微信企业转账工具类 */ class WxTransfers { // 企业转账请求地址 const TRANSFERS_URL = 'https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers'; //获取转账信息地址 const GETINFO_URL='https://api.mch.weixin.qq.com/mmpaymkttransfers/gettransferinfo'; // 转账需要的配置 'wxappid','mch_id','key' private $_keys; // 转账需要的证书文件 'api_cert', 'api_key', 'rootca',请传入绝对路径！！！ private $_cert; protected $log_file; public $error; // 相关配置必备参数 protected $_parameters = array(); // 最后一次生产的订单号 protected $_lastPartnerTradeNo; // 记录最后一次发送请求的结果对象 protected $_lastResult; // 最后一次随机数 protected $_lastRandNum; public function __construct($config) { $keys = array( 'wxappid', 'mch_id', 'key' ); $files = array( 'api_cert', 'api_key', 'rootca' ); foreach ($keys as $key) { try { $this->_keys[$key] = $config[$key]; } catch (Exception $e) { throw new Exception('参数缺失：' . $key); } } foreach ($files as $file) { try { $cret_file = $config[$file]; if (is_file($cret_file)) { $this->_cert[$file] = $cret_file; } } catch (Exception $e) { throw new Exception('证书错误'); } } } public function transfers($parameters){ $this->log($parameters, 'SEND_PARAM'); $this->setParameter('mchid', $this->_keys['mch_id']); $this->setParameter('mch_appid', $this->_keys['wxappid']); $must = array( 'openid', 'check_name', 're_user_name', 'amount', 'desc', 'spbill_create_ip', ); foreach ($must as $key) { if (isset($parameters[$key]) && $parameters[$key]) { $this->setParameter($key, $parameters[$key]); } else if (! isset($this->_parameters[$key]) || ! $this->_parameters[$key]) { $this->error = '参数缺损:' . $key; return false; } } if (! isset($parameters['partner_trade_no'])) { $parameters['partner_trade_no'] = $this->getPartnerTradeNo(); } $this->setParameter('partner_trade_no', $parameters['partner_trade_no']); $this->setParameter('nonce_str', $this->getRand(30, 3)); $postXml = $this->_createXml(); if (! $postXml) { return false; } $this->log($postXml, 'SEND_XML'); $result = $this->curl_post_ssl(self::TRANSFERS_URL, $postXml); $this->log($result, 'RESULT_XML'); if (! $result) { return false; } $resultObj = simplexml_load_string($result, 'SimpleXMLElement', LIBXML_NOCDATA); $this->_lastResult = $resultObj; if ($resultObj->return_code == 'SUCCESS') { // 成功标识 if ($resultObj->result_code == 'SUCCESS') { return $resultObj->send_listid; } if ($resultObj->return_msg) { $this->error = (string) $resultObj->return_msg; return false; } $this->error = (string) $resultObj->err_code_des; return false; } if ($resultObj->return_code != 'FAIL') { $this->error = '返回信息格式异常'; return false; } $this->error = (string) $resultObj->return_msg; return false; } /** * 获取转账信息 * @param unknown $partner_trade_no * @return boolean|SimpleXMLElement */ public function getInfo($partner_trade_no){ $param = array( 'nonce_str' => $this->getRand(30, 3), 'partner_trade_no'=> $partner_trade_no , 'mch_id' => $this->_keys['mch_id'], 'appid' => $this->_keys['wxappid'], ); ksort($param); $unSignParaString = $this->_formatQueryParaMap($param, false); $param['sign'] = $this->_sign($unSignParaString, $this->_keys['key']); $xml = $this->arrayToXml($param); $this->log($xml, 'GETINFO_XML'); $result = $this->curl_post_ssl(self::GETINFO_URL, $xml); if(!$result){ return false ; } $this->log($result, 'RESULT_XML'); $resultObj = simplexml_load_string($result, 'SimpleXMLElement', LIBXML_NOCDATA); $this->_lastResult = $resultObj ; if($resultObj->return_code == 'SUCCESS'){//成功标识 if($resultObj->result_code == 'SUCCESS'){ return $resultObj ; } if($resultObj->return_msg){ $this->error = $resultObj->return_msg ; return false ; } $this->error = $resultObj->err_code_des ; return false ; } if($resultObj->return_code != 'FAIL'){ $this->error = '返回信息格式异常'; return false ; } $this->error = $resultObj->return_msg ; return false ; } /** * 设置所需要的参数 * @param $parameter 键值数组/键 * @param $value 值 * @return WxBonusApi */ public function setParameter($parameter, $value = null) { if (! is_array($parameter)) { return $this->setParameter(array( $parameter => $value )); } foreach ($parameter as $key => $value) { $key = trim($key); $value = trim($value); $this->_parameters[$key] = $value; } return $this; } /** * 获取参数值 * @param $parameter 键名 * @return multitype: */ public function getParameter($parameter) { return $this->_parameters[$parameter]; } /** * 获取随机数 * @param number $len 随机数的位数 * @param number $type 取值范围 1表示数字 2小写字母 4大写字母 * @return string */ public function getRand($len = 30, $type = 0) { $str = ''; $max = - 1; if (! $type) { $type = 3; } if ($type & 1) { $str .= '1234567890'; $max += 10; } if ($type & 2) { $str .= 'abcdefghijklmnopqrstuvwxyz'; $max += 26; } if ($type & 4) { $str .= 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'; $max += 26; } $rand = ''; for ($i = 0; $i < $len; $i ++) { $rand .= $str[rand(0, $max)]; } return $rand; } /** * 生成商户的订单号 * @return string */ public function getPartnerTradeNo() { $this->_lastPartnerTradeNo = $this->_parameters['mch_id'] . date('YmdHis') . $this->getRand(4, 1); // $this->getRandNum(); return $this->_lastPartnerTradeNo; } /** * 获取最后一次创建生成的订单号 * @return string */ public function getLastPartnerTradeNo() { return $this->_lastPartnerTradeNo; } /** * 创建XML的方法 * @param number $retcode * @param string $reterrmsg * @return boolean|string */ private function _createXml() { try { $sign = $this->_getSign(); if (! $sign) { return false; } $this->setParameter('sign', $sign); return $this->arrayToXml($this->_parameters); } catch (Exception $e) { $this->error = $e->getMessage(); return false; } } /** * 参数转换成XML * @param array $arr 参数数组 * @return string */ public function arrayToXml($arr) { $xml = "<xml>"; foreach ($arr as $key => $val) { if (is_numeric($val)) { $xml .= "<" . $key . ">" . $val . "</" . $key . ">"; } else { $xml .= "<" . $key . "> " . $val . " </" . $key . ">"; } } $xml .= "</xml>"; return $xml; } /** * 获得签名结果 * @return boolean|Ambigous <string, boolean> */ protected function _getSign() { try { if ($this->_checkSign() == false) { // 检查生成签名参数 $this->error = '生成签名参数缺失！'; $this->log(json_encode($this->_parameters, JSON_UNESCAPED_UNICODE), 'ERROR_Sign_XML'); return false; } ksort($this->_parameters); $unSignParaString = $this->_formatQueryParaMap($this->_parameters, false); return $this->_sign($unSignParaString, $this->_keys['key']); } catch (Exception $e) { $this->error = $e->getMessage(); return false; } } /** * 检查签名所需参数是否齐全 * @return boolean */ private function _checkSign() { // return true; if ($this->_parameters["mch_appid"] == null || $this->_parameters["mchid"] == null || //$this->_parameters["device_info"] == null || 设备id $this->_parameters["nonce_str"] == null || $this->_parameters["partner_trade_no"] == null || $this->_parameters["openid"] == null || $this->_parameters["check_name"] == null || $this->_parameters["re_user_name"] == null || $this->_parameters["desc"] == null || $this->_parameters["spbill_create_ip"] == null) { return false; } return true; } /** * * @param $paraMap * @param $urlencode * @return string */ private function _formatQueryParaMap($paraMap,$urlencode) { $buff = ""; ksort($paraMap); foreach ($paraMap as $k => $v) { if (null != $v && "null" != $v && "sign" != $k) { if ($urlencode) { $v = urlencode($v); } $buff .= $k . "=" . $v . "&"; } } $reqPar; if (strlen($buff) > 0) { $reqPar = substr($buff, 0, strlen($buff) - 1); } return $reqPar; } /** * 签名 * @param $content 签名的字符串 * @param $key 密钥 * @throws Exception * @return string|boolean */ private function _sign($content, $key) { try { if (null == $key) { $this->error = '签名key不能为空！'; return false; } if (null == $content) { $this->error = '签名内容不能为空'; return false; } $signStr = $content . "&key=" . $key; return strtoupper(md5($signStr)); } catch (Exception $e) { $this->error = $e->getMessage(); return false; } } /** * cURL抓取 * * @param $url 链接地址 * @param $vars 参数 * @param * $second * @param * $aHeader * @return mixed|boolean */ function curl_post_ssl($url, $data, $second = 30, $aHeader = array()) { $ch = curl_init(); // 超时时间 curl_setopt($ch, CURLOPT_TIMEOUT, $second); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // 这里设置代理，如果有的话 curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); // cert 与 key 分别属于两个.pem文件 curl_setopt($ch, CURLOPT_SSLCERT, $this->_cert['api_cert']); curl_setopt($ch, CURLOPT_SSLKEY, $this->_cert['api_key']); curl_setopt($ch, CURLOPT_CAINFO, $this->_cert['rootca']); if (count($aHeader) >= 1) { curl_setopt($ch, CURLOPT_HTTPHEADER, $aHeader); } curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $data); $data = curl_exec($ch); if ($data) { curl_close($ch); return $data; } else { $this->log(json_encode($this->_cert)); $this->error = 'aa:'.curl_errno($ch); curl_close($ch); return false; } } /** * 获取服务器ip * * @return string */ public function getServerIp() { $server_ip = '127.0.0.1'; if (isset($_SERVER)) { if (isset($_SERVER['SERVER_ADDR']) && $_SERVER['SERVER_ADDR']) { $server_ip = $_SERVER['SERVER_ADDR']; } elseif (isset($_SERVER['LOCAL_ADDR']) && $_SERVER['LOCAL_ADDR']) { $server_ip = $_SERVER['LOCAL_ADDR']; } } else { $server_ip = getenv('SERVER_ADDR'); } return $server_ip; } /** * 设置日志目录文件 * * @param unknown $file */ public function setLogFile($file) { $this->log_file = $file; } /** * 写日志 * * @param $msg 写入的信息 * @param $type 日志类型作为查询标示 */ public function log($msg, $type) { if ($this->log_file) { $log = str_replace(array( "\r\n", "\r", "\n" ), array( "", "", "" ), $msg); error_log($type . ' ' . date('Y-m-d H:i:s') . ' ' . json_encode($log,JSON_UNESCAPED_UNICODE) . "\r\n", 3, $this->log_file); } } } 使用方法：<?php include 'WxTransfers.Api.php'; class WxTransfers{ /** *调用方法即可测试 */ public function index(){ $path = WxTransfersConfig::getRealPath(); // 证书文件路径 $config['wxappid'] = WxTransfersConfig::APPID; $config['mch_id'] = WxTransfersConfig::MCHID; $config['key'] = WxTransfersConfig::KEY; $config['PARTNERKEY'] = WxTransfersConfig::KEY; $config['api_cert'] = $path . WxTransfersConfig::SSLCERT_PATH; $config['api_key'] = $path . WxTransfersConfig::SSLKEY_PATH; $config['rootca'] = $path . WxTransfersConfig::SSLROOTCA; $wxtran=new WxTransfers($config); $wxtran->setLogFile('D:\\transfers.log');//日志地址 //转账 $data=array( 'openid'=>'',//openid 'check_name'=>'NO_CHECK',//是否验证真实姓名参数 're_user_name'=>'11',//姓名 'amount'=>100,//最小1元 也就是100 'desc'=>'企业转账测试',//描述 'spbill_create_ip'=>$wxtran->getServerIp(),//服务器IP地址 ); var_dump(json_encode($wxtran->transfers($data),JSON_UNESCAPED_UNICODE)); var_dump($wxtran->error); //获取转账信息 var_dump($wxtran->getInfo('11111111')); var_dump($wxtran->error); } } 以上就是本文的全部内容，希望对大家的学习有所帮助，也希望大家多多支持轩宇网。
php实现微信订阅号天气预报及论坛地址功能开发
使用PHP实现微信订阅号天气预报及论坛地址功能开发index.php代码<?php /* 轩宇工作室 CopyRight 2014 All Rights Reserved */ //定义TOKEN define("TOKEN", "weixin"); $wechatObj = new wechatCallbackapiTest(); if (!isset($_GET['echostr'])) { $wechatObj->responseMsg(); }else{ $wechatObj->valid(); } class wechatCallbackapiTest { //验证签名 public function valid() { $echoStr = $_GET["echostr"]; $signature = $_GET["signature"]; $timestamp = $_GET["timestamp"]; $nonce = $_GET["nonce"]; $token = TOKEN; $tmpArr = array($token, $timestamp, $nonce); sort($tmpArr); $tmpStr = implode($tmpArr); $tmpStr = sha1($tmpStr); if($tmpStr == $signature){ echo $echoStr; exit; } } public function responseMsg() { $postStr = $GLOBALS["HTTP_RAW_POST_DATA"]; if (!empty($postStr)){ $this->logger("R ".$postStr); $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA); $RX_TYPE = trim($postObj->MsgType); $result = ""; switch ($RX_TYPE) { case "event": $result = $this->receiveEvent($postObj); break; case "text": $result = $this->receiveText($postObj); break; } $this->logger("T ".$result); echo $result; }else { echo ""; exit; } } private function receiveEvent($object) { switch ($object->Event) { case "subscribe": $content = "欢迎关注鸟击知识平台 "; break; } $result = $this->transmitText($object, $content); return $result; } private function receiveText($object) { $keyword = trim($object->Content); //判断天气 if (strstr($keyword, "天气")){ $city = str_replace('天气', '', $keyword); include("weather.php"); $content = getWeatherInfo($city); //判断论坛，输入论坛直接发送图文消息并跳转到相应的链接地址 }else if (strstr($keyword, "论坛")){ $content[] = array("Title" =>"我们的论坛","Description" =>"", "PicUrl" =>"http://www.henkuai.com/template/mobanbus_qyv1/mobanbus_st/img//logo.png", "Url" =>"http://www.henkuai.com/"); }else{ $content = "功能未开发，请关注我们的最新消息。"."\n技术支持 轩宇工作室"."\n".date("Y-m-d H:i:s",time()); } if(is_array($content)){ if (isset($content[0]['PicUrl'])){ $result = $this->transmitNews($object, $content); }else if (isset($content['MusicUrl'])){ $result = $this->transmitMusic($object, $content); } }else{ $result = $this->transmitText($object, $content); } return $result; } private function transmitText($object, $content) { if (!isset($content) || empty($content)){ return ""; } $textTpl = "<xml> <ToUserName> %s </ToUserName> <FromUserName> %s </FromUserName> <CreateTime>%s</CreateTime> <MsgType> text </MsgType> <Content> %s </Content> </xml>"; $result = sprintf($textTpl, $object->FromUserName, $object->ToUserName, time(), $content); return $result; } private function transmitNews($object, $newsArray) { if(!is_array($newsArray)){ return ""; } $itemTpl = " <item> <Title> %s <Description> %s </Description> <PicUrl> %s </PicUrl> <Url> %s </Url> </item> "; $item_str = ""; foreach ($newsArray as $item){ $item_str .= sprintf($itemTpl, $item['Title'], $item['Description'], $item['PicUrl'], $item['Url']); } $newsTpl = "<xml> <ToUserName> %s </ToUserName> <FromUserName> %s </FromUserName> <CreateTime>%s</CreateTime> <MsgType> news </MsgType> <Content> </Content> <ArticleCount>%s</ArticleCount> <Articles> $item_str</Articles> </xml>"; $result = sprintf($newsTpl, $object->FromUserName, $object->ToUserName, time(), count($newsArray)); return $result; } private function logger($log_content) { } } ?>weather.php代码<?php // var_dump(getWeatherInfo("深圳")); function getWeatherInfo($cityName) { if ($cityName == "" || (strstr($cityName, "+"))){ return "发送天气+城市，例如'天气深圳'"; } $url = "http://api.map.baidu.com/telematics/v3/weather?location=".urlencode($cityName)."&output=json&ak=ECe3698802b9bf4457f0e01b544eb6aa"; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $output = curl_exec($ch); curl_close($ch); $result = json_decode($output, true); if ($result["error"] != 0){ return $result["status"]; } $curHour = (int)date('H',time()); $weather = $result["results"][0]; $weatherArray[] = array("Title" =>$weather['currentCity']."天气预报", "Description" =>"", "PicUrl" =>"", "Url" =>""); for ($i = 0; $i < count($weather["weather_data"]); $i++) { $weatherArray[] = array("Title"=> $weather["weather_data"][$i]["date"]."\n". $weather["weather_data"][$i]["weather"]." ". $weather["weather_data"][$i]["wind"]." ". $weather["weather_data"][$i]["temperature"], "Description"=>"", "PicUrl"=>(($curHour >= 6) && ($curHour < 18))?$weather["weather_data"][$i]["dayPictureUrl"]:$weather["weather_data"][$i]["nightPictureUrl"], "Url"=>""); } return $weatherArray; } ?>
php官方微信接口大全（微信支付、微信红包、微信摇一摇、微信小店）
这篇文章主要介绍了php官方微信接口大全，包括微信支付、微信红包、微信摇一摇、微信小店，感兴趣的小伙伴们可以参考一下微信入口绑定，微信事件处理，微信API全部操作包含在这些文件中。内容有：微信摇一摇接口/微信多客服接口/微信支付接口/微信红包接口/微信卡券接口/微信小店接口/JSAPI<?php class WxApi { const appId = ""; const appSecret = ""; const mchid = ""; //商户号 const privatekey = ""; //私钥 public $parameters = array(); public $jsApiTicket = NULL; public $jsApiTime = NULL; 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; $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; } /**************************************************** * 微信获取ApiTicket 返回指定微信公众号的at信息 ****************************************************/ public function wxJsApiTicket($appId = NULL , $appSecret = NULL){ $appId = is_null($appId) ? self::appId : $appId; $appSecret = is_null($appSecret) ? self::appSecret : $appSecret; $url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?type=jsapi&access_token=".$this->wxAccessToken(); $result = $this->wxHttpsRequest($url); $jsoninfo = json_decode($result, true); $ticket = $jsoninfo['ticket']; //echo $ticket . " "; return $ticket; } public function wxVerifyJsApiTicket($appId = NULL , $appSecret = NULL){ if(!empty($this->jsApiTime) && intval($this->jsApiTime) > time() && !empty($this->jsApiTicket)){ $ticket = $this->jsApiTicket; } else{ $ticket = $this->wxJsApiTicket($appId,$appSecret); $this->jsApiTicket = $ticket; $this->jsApiTime = time() + 7200; } return $ticket; } /**************************************************** * 微信通过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; } /**************************************************** * 微信生成二维码ticket ****************************************************/ public function wxQrCodeTicket($jsonData){ $wxAccessToken = $this->wxAccessToken(); $url = "https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=".$wxAccessToken; $result = $this->wxHttpsRequest($url,$jsonData); return $result; } /**************************************************** * 微信通过ticket生成二维码 ****************************************************/ public function wxQrCode($ticket){ $url = "https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=" . urlencode($ticket); return $url; } /**************************************************** * 微信通过指定模板信息发送给指定用户，发送完成后返回指定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 = urldecode(json_encode($template)); echo $jsonData; $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; } /**************************************************** * 创建自定义菜单 ****************************************************/ public function wxMenuCreate($jsonData){ $wxAccessToken = $this->wxAccessToken(); $url = "https://api.weixin.qq.com/cgi-bin/menu/create?access_token=" . $wxAccessToken; $result = $this->wxHttpsRequest($url,$jsonData); $jsoninfo = json_decode($result, true); return $jsoninfo; } /**************************************************** * 获取自定义菜单 ****************************************************/ public function wxMenuGet(){ $wxAccessToken = $this->wxAccessToken(); $url = "https://api.weixin.qq.com/cgi-bin/menu/get?access_token=" . $wxAccessToken; $result = $this->wxHttpsRequest($url); $jsoninfo = json_decode($result, true); return $jsoninfo; } /**************************************************** * 删除自定义菜单 ****************************************************/ public function wxMenuDelete(){ $wxAccessToken = $this->wxAccessToken(); $url = "https://api.weixin.qq.com/cgi-bin/menu/delete?access_token=" . $wxAccessToken; $result = $this->wxHttpsRequest($url); $jsoninfo = json_decode($result, true); return $jsoninfo; } /**************************************************** * 获取第三方自定义菜单 ****************************************************/ public function wxMenuGetInfo(){ $wxAccessToken = $this->wxAccessToken(); $url = "https://api.weixin.qq.com/cgi-bin/get_current_selfmenu_info?access_token=" . $wxAccessToken; $result = $this->wxHttpsRequest($url); $jsoninfo = json_decode($result, true); return $jsoninfo; } /**************************************************** * 微信客服接口 - Add 添加客服人员 ****************************************************/ public function wxServiceAdd($jsonData){ $wxAccessToken = $this->wxAccessToken(); $url = "https://api.weixin.qq.com/customservice/kfaccount/add?access_token=" . $wxAccessToken; $result = $this->wxHttpsRequest($url,$jsonData); $jsoninfo = json_decode($result, true); return $jsoninfo; } /**************************************************** * 微信客服接口 - Update 编辑客服人员 ****************************************************/ public function wxServiceUpdate($jsonData){ $wxAccessToken = $this->wxAccessToken(); $url = "https://api.weixin.qq.com/customservice/kfaccount/update?access_token=" . $wxAccessToken; $result = $this->wxHttpsRequest($url,$jsonData); $jsoninfo = json_decode($result, true); return $jsoninfo; } /**************************************************** * 微信客服接口 - Delete 删除客服人员 ****************************************************/ public function wxServiceDelete($jsonData){ $wxAccessToken = $this->wxAccessToken(); $url = "https://api.weixin.qq.com/customservice/kfaccount/del?access_token=" . $wxAccessToken; $result = $this->wxHttpsRequest($url,$jsonData); $jsoninfo = json_decode($result, true); return $jsoninfo; } /******************************************************* * 微信客服接口 - 上传头像 *******************************************************/ public function wxServiceUpdateCover($kf_account, $media = '') { $wxAccessToken = $this->wxAccessToken(); //$data['access_token'] = $wxAccessToken; $data['media'] = '@D:\\workspace\\htdocs\\yky_test\\logo.jpg'; $url = "https:// api.weixin.qq.com/customservice/kfaccount/uploadheadimg?access_token=".$wxAccessToken."&kf_account=".$kf_account; $result = $this->wxHttpsRequest($url,$data); $jsoninfo = json_decode($result, true); return $jsoninfo; } /**************************************************** * 微信客服接口 - 获取客服列表 ****************************************************/ public function wxServiceList(){ $wxAccessToken = $this->wxAccessToken(); $url = "https://api.weixin.qq.com/cgi-bin/customservice/getkflist?access_token=" . $wxAccessToken; $result = $this->wxHttpsRequest($url); $jsoninfo = json_decode($result, true); return $jsoninfo; } /**************************************************** * 微信客服接口 - 获取在线客服接待信息 ****************************************************/ public function wxServiceOnlineList(){ $wxAccessToken = $this->wxAccessToken(); $url = "https://api.weixin.qq.com/cgi-bin/customservice/getonlinekflist?access_token=" . $wxAccessToken; $result = $this->wxHttpsRequest($url); $jsoninfo = json_decode($result, true); return $jsoninfo; } /**************************************************** * 微信客服接口 - 客服发送信息 ****************************************************/ public function wxServiceSend($jsonData){ $wxAccessToken = $this->wxAccessToken(); $url = "https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token=" . $wxAccessToken; $result = $this->wxHttpsRequest($url,$jsonData); $jsoninfo = json_decode($result, true); return $jsoninfo; } /**************************************************** * 微信客服会话接口 - 创建会话 ****************************************************/ public function wxServiceSessionAdd($jsonData){ $wxAccessToken = $this->wxAccessToken(); $url = "https://api.weixin.qq.com/customservice/kfsession/create?access_token=" . $wxAccessToken; $result = $this->wxHttpsRequest($url,$jsonData); $jsoninfo = json_decode($result, true); return $jsoninfo; } /**************************************************** * 微信客服会话接口 - 关闭会话 ****************************************************/ public function wxServiceSessionClose(){ $wxAccessToken = $this->wxAccessToken(); $url = "https://api.weixin.qq.com/customservice/kfsession/close?access_token=" . $wxAccessToken; $result = $this->wxHttpsRequest($url); $jsoninfo = json_decode($result, true); return $jsoninfo; } /**************************************************** * 微信客服会话接口 - 获取会话 ****************************************************/ public function wxServiceSessionGet($openId){ $wxAccessToken = $this->wxAccessToken(); $url = "https://api.weixin.qq.com/customservice/kfsession/getsession?access_token=".$wxAccessToken."&openid=" . $openId; $result = $this->wxHttpsRequest($url); $jsoninfo = json_decode($result, true); return $jsoninfo; } /**************************************************** * 微信客服会话接口 - 获取会话列表 ****************************************************/ public function wxServiceSessionList($kf_account){ $wxAccessToken = $this->wxAccessToken(); $url = "https://api.weixin.qq.com/customservice/kfsession/getsessionlist?access_token=".$wxAccessToken."&kf_account=" . $kf_account ; $result = $this->wxHttpsRequest($url); $jsoninfo = json_decode($result, true); return $jsoninfo; } /**************************************************** * 微信客服会话接口 - 未接入会话 ****************************************************/ public function wxServiceSessionWaitCase(){ $wxAccessToken = $this->wxAccessToken(); $url = "https://api.weixin.qq.com/customservice/kfsession/getwaitcase?access_token=".$wxAccessToken; $result = $this->wxHttpsRequest($url); $jsoninfo = json_decode($result, true); return $jsoninfo; } /**************************************************** * 微信摇一摇 - 申请设备ID ****************************************************/ public function wxDeviceApply($jsonData){ $wxAccessToken = $this->wxAccessToken(); $url = "https://api.weixin.qq.com/shakearound/device/applyid?access_token=" . $wxAccessToken; $result = $this->wxHttpsRequest($url,$jsonData); $jsoninfo = json_decode($result, true); return $jsoninfo; } /**************************************************** * 微信摇一摇 - 编辑设备ID ****************************************************/ public function wxDeviceUpdate($jsonData){ $wxAccessToken = $this->wxAccessToken(); $url = "https://api.weixin.qq.com/shakearound/device/update?access_token=" . $wxAccessToken; $result = $this->wxHttpsRequest($url,$jsonData); $jsoninfo = json_decode($result, true); return $jsoninfo; } /**************************************************** * 微信摇一摇 - 本店关联设备 ****************************************************/ public function wxDeviceBindLocation($jsonData){ $wxAccessToken = $this->wxAccessToken(); $url = "https://api.weixin.qq.com/shakearound/device/bindlocation?access_token=" . $wxAccessToken; $result = $this->wxHttpsRequest($url,$jsonData); $jsoninfo = json_decode($result, true); return $jsoninfo; } /**************************************************** * 微信摇一摇 - 查询设备列表 ****************************************************/ public function wxDeviceSearch($jsonData){ $wxAccessToken = $this->wxAccessToken(); $url = "https://api.weixin.qq.com/shakearound/device/search?access_token=" . $wxAccessToken; $result = $this->wxHttpsRequest($url,$jsonData); $jsoninfo = json_decode($result, true); return $jsoninfo; } /**************************************************** * 微信摇一摇 - 新增页面 ****************************************************/ public function wxPageAdd($jsonData){ $wxAccessToken = $this->wxAccessToken(); $url = "https://api.weixin.qq.com/shakearound/page/add?access_token=" . $wxAccessToken; $result = $this->wxHttpsRequest($url,$jsonData); $jsoninfo = json_decode($result, true); return $jsoninfo; } /**************************************************** * 微信摇一摇 - 编辑页面 ****************************************************/ public function wxPageUpdate($jsonData){ $wxAccessToken = $this->wxAccessToken(); $url = "https://api.weixin.qq.com/shakearound/page/update?access_token=" . $wxAccessToken; $result = $this->wxHttpsRequest($url,$jsonData); $jsoninfo = json_decode($result, true); return $jsoninfo; } /**************************************************** * 微信摇一摇 - 查询页面 ****************************************************/ public function wxPageSearch($jsonData){ $wxAccessToken = $this->wxAccessToken(); $url = "https://api.weixin.qq.com/shakearound/page/search?access_token=" . $wxAccessToken; $result = $this->wxHttpsRequest($url,$jsonData); $jsoninfo = json_decode($result, true); return $jsoninfo; } /**************************************************** * 微信摇一摇 - 删除页面 ****************************************************/ public function wxPageDelete($jsonData){ $wxAccessToken = $this->wxAccessToken(); $url = "https://api.weixin.qq.com/shakearound/page/delete?access_token=" . $wxAccessToken; $result = $this->wxHttpsRequest($url,$jsonData); $jsoninfo = json_decode($result, true); return $jsoninfo; } /******************************************************* * 微信摇一摇 - 上传图片素材 *******************************************************/ public function wxMaterialAdd($media = '') { $wxAccessToken = $this->wxAccessToken(); //$data['access_token'] = $wxAccessToken; $data['media'] = '@D:\\workspace\\htdocs\\yky_test\\logo.jpg'; $url = "https://api.weixin.qq.com/shakearound/material/add?access_token=".$wxAccessToken; $result = $this->wxHttpsRequest($url,$data); $jsoninfo = json_decode($result, true); return $jsoninfo; } /**************************************************** * 微信摇一摇 - 配置设备与页面的关联关系 ****************************************************/ public function wxDeviceBindPage($jsonData){ $wxAccessToken = $this->wxAccessToken(); $url = "https://api.weixin.qq.com/shakearound/device/bindpage?access_token=" . $wxAccessToken; $result = $this->wxHttpsRequest($url,$jsonData); $jsoninfo = json_decode($result, true); return $jsoninfo; } /**************************************************** * 微信摇一摇 - 获取摇周边的设备及用户信息 ****************************************************/ public function wxGetShakeInfo($jsonData){ $wxAccessToken = $this->wxAccessToken(); $url = "https://api.weixin.qq.com/shakearound/user/getshakeinfo?access_token=" . $wxAccessToken; $result = $this->wxHttpsRequest($url,$jsonData); $jsoninfo = json_decode($result, true); return $jsoninfo; } /**************************************************** * 微信摇一摇 - 以设备为维度的数据统计接口 ****************************************************/ public function wxGetShakeStatistics($jsonData){ $wxAccessToken = $this->wxAccessToken(); $url = "https://api.weixin.qq.com/shakearound/statistics/device?access_token=" . $wxAccessToken; $result = $this->wxHttpsRequest($url,$jsonData); $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($privatekey)) { throw new Exception("财付通签名key不能为空！"); } if (is_null($content)) { throw new Exception("财付通签名内容不能为空"); } $signStr = $content . "&key=" . $privatekey; return strtoupper(md5($signStr)); } catch (Exception $e) { die($e->getMessage()); } } /******************************************************* * 微信Sha1签名生成器 - 需要将参数数组转化成为字符串[wxFormatArray方法] *******************************************************/ public function wxSha1Sign($content){ try { if (is_null($content)) { throw new Exception("签名内容不能为空"); } //$signStr = $content; return sha1($content); } catch (Exception $e) { die($e->getMessage()); } } /******************************************************* * 微信jsApi整合方法 - 通过调用此方法获得jsapi数据 *******************************************************/ public function wxJsapiPackage(){ $jsapi_ticket = $this->wxVerifyJsApiTicket(); // 注意 URL 一定要动态获取，不能 hardcode. $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->wxNonceStr(); $signPackage = array( "jsapi_ticket" => $jsapi_ticket, "nonceStr" => $nonceStr, "timestamp" => $timestamp, "url" => $url ); // 这里参数的顺序要按照 key 值 ASCII 码升序排序 $rawString = "jsapi_ticket=$jsapi_ticket&noncestr=$nonceStr×tamp=$timestamp&url=$url"; //$rawString = $this->wxFormatArray($signPackage); $signature = $this->wxSha1Sign($rawString); $signPackage['signature'] = $signature; $signPackage['rawString'] = $rawString; $signPackage['appId'] = self::appId; return $signPackage; } /******************************************************* * 微信卡券：JSAPI 卡券Package - 基础参数没有附带任何值 - 再生产环境中需要根据实际情况进行修改 *******************************************************/ public function wxCardPackage($cardId , $timestamp = ''){ $api_ticket = $this->wxVerifyJsApiTicket(); if(!empty($timestamp)){ $timestamp = $timestamp; } else{ $timestamp = time(); } $arrays = array(self::appSecret,$timestamp,$cardId); sort($arrays , SORT_STRING); //print_r($arrays); //echo implode("",$arrays)." "; $string = sha1(implode($arrays)); //echo $string; $resultArray['cardId'] = $cardId; $resultArray['cardExt'] = array(); $resultArray['cardExt']['code'] = ''; $resultArray['cardExt']['openid'] = ''; $resultArray['cardExt']['timestamp'] = $timestamp; $resultArray['cardExt']['signature'] = $string; //print_r($resultArray); return $resultArray; } /******************************************************* * 微信卡券：JSAPI 卡券全部卡券 Package *******************************************************/ public function wxCardAllPackage($cardIdArray = array(),$timestamp = ''){ $reArrays = array(); if(!empty($cardIdArray) && (is_array($cardIdArray) || is_object($cardIdArray))){ //print_r($cardIdArray); foreach($cardIdArray as $value){ //print_r($this->wxCardPackage($value,$openid)); $reArrays[] = $this->wxCardPackage($value,$timestamp); } //print_r($reArrays); } else{ $reArrays[] = $this->wxCardPackage($cardIdArray,$timestamp); } return strval(json_encode($reArrays)); } /******************************************************* * 微信卡券：获取卡券列表 *******************************************************/ public function wxCardListPackage($cardType = "" , $cardId = ""){ //$api_ticket = $this->wxVerifyJsApiTicket(); $resultArray = array(); $timestamp = time(); $nonceStr = $this->wxNonceStr(); //$strings = $arrays = array(self::appId,self::appSecret,$timestamp,$nonceStr); sort($arrays , SORT_STRING); $string = sha1(implode($arrays)); $resultArray['app_id'] = self::appId; $resultArray['card_sign'] = $string; $resultArray['time_stamp'] = $timestamp; $resultArray['nonce_str'] = $nonceStr; $resultArray['card_type'] = $cardType; $resultArray['card_id'] = $cardId; return $resultArray; } /******************************************************* * 将数组解析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."> ".$val." </".$key.">"; } $xml.="</xml>"; return $xml; } /******************************************************* * 微信卡券：上传LOGO - 需要改写动态功能 *******************************************************/ public function wxCardUpdateImg() { $wxAccessToken = $this->wxAccessToken(); //$data['access_token'] = $wxAccessToken; $data['buffer'] = '@D:\\workspace\\htdocs\\yky_test\\logo.jpg'; $url = "https://api.weixin.qq.com/cgi-bin/media/uploadimg?access_token=".$wxAccessToken; $result = $this->wxHttpsRequest($url,$data); $jsoninfo = json_decode($result, true); return $jsoninfo; //array(1) { ["url"]=> string(121) "http://mmbiz.qpic.cn/mmbiz/ibuYxPHqeXePNTW4ATKyias1Cf3zTKiars9PFPzF1k5icvXD7xW0kXUAxHDzkEPd9micCMCN0dcTJfW6Tnm93MiaAfRQ/0" } } /******************************************************* * 微信卡券：获取颜色 *******************************************************/ public function wxCardColor(){ $wxAccessToken = $this->wxAccessToken(); $url = "https://api.weixin.qq.com/card/getcolors?access_token=".$wxAccessToken; $result = $this->wxHttpsRequest($url); $jsoninfo = json_decode($result, true); return $jsoninfo; } /******************************************************* * 微信卡券：拉取门店列表 *******************************************************/ public function wxBatchGet($offset = 0, $count = 0){ $jsonData = json_encode(array('offset' => intval($offset) , 'count' => intval($count))); $wxAccessToken = $this->wxAccessToken(); $url = "https://api.weixin.qq.com/card/location/batchget?access_token=" . $wxAccessToken; $result = $this->wxHttpsRequest($url,$jsonData); $jsoninfo = json_decode($result, true); return $jsoninfo; } /******************************************************* * 微信卡券：创建卡券 *******************************************************/ public function wxCardCreated($jsonData) { $wxAccessToken = $this->wxAccessToken(); $url = "https://api.weixin.qq.com/card/create?access_token=" . $wxAccessToken; $result = $this->wxHttpsRequest($url,$jsonData); $jsoninfo = json_decode($result, true); return $jsoninfo; } /******************************************************* * 微信卡券：查询卡券详情 *******************************************************/ public function wxCardGetInfo($jsonData) { $wxAccessToken = $this->wxAccessToken(); $url = "https://api.weixin.qq.com/card/get?access_token=" . $wxAccessToken; $result = $this->wxHttpsRequest($url,$jsonData); $jsoninfo = json_decode($result, true); return $jsoninfo; } /******************************************************* * 微信卡券：设置白名单 *******************************************************/ public function wxCardWhiteList($jsonData){ $wxAccessToken = $this->wxAccessToken(); $url = "https://api.weixin.qq.com/card/testwhitelist/set?access_token=" . $wxAccessToken; $result = $this->wxHttpsRequest($url,$jsonData); $jsoninfo = json_decode($result, true); return $jsoninfo; } /******************************************************* * 微信卡券：消耗卡券 *******************************************************/ public function wxCardConsume($jsonData){ $wxAccessToken = $this->wxAccessToken(); $url = "https://api.weixin.qq.com/card/code/consume?access_token=" . $wxAccessToken; $result = $this->wxHttpsRequest($url,$jsonData); $jsoninfo = json_decode($result, true); return $jsoninfo; } /******************************************************* * 微信卡券：删除卡券 *******************************************************/ public function wxCardDelete($jsonData){ $wxAccessToken = $this->wxAccessToken(); $url = "https://api.weixin.qq.com/card/delete?access_token=" . $wxAccessToken; $result = $this->wxHttpsRequest($url,$jsonData); $jsoninfo = json_decode($result, true); return $jsoninfo; } /******************************************************* * 微信卡券：选择卡券 - 解析CODE *******************************************************/ public function wxCardDecryptCode($jsonData){ $wxAccessToken = $this->wxAccessToken(); $url = "https://api.weixin.qq.com/card/code/decrypt?access_token=" . $wxAccessToken; $result = $this->wxHttpsRequest($url,$jsonData); $jsoninfo = json_decode($result, true); return $jsoninfo; } /******************************************************* * 微信卡券：更改库存 *******************************************************/ public function wxCardModifyStock($cardId , $increase_stock_value = 0 , $reduce_stock_value = 0){ if(intval($increase_stock_value) == 0 && intval($reduce_stock_value) == 0){ return false; } $jsonData = json_encode(array("card_id" => $cardId , 'increase_stock_value' => intval($increase_stock_value) , 'reduce_stock_value' => intval($reduce_stock_value))); $wxAccessToken = $this->wxAccessToken(); $url = "https://api.weixin.qq.com/card/modifystock?access_token=" . $wxAccessToken; $result = $this->wxHttpsRequest($url,$jsonData); $jsoninfo = json_decode($result, true); return $jsoninfo; } /******************************************************* * 微信卡券：查询用户CODE *******************************************************/ public function wxCardQueryCode($code , $cardId = ''){ $jsonData = json_encode(array("code" => $code , 'card_id' => $cardId )); $wxAccessToken = $this->wxAccessToken(); $url = "https://api.weixin.qq.com/card/code/get?access_token=" . $wxAccessToken; $result = $this->wxHttpsRequest($url,$jsonData); $jsoninfo = json_decode($result, true); return $jsoninfo; } }分享实例：<?php require_once 'lib.inc.php'; $wx = new WxApi(); if(!isset($_GET['code'])){ header("location:https://open.weixin.qq.com/connect/oauth2/authorize?appid=".WxApi::appId."&redirect_uri=http://".$_SERVER['SERVER_NAME'].$_SERVER['PHP_SELF']."&response_type=code&scope=snsapi_base&state=1#wechat_redirect"); } else{ $CODE = $_GET['code']; $Info = $wx->wxOauthAccessToken($CODE); //print_r($Info); $openId = $Info['openid']; } $signPackage = $wx->wxJsapiPackage(); ?> JSAPI接口测试 <?php /** * Description of wechat * * @author Administrator */ class WeChat extends WxApi{ public $token = ""; //put your code here public function __construct($token = "") { parent::__construct(); $this->token = $token; } public function wcCheckSignature(){ try{ if (empty($this->token)) { throw new Exception('TOKEN is not defined!'); } $signature = $_GET["signature"]; $timestamp = $_GET["timestamp"]; $nonce = $_GET["nonce"]; $token = $this->token; $tmpArr = array($token, $timestamp, $nonce); // use SORT_STRING rule sort($tmpArr, SORT_STRING); $tmpStr = implode( $tmpArr ); $tmpStr = sha1( $tmpStr ); if( $tmpStr == $signature ){ return true; }else{ return false; } } catch (Exception $e) { echo 'Message: ' .$e->getMessage(); } } public function wcValid(){ $echoStr = isset($_GET["echostr"]) && !empty($_GET["echostr"]) ? addslashes($_GET["echostr"]) : NULL; if(is_null($echoStr)){ $this->wcMsg(); } else{ //valid signature , option if($this->wcCheckSignature()){ echo $echoStr; exit; } else{ exit(); } } } public function wcMsg(){ //get post data, May be due to the different environments $postStr = isset($GLOBALS["HTTP_RAW_POST_DATA"]) && !empty($GLOBALS["HTTP_RAW_POST_DATA"]) ? $GLOBALS["HTTP_RAW_POST_DATA"] : ""; if(!empty($postStr)){ libxml_disable_entity_loader(true); $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA); $this->zcLog(TRUE,$postObj); $fromUsername = $postObj->FromUserName; $toUsername = $postObj->ToUserName; $MsgType = $postObj->MsgType; if($MsgType == 'event'){//执行事件相应 $Event = $postObj->Event; switch ($Event) { case 'subscribe'://关注 break; case 'unsubscribe'://取消关注 break; case 'SCAN'://扫描 break; case 'LOCATION'://地址 break; case 'CLICK'://点击时间 break; case 'VIEW'://跳转 break; case 'card_pass_check'://卡券审核通过 break; case 'card_not_pass_check'://卡券审核失败 break; case 'user_get_card'://用户领取卡券 break; case 'user_del_card'://用户删除卡券 break; case 'user_view_card'://用户浏览会员卡 break; case 'user_consume_card'://用户核销卡券 break; case 'kf_create_session'://创建会话 break; case 'kf_close_session'://关闭会话 break; case 'kf_switch_session'://转接会话 break; default: break; } } else{ switch ($MsgType) { case 'text'://文本格式 break; case 'image'://图片格式 break; case 'voice'://声音 break; case 'video'://视频 break; case 'shortvideo'://小视频 break; case 'location'://上传地理位置 break; case 'link'://链接相应 break; default: break; } } //////////////////////////////////////////////////////////////////// $keyword = trim($postObj->Content); $time = time(); $textTpl = "<xml> <ToUserName> %s </ToUserName> <FromUserName> %s </FromUserName> <CreateTime>%s</CreateTime> <MsgType> %s </MsgType> <Content> %s </Content> <FuncFlag>0</FuncFlag> </xml>"; if(!empty( $keyword )){ $msgType = "text"; $contentStr = "Welcome to wechat world!"; $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr); echo $resultStr; } else{ echo "Input something..."; } //////////////////////////////////////////////////////////////////// } else{ echo "暂时没有任何信息！"; exit; } } //日志LOG public function zcLog($errcode , $errmsg){ $this->returnAy = array(); $this->returnAy['errcode'] = $errcode; $this->returnAy['errmsg'] = $errmsg; $this->returnAy['errtime'] = date("Y-m-d H:i:s",time()); $logfile = fopen("logfile_".date("Ymd",time()).".txt", "a+"); $txt = json_encode($this->returnAy)."\n"; fwrite($logfile, $txt); fclose($logfile); //return $this->returnAy; } }
这篇文章主要为大家详细介绍了PHP微信开发之简单实现上传临时素材的相关资料，感兴趣的小伙伴们可以参考一下本文实例为大家分享了php微信上传临时素材的具体代码，供大家参考，具体内容如下public function uploadImg($imgUrl){ $TOKEN=$this->getAccessToken(); $URL ='http://file.api.weixin.qq.com/cgi-bin/media/upload?access_token='.$TOKEN.'&type=image'; $data = array('media'=>'@'.$imgUrl); $result = $this->curl_post($URL,$data); $data = @json_decode($result,true); return $data['media_id']; } public function getAccessToken(){ $url = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=wxe574b1bd35d7d4da&secret=d4624c36b6795d1d99dcf0547af5443d'; $result = json_decode($this->curlGet($url),true); return $result['access_token']; } function curl_post($url, $data = null) { //创建一个新cURL资源 $curl = curl_init(); //设置URL和相应的选项 curl_setopt($curl, CURLOPT_URL, $url); if (!empty($data)){ curl_setopt($curl, CURLOPT_POST, 1); curl_setopt($curl, CURLOPT_POSTFIELDS, $data); } curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); //执行curl，抓取URL并把它传递给浏览器 $output = curl_exec($curl); //关闭cURL资源，并且释放系统资源 curl_close($curl); return $output; }调用uploadImg($imgurl) 传图片地址参数返回结果array ( 'type' => 'image', 'media_id' => 'W89mt3FEaxXOMOw0fLj2Cb6A8vfMjuXrj6XW59O3l9a7Tj_h2SjlBEr4dvp4Du2R', 'created_at' => 1464140301,
详解使用php调用微信接口上传永久素材
这篇文章主要介绍了详解使用php调用微信接口上传永久素材功能需求公司新开的公众号需要将公司平台现在的所有精品文章都导入，手动导入会有很多的工作量，所以采用自动化同步文章的方式来达到效果开发说明微信open api提供了新增永久素材的接口，本次功能是基于这个接口进行数据同步的使用到的接口获取永久素材列表接口：material/batchget_material新增永久素材接口：material/add_news新增媒体文件接口：material/add_material图文类型单图文（要求有默认的封面，需要提前上传到微信公众号后台）环境要求php版本：5.5以下（因为下面代码中的上传媒体文件必须要求在此环境，否则会调用微信接口失败）开发流程1、从公司平台获取所有的文章列表2、遍历文章列表，查看文章是否有图片附件，若有进行第三步，否则进行第四步3、检测所有的附件，取出第一个图片附件，并调用新增媒体文件接口上传图片获得返回后的media_id4、调用素材列表接口获取默认的封面图片，并从中得到的数据中获取media_id5、根据返回获取到的media_id开始调用上传图文接口上传素材6、记录返回信息接口设计获取微信素材列表接口此接口是用于获取默认的图片media_id同步平台数据接口此接口是用户同步我们自己的文章数据到微信功能实现接口常量private $app_id = 'wx189ae9fa8816b131'; private $app_secret = '36f5f430c591acbae3505fe877733283'; const API_URL_PREFIX = 'https://api.weixin.qq.com/cgi-bin'; const MEDIA_FOREVER_UPLOAD_URL = '/material/add_material?'; const MEDIA_FOREVER_NEWS_UPLOAD_URL = '/material/add_news?'; const MEDIA_FOREVER_NEWS_UPDATE_URL = '/material/update_news?'; const MEDIA_FOREVER_GET_URL = '/material/get_material?'; const MEDIA_FOREVER_DEL_URL = '/material/del_material?'; const MEDIA_FOREVER_COUNT_URL = '/material/get_materialcount?'; const MEDIA_FOREVER_BATCHGET_URL = '/material/batchget_material?';获取微信素材列表接口action接口方法说明：该方法为此接口的入口方法调用方式：http://${domain}/weixin/get_articles//** * 获取图片素材接口 */ public function get_articles_action(){ $token = $this->get_access_token(); $list = $this->getForeverList($token,'image',0,20); echo json_encode($list); } get_access_token方法 private function get_access_token() { $access_token = AWS_APP::cache()->get('access_token'); if(!$access_token){ error_log('get access_token from weixin '); $appId = $this->app_id; $appSecret = $this->app_secret; $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=$appId&secret=$appSecret"; $res = json_decode($this -> httpGet($url)); $access_token = $res -> access_token; AWS_APP::cache()->set('access_token',$access_token,time()+3600); }else{ error_log('get access_token from cache '); } error_log('access_token is :'.$access_token); return $access_token; }调用微信素材接口方法说明：该方法为调用微信获取永久素材列表接口方法/** * 获取永久素材列表 * @param $token * @param $type 类型有image,vedio和audio * @param $offset 起始位置，0表示从第一个 * @param $count 个数，区间为0~20 */ public function getForeverList($token,$type,$offset,$count){ $data = array( 'type' => $type, 'offset' => $offset, 'count' => $count, ); $result = $this->http_post( self::API_URL_PREFIX.self::MEDIA_FOREVER_BATCHGET_URL.'access_token='.$token, self::json_encode($data) ); error_log('forever list is :'.$result); if ($result) { $json = json_decode($result,true); if (isset($json['errcode'])) { $this->errCode = $json['errcode']; $this->errMsg = $json['errmsg']; return false; } return $json; } return false; }同步文章到微信接口action方法说明：该方法为此接口的入口方法调用方式：http://${domain}/weixin/upload_article//** * 同步问答的文章到订阅号上接口 */ public function index_action(){ $article_list = $this->model('article')->get_articles_list(null, 1, 18, 'add_time DESC'); $access_token = $this->get_access_token(); $base_url = 'http://wenda.qiezilife.com/article/'; foreach ($article_list as $key => $article){ if($article['has_attach']){ $attaches = $this->model('publish')->get_attach('article', $article['id'], 'max'); foreach ($attaches as $i => $a){ //过滤获取第一张图片 if($a['is_image']){ $attache = $a; break; } } $img = $attache['path']; $size = filesize($img); echo $img.',size is :'.$size; echo ' '; $file_info = array( 'filename' => $img, 'content-type' => 'image/jpg', //文件类型 'filelength' => $size ); $upload_img_result = $this->upload_meterial($file_info,$access_token); $media_id = $upload_img_result; error_log('media_id is ===============>'.$media_id); }else{ $media_id = '1PoTp0SqruwWu_HX0HR_jUp4STX5HSpYkibb1Ca8ZQA'; } $articles =array(); //上传图片成功了就开始上传图文 $upload_article_data = array( 'title' => $article['title'], 'thumb_media_id' => $media_id, 'author' => '茄子营养师', 'digest' => '茄子生活，你的品质生活指南', 'show_cover_pic' => 1, 'content' => $article['message'], 'content_source_url' => $base_url.$article['id'] ); $articles[] = $upload_article_data; $data = array( 'articles' => $articles ); $result= $this->uploadForeverArticles($access_token,$data); echo self::json_encode($result); error_log('upload_article result is : '.json_encode($result)); error_log('============================upload end============================'); } }uploadForeverArticles方法说明：该方法为调用微信上传永久素材接口方法/** * 上传永久图文素材(认证后的订阅号可用) * 新增的永久素材也可以在公众平台官网素材管理模块中看到 * @param array $data 消息结构{"articles":[{...}]} * @return boolean|array */ public function uploadForeverArticles($access_token,$data){ error_log('post data is=======> '.self::json_encode($data)); $url = self::API_URL_PREFIX.self::MEDIA_FOREVER_NEWS_UPLOAD_URL.'access_token='.$access_token; $result = HTTP::request($url, 'POST', self::json_encode($data)); error_log('weixin return result is =====>'.$result); if ($result) { $json = json_decode($result,true); if (!$json || !empty($json['errcode'])) { $this->errCode = $json['errcode']; $this->errMsg = $json['errmsg']; return false; } return $json; } return false; }upload_meterial方法说明：该方法为调用微信上传永久素材接口方法/** * 请注意该方法必须保证php的版本在5.6以下，否则会爆40015错误 */ function upload_meterial($file_info,$access_token){ $url="https://api.weixin.qq.com/cgi-bin/material/add_material?access_token={$access_token}&type=image"; $ch1 = curl_init (); $timeout = 5; $real_path="{$file_info['filename']}"; //$real_path=str_replace("/", "\\", $real_path); $data= array("media"=>"@{$real_path}",'form-data'=>$file_info); curl_setopt ( $ch1, CURLOPT_URL, $url ); curl_setopt ( $ch1, CURLOPT_POST, 1 ); curl_setopt ( $ch1, CURLOPT_RETURNTRANSFER, 1 ); curl_setopt ( $ch1, CURLOPT_CONNECTTIMEOUT, $timeout ); curl_setopt ( $ch1, CURLOPT_SSL_VERIFYPEER, FALSE ); curl_setopt ( $ch1, CURLOPT_SSL_VERIFYHOST, false ); curl_setopt ( $ch1, CURLOPT_POSTFIELDS, $data ); $result = curl_exec ( $ch1 ); echo ' '; echo 'reulst is ==========>'.$result; curl_close ( $ch1 ); if(curl_errno()==0){ $result=json_decode($result,true); //var_dump($result); return $result['media_id']; }else { return false; } }http_post方法说明：该方法为调http post请求方法/** * POST 请求 * @param string $url * @param array $param * @param boolean $post_file 是否文件上传 * @return string content */ private function http_post($url,$param,$post_file=false){ $oCurl = curl_init(); if(stripos($url,"https://")!==FALSE){ curl_setopt($oCurl, CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt($oCurl, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($oCurl, CURLOPT_SSLVERSION, 1); //CURL_SSLVERSION_TLSv1 } if (is_string($param) || $post_file) { $strPOST = $param; } else { $aPOST = array(); foreach($param as $key=>$val){ $aPOST[] = $key."=".urlencode($val); } $strPOST = join("&", $aPOST); } curl_setopt($oCurl, CURLOPT_URL, $url); curl_setopt($oCurl, CURLOPT_RETURNTRANSFER, 1 ); curl_setopt($oCurl, CURLOPT_POST,true); curl_setopt($oCurl, CURLOPT_POSTFIELDS,$strPOST); $sContent = curl_exec($oCurl); $aStatus = curl_getinfo($oCurl); curl_close($oCurl); if(intval($aStatus["http_code"])==200){ return $sContent; }else{ return false; } }遇到的问题在开发的过程中，在调用微信上传媒体文件时候始终得到的返回数据为{"errcode":41005,"errmsg":"media data missing hint: [3fSt_0048e297]"}原因：php版本的问题，我本机的版本5.6，而带有@识别的php方法必须是5.5以下才能识别，5.5以上的版本将这个特性去除了。解决方法：更换php的版本到5.5或者5.5以下，不更换php的版本的方法暂时没有找到
THINKPHP3.2.3实现微信公众账号根据关键字进行图文推送
公众平台消息接口为开发者提供了一种新的消息处理方式，下面教程我结合THINKPHP3.2.3实现微信公众账号根据关键字进行图文推送。源码下载：560b54641fc66.zip要实现微信公众平台关键字图文推送，首先要有一个订阅号或者公众号，下面开始教程；一、参数配置 登录公众平台后台，点击开发者中心 -> 服务器配置-> 修改配置->配置项，输入URL,Token和EncodingAESKey，URL输入http://你的域名/weixin/index，Token填写weixin，EncodingAESKey填写随机生成的字符串，如下图：二、下载源码，修改配置信息将下载的源码压缩包解压，将里面的Com文件夹放入THINKPHP框架的Library文件夹中，将WeixinController.class.php放入Home模块里的Controller文件夹中，修改里面的appid为自己公众平台的appid，token为'weixin'，crypt改为上面步骤随机生成的随机字符串，如下图其他的回复信息请自行修改逻辑。