PHP微信公众号自动发送红包API


Posted in PHP onJune 01, 2016

本文实例为大家分享了PHP微信公众号自动发送红包API代码,分享给大家供大家参考。具体如下:

贴出核心接口代码至于数据自己填写,接口测试OK
wechat_packet.php

<!--?php
/**
 * 发送红包接口
 * Created by PhpStorm.
 * User: ADKi
 * Date: 2016/4/25 0025
 * Time: 15:25
 */

class wechat_packet{
 private $url = 'https://api.mch.weixin.qq.com/mmpaymkttransfers/sendredpack';//请求URL
 private $mch_id;//商户号
 private $weixin_appid;//公众账号appid
 private $send_name;//商户名称
 private $total_num = 1;//发送红包总人数
 private $wishing;//红包祝福语
 private $client_ip;//调用接口的机器Ip地址
 private $act_name;//活动名称
 private $remark;//备注信息
 private $nonce_str;//随机字符串,不长于32位
 private $api_password;
 private $arraytoxml;//数组转xml
 /**
  * 公钥
  */
 private $public_key = "/api/wechat/cert/apiclient_cert.pem";
 /**
  * 私钥
  */
 private $private_key = '/api/wechat/cert/apiclient_key.pem';
 /**
  * ca证书
  */
 private $rootca = 'api/wechat/cert/rootca.pem';
 public function __construct()
 {
  //初始化红包设置信息
  $this--->weixin_appid = C('wap_weixin_appid');
  $this->mch_id = C('wechat_mch_id');
  $this->send_name = C('wechat_send_name');
  $this->wishing = C('wechat_wishing');
  $this->act_name = C('wechat_act_name');
  $this->client_ip = $_SERVER['SERVER_ADDR'];
  $this->remark = C('wechat_remark');
  $this->nonce_str = $this->create_nonce_str(32);
  $this->api_password = C('wechat_api_password');
  $inc_file = BASE_PATH.DS.'api'.DS.'wechat'.DS.'arraytoxml.php';
  if(is_file($inc_file)) {
   require($inc_file);
  }
  $this->arraytoxml = new ArrayToXML();
 }
 
 public function send_post($mch_billno,$re_openid,$total_amount){
  $sign = $this->create_sign($mch_billno,$re_openid,$total_amount);
  $send_array = array(
   'nonce_str' => $this->nonce_str,
   'mch_billno' => $mch_billno,
   'mch_id' => $this->mch_id,
   'wxappid' => $this->weixin_appid,
   'send_name' => $this->send_name,
   're_openid' => $re_openid,
   'total_amount' => $total_amount,
   'total_num' => $this->total_num,
   'wishing' => $this->wishing,
   'client_ip' => $this->client_ip,
   'act_name' => $this->act_name,
   'remark' => $this->remark,
   'sign' => $sign,
  );
  $send_xml = $this->arraytoxml->toXml($send_array,'');
  $data = $this->curl_post_ssl($this->url, $send_xml);
  $data = $this->xmlToArray($data);
  file_put_contents('adki',var_export($data,true),FILE_APPEND);
 }
 /*
 请确保您的libcurl版本是否支持双向认证,版本高于7.20.1
 */
 private function curl_post_ssl($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().$this->public_key);
  //默认格式为PEM,可以注释
  curl_setopt($ch,CURLOPT_SSLKEYTYPE,'PEM');
  curl_setopt($ch,CURLOPT_SSLKEY,getcwd().$this->private_key);
  //ca证书
  curl_setopt($ch,CURLOPT_CAINFO,$this->rootca);
  //第二种方式,两个文件合成一个.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\n\n\n";
   curl_close($ch);
   return false;
  }
 }
 //生成签名
 private function create_sign($mch_billno,$re_openid,$total_amount){
  $string_array = array(
   'act_name' => $this->act_name,
   'client_ip' => $this->client_ip,
   'mch_billno' => $mch_billno,
   'mch_id' => $this->mch_id,
   'nonce_str' => $this->nonce_str,
   're_openid' => $re_openid,
   'remark' => $this->remark,
   'send_name' => $this->send_name,
   'total_amount' => $total_amount,
   'total_num' => $this->total_num,
   'wishing' => $this->wishing,
   'wxappid' => $this->weixin_appid,
  );
  foreach ($string_array as $key => $value){

   if(!empty($value)){

    $stringA .= "$key=$value";
    if($key != 'wxappid'){

     $stringA .= '&';
    }
   }
  }
  //转成UTF-8
  $stringA = $this->gbkToUtf8($stringA);
  $stringSignTemp="$stringA&key=$this->api_password";
  $sign = MD5($stringSignTemp);

  $sign = strtoupper($sign);
  return $sign;
 }
 //生成随机字符串
 private function create_nonce_str($length){
  $str = null;
  $strPol = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz";
  $max = strlen($strPol)-1;
  for($i=0;$i<$length;$i++){
   $str.=$strPol[rand(0,$max)];//rand($min,$max)生成介于min和max两个数之间的一个随机整数
  }

  return $str;
 }
 /**
  *自动判断把gbk或gb2312编码的字符串转为utf8
  *能自动判断输入字符串的编码类,如果本身是utf-8就不用转换,否则就转换为utf-8的字符串
  *支持的字符编码类型是:utf-8,gbk,gb2312
  *@$str:string 字符串
  */
 private function gbkToUtf8($str){
  $charset = mb_detect_encoding($str,array('ASCII','UTF-8','GBK','GB2312'));
  $charset = strtolower($charset);
  if("utf-8" != $charset){
   $str = iconv('UTF-8',$charset,$str);
  }
  return $str;

 }
 private function xmlToArray($postStr){
  $msg = array();
  $msg = (array)simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
  return $msg;
 }
}

