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

本文实例为大家分享了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程序设计有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • php微信公众号开发模式详解

    学习步骤:分四章来讲述这部分内容,下面是每章的大致内容. 1.了解开发模式与编辑模式,开发前的一些准备. 2.开发模式用户.微信服务器.个人服务器是如何交互的.什么是接口. 3.各种接口功能的调用与实现. 4.js-SDK的调用 微信公众号开发两种模式:编辑模式和开发模式.编辑模式比较简单,你不需要操作任何的代码,只需要借助微信提供的功能来管理自己的微信公众号.这种方式开发的页面比较简单,主要用来实现文章的推送等功能.开发者模式则能通过自己的后台服务器与微信关注用户实现更多的交互作用,调用微信的

  • 基于php的微信公众平台开发入门实例

    本文实例讲述了基于php的微信公众平台开发方法.分享给大家供大家参考.具体如下: 最近在做微信公众平台开发,一口气写了二十几个功能,挺有意思的- 今天来分享一下开发经验~ 微信公众平台提供的接口很简单,先看看消息交互流程: 说的通俗一些,用户使用微信发送消息 -> 微信将数据发送给开发者 -> 开发者处理消息并返回数据至微信 -> 微信把返回数据发送给用户,期间数据交互通过XML完成,就这么简单.   下面写个实例,开发微信智能聊天机器人:   1. 注册微信公众平台账号 微信公众平台:

  • 关于php微信订阅号开发之token验证后自动发送消息给订阅号但是没有消息返回的问题

    相信很多人会跟我一样,token验证之后,发送消息给订阅号,没有消息返回. 以下,说一下我辛苦调试得到的解决办法: 首先,token验证: 自己写的token一直验证失败,找了好久,没有发现bug.实在没办法,就用了官方的示例代码.并且通过示例代码调试,发现了一个让我吐血的bug(也不算bug): token验证貌似要求字符编码格式!!!! 官方的示例代码,直接上传到服务器,token直接过! 把官方示例代码改为UTF-8格式,再上传覆盖,token失败!失败!失败! 后来,把自己写的修改为AN

  • PHP memcache在微信公众平台的应用方法示例

    本文实例讲述了PHP memcache在微信公众平台的应用方法.分享给大家供大家参考,具体如下: 现在微信公众平台大多数互动都是用户发送信息->微信分析并返回结果,这种模式功能比较单一.这里介绍另一种互动模式:用户发送信息->微信分析信息并提示下一步操作->用户发送信息->.......->微信返回结果.本文介绍运用sae里的memcache实现以上模式. 思路: 1.用户发送消息,微信会记录用户唯一的openid,将它的值赋予$fromUsername. 2.用memcac

  • 验证token、回复图文\文本、推送消息的实用微信类php代码

    本文实例为大家分享了用于验证token,回复图文.文本,向用户推送消息等功能的微信类,具体代码如下 <?php class Wechat{ private $data = array(); public function __construct($token){ $this -> auth($token, $wxuser) || exit; if(IS_GET){ echo($_GET['echostr']); exit; }else{ $xml = file_get_contents(&qu

  • php版微信公众平台实现预约提交后发送email的方法

    本文实例讲述了php版微信公众平台实现预约提交后发送email的方法.分享给大家供大家参考,具体如下: 其实这种发送邮件是非常的简单了我们只要接受由用户提交过来的邮箱地址,然后再由php的邮件控制进行邮件发送了,下面看一个综合开发例子. 首先yyuc框架是支持发送email的,在yyuc/yyuc.php 上加上如下代码: require_once(YYUC_LIB.'plugin/SendMail.php'); $sendMail = new SendMail(); 在wx conf.php

  • PHP实现微信公众号企业号自定义菜单接口示例

    本文实例讲述了PHP实现微信公众号企业号自定义菜单接口.分享给大家供大家参考,具体如下: define(AppId, "wx666cae44xxxxxx2");//定义AppId,需要在微信公众平台申请自定义菜单后会得到 define(AppSecret, "d77026a714d443a01d0229xxxxxxxx");//定义AppSecret,需要在微信公众平台申请自定义菜单后会得到 include("menu.php");//引入微信类

  • php实现发送微信模板消息的方法

    本文实例讲述了php实现发送微信模板消息的方法.分享给大家供大家参考.具体如下: 该方法基于thinkphp实现实现,具体OrderPush.class.php文件如下: 复制代码 代码如下: <?php namespace Org\Weixin; /**  * Created by PhpStorm.  * User: StandOpen  * Date: 15-1-7  * Time: 9:41  */ class OrderPush {     protected $appid;    

  • php 微信公众平台开发模式实现多客服的实例代码

    其实微信公众平台的多客服功能已经出来好久了,并且一出来的时候我就已经为自己的公众号实现了,原本以为大家都已经会了,但是今天还是有人问起这个多客服功能怎么使用,我找了下网上也没什么好的教程,今天我就给大家发一篇比较简单易懂的教程吧 在这篇微信公众平台开发教程中,我们将介绍如何使用开发模式实现多客服系统. 一.回复多客服消息 在新的微信协议中,开发模式也可以接入客服系统. 开发者如果需要让用户使用客服系统,需要在接收到用户发送的消息时,返回一个MsgType为transfer_customer_se

  • PHP使用微信开发模式实现搜索已发送图文及匹配关键字回复的方法

    本文实例讲述了PHP使用微信开发模式实现搜索已发送图文及匹配关键字回复的方法.分享给大家供大家参考,具体如下: 用户发送关键字,搜索相应的图文进行回复. 模拟登陆就不说了 右键看"已发送"图片页的源代码,图文部分是json格式的. 复制代码 代码如下: {"msg_item":[{"id":80630,"type":9,"fakeid":"2397007301","nick_n

  • PHP实现微信模拟登陆并给用户发送消息的方法【文字,图片,图文】

    本文实例讲述了PHP实现微信模拟登陆并给用户发送消息的方法.分享给大家供大家参考,具体如下: <?php /* 原作者:https://github.com/itziy/wechat 修改:Server getUserFakeid函数 获取fakeid的正则匹配公式 调用方式简单说明: $arr = array( 'account' => '公众平台帐号', 'password' => '密码' ); $w = new Weixin($arr); $w->getAllUserInf

随机推荐