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 数组遍历方法大全(foreach,list,each)
Jun 30 PHP
linux系统上支持php的 iconv()函数的方法
Oct 01 PHP
php中0,null,empty,空,false,字符串关系的详细介绍
Jun 20 PHP
基于PHP创建Cookie数组的详解
Jul 03 PHP
php加速器eAccelerator的配置参数、API详解
May 05 PHP
PHP生成等比缩略图类和自定义函数分享
Jun 25 PHP
PHP附件下载中文名称乱码的解决方法
Dec 17 PHP
PHP6连接SQLServer2005的三部曲
Apr 15 PHP
对laravel in 查询的使用方法详解
Oct 09 PHP
PHP实现简单用户登录界面
Oct 23 PHP
PHP开发api接口安全验证操作实例详解
Mar 26 PHP
PHP对接阿里云虚拟号的实现(号码隐私保护)
Apr 06 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中的Streams工具
2015/07/03 PHP
PHP新特性详解之命名空间、性状与生成器
2017/07/18 PHP
php-app开发接口加密详解
2018/04/18 PHP
JavaScript 反科里化 this [译]
2012/09/20 Javascript
关于jQuery object and DOM element
2013/04/15 Javascript
jQuery实现列表自动循环滚动鼠标悬停时停止滚动
2013/09/06 Javascript
浅谈轻量级js模板引擎simplite
2015/02/13 Javascript
PHP守护进程实例
2015/03/06 Javascript
每天一篇javascript学习小结(RegExp对象)
2015/11/17 Javascript
BootStrap 超链接变按钮的实现方法
2016/09/25 Javascript
JavaScript重定向URL参数的两种方法小结
2016/10/19 Javascript
谈谈Vue.js——vue-resource全攻略
2017/01/16 Javascript
Bootstrap面板(Panels)的简单实现代码
2017/03/17 Javascript
js微信应用场景之微信音乐相册案例分享
2017/08/11 Javascript
vue二级路由设置方法
2018/02/09 Javascript
对layui中表单元素的使用详解
2018/08/15 Javascript
对vue2.0中.vue文件页面跳转之.$router.push的用法详解
2018/08/24 Javascript
详解关于React-Router4.0跳转不置顶解决方案
2019/05/10 Javascript
Vue this.$router.push(参数)实现页面跳转操作
2020/09/09 Javascript
vue中使用echarts的示例
2021/01/03 Vue.js
使用Python实现下载网易云音乐的高清MV
2015/03/16 Python
Python处理json字符串转化为字典的简单实现
2016/07/07 Python
Python正规则表达式学习指南
2016/08/02 Python
python opencv之SIFT算法示例
2018/02/24 Python
浅析python参数的知识点
2018/12/10 Python
python使用xlrd模块读取xlsx文件中的ip方法
2019/01/11 Python
Django 解决新建表删除后无法重新创建等问题
2020/05/21 Python
keras 读取多标签图像数据方式
2020/06/12 Python
解决pytorch 数据类型报错的问题
2021/03/03 Python
canvas实现扭蛋机动画效果的示例代码
2018/10/17 HTML / CSS
英国时尚首饰品牌:Missoma
2020/06/29 全球购物
Tomcat的缺省是多少,怎么修改
2014/04/09 面试题
集团薪酬管理制度
2014/01/13 职场文书
教师师德工作总结2015
2015/07/22 职场文书
Java 将PPT幻灯片转为HTML文件的实现思路
2021/06/11 Java/Android
python画条形图的具体代码
2022/04/20 Python