数组转xml:arraytoxml.php

<!--?php
/**
 * Created by PhpStorm.
 * User: ADKi
 * Date: 2016/4/26 0026
 * Time: 12:19
 */
class ArrayToXML
{
 public function toXml($data){
  $xml = '<xml-->';
  foreach ($data as $key => $value){
   if (is_numeric($value)){
    $xml .= "<".$key.">".$value."<!--".$key."-->";
   }else{
    $xml .= "<".$key."><!--[CDATA[".$value."]]--><!--".$key."-->";
   }
  }
  $xml .= '';
  return $xml;
 }

}

以上就是本文的全部内容,希望对大家学习PHP程序设计有所帮助,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
php自定义函数之递归删除文件及目录
Aug 08 PHP
ThinkPHP模板判断输出Defined标签用法详解
Jun 30 PHP
PHP中读取文件的8种方法和代码实例
Aug 05 PHP
PHP中$this和$that指针使用实例
Jan 06 PHP
Codeigniter通过SimpleXML将xml转换成对象的方法
Mar 19 PHP
什么是PHP文件?如何打开PHP文件?
Jun 27 PHP
php使用ftp实现文件上传与下载功能
Jul 21 PHP
PHP实现基于栈的后缀表达式求值功能
Nov 10 PHP
PHP开发实现微信退款功能示例
Nov 25 PHP
ThinkPHP框架实现FTP图片上传功能示例
Apr 08 PHP
php实现网页上一页下一页翻页过程详解
Jun 28 PHP
laravel框架模板之公共模板、继承、包含实现方法分析
Aug 30 PHP
PHP模块化安装教程
Jun 01 #PHP
深入理解PHP之源码目录结构与功能说明
Jun 01 #PHP
基于PHP生成简单的验证码
Jun 01 #PHP
深入理解PHP原理之执行周期分析
Jun 01 #PHP
深入理解PHP之OpCode原理详解
Jun 01 #PHP
深入理解PHP中的count函数
May 31 #PHP
Ubuntu server 11.04安装memcache及php使用memcache来存储session的方法
May 31 #PHP
You might like
PHP 显示客户端IP与服务器IP的代码
2010/10/12 PHP
PHP里的中文变量说明
2011/07/23 PHP
thinkPHP模板引擎用法示例
2016/12/08 PHP
详解php用static方法的原因
2018/09/12 PHP
escape、encodeURI 和 encodeURIComponent 的区别
2009/03/02 Javascript
JavaScript CSS修改学习第三章 修改样式表
2010/02/19 Javascript
基于Jquery的回车成tab焦点切换效果代码(Enter To Tab )
2010/11/14 Javascript
推荐30个新鲜出炉的精美 jQuery 效果
2012/03/26 Javascript
jQuery之尺寸调整组件的深入解析
2013/06/19 Javascript
在JavaScript中使用timer示例
2014/05/08 Javascript
关于input全选反选恶心的异常情况
2016/07/24 Javascript
使用伪命名空间封装保护独自创建的对象方法
2016/08/04 Javascript
jquery 动态增加删除行的简单实例(推荐)
2016/10/12 Javascript
javascript事件的传播基础实例讲解(35)
2017/02/14 Javascript
nodejs入门教程二:创建一个简单应用示例
2017/04/24 NodeJs
详解在create-react-app使用less与antd按需加载
2018/12/06 Javascript
js实现json数组分组合并操作示例
2019/02/12 Javascript
Vue中对iframe实现keep alive无刷新的方法
2019/07/23 Javascript
vue子路由跳转实现tab选项卡
2019/07/24 Javascript
微信小程序上传图片并等比列压缩到指定大小的实例代码
2019/10/24 Javascript
js实现缓动动画
2020/11/25 Javascript
[03:55]显微镜下的DOTA2特别篇——430灰烬之灵神级操作
2014/06/24 DOTA
python抓取某汽车网数据解析html存入excel示例
2013/12/04 Python
学习python之编写简单简单连接数据库并执行查询操作
2016/02/27 Python
python字典多键值及重复键值的使用方法(详解)
2016/10/31 Python
pyqt5 comboBox获得下标、文本和事件选中函数的方法
2019/06/14 Python
伦敦香水公司:The London Perfume Company
2019/11/13 全球购物
篮球比赛口号
2014/06/10 职场文书
上海世博会口号
2014/06/19 职场文书
幼师求职信
2014/06/23 职场文书
乡镇平安建设汇报材料
2014/08/25 职场文书
会计岗位职责
2015/02/03 职场文书
警示教育观后感
2015/06/17 职场文书
婚宴新娘致辞
2015/07/28 职场文书
会议开幕致辞怎么写
2016/03/03 职场文书
Android Gradle 插件自定义Plugin实现注意事项
2022/06/16 Java/Android