ホームページ  >  記事  >  バックエンド開発  >  PHP は赤い封筒 API を自動的に送信する WeChat 公式アカウントを実装します

PHP は赤い封筒 API を自動的に送信する WeChat 公式アカウントを実装します

墨辰丷
墨辰丷オリジナル
2018-06-02 09:22:033658ブラウズ

WeChat で赤い封筒を送信することは、今日では一般的な祝福の形式になっています。この記事では主に、赤い封筒を自動的に送信するための PHP WeChat パブリック アカウントを紹介します

。詳細は以下の通りです:

コアインターフェースコードを投稿します。データを自分で記入する場合は、インターフェーステストOK
wechat_packet.php

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

class wechat_packet{
 private $url = &#39;https://api.mch.weixin.qq.com/mmpaymkttransfers/sendredpack&#39;;//请求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 = &#39;/api/wechat/cert/apiclient_key.pem&#39;;
 /**
  * ca证书
  */
 private $rootca = &#39;api/wechat/cert/rootca.pem&#39;;
 public function __construct()
 {
  //初始化红包设置信息
  $this--->weixin_appid = C(&#39;wap_weixin_appid&#39;);
  $this->mch_id = C(&#39;wechat_mch_id&#39;);
  $this->send_name = C(&#39;wechat_send_name&#39;);
  $this->wishing = C(&#39;wechat_wishing&#39;);
  $this->act_name = C(&#39;wechat_act_name&#39;);
  $this->client_ip = $_SERVER[&#39;SERVER_ADDR&#39;];
  $this->remark = C(&#39;wechat_remark&#39;);
  $this->nonce_str = $this->create_nonce_str(32);
  $this->api_password = C(&#39;wechat_api_password&#39;);
  $inc_file = BASE_PATH.DS.&#39;api&#39;.DS.&#39;wechat&#39;.DS.&#39;arraytoxml.php&#39;;
  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(
   &#39;nonce_str&#39; => $this->nonce_str,
   &#39;mch_billno&#39; => $mch_billno,
   &#39;mch_id&#39; => $this->mch_id,
   &#39;wxappid&#39; => $this->weixin_appid,
   &#39;send_name&#39; => $this->send_name,
   &#39;re_openid&#39; => $re_openid,
   &#39;total_amount&#39; => $total_amount,
   &#39;total_num&#39; => $this->total_num,
   &#39;wishing&#39; => $this->wishing,
   &#39;client_ip&#39; => $this->client_ip,
   &#39;act_name&#39; => $this->act_name,
   &#39;remark&#39; => $this->remark,
   &#39;sign&#39; => $sign,
  );
  $send_xml = $this->arraytoxml->toXml($send_array,&#39;&#39;);
  $data = $this->curl_post_ssl($this->url, $send_xml);
  $data = $this->xmlToArray($data);
  file_put_contents(&#39;adki&#39;,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, &#39;10.206.30.98&#39;);
  //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,&#39;PEM&#39;);
  curl_setopt($ch,CURLOPT_SSLCERT,getcwd().$this->public_key);
  //默认格式为PEM,可以注释
  curl_setopt($ch,CURLOPT_SSLKEYTYPE,&#39;PEM&#39;);
  curl_setopt($ch,CURLOPT_SSLKEY,getcwd().$this->private_key);
  //ca证书
  curl_setopt($ch,CURLOPT_CAINFO,$this->rootca);
  //第二种方式,两个文件合成一个.pem文件
  //curl_setopt($ch,CURLOPT_SSLCERT,getcwd().&#39;/all.pem&#39;);
  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(
   &#39;act_name&#39; => $this->act_name,
   &#39;client_ip&#39; => $this->client_ip,
   &#39;mch_billno&#39; => $mch_billno,
   &#39;mch_id&#39; => $this->mch_id,
   &#39;nonce_str&#39; => $this->nonce_str,
   &#39;re_openid&#39; => $re_openid,
   &#39;remark&#39; => $this->remark,
   &#39;send_name&#39; => $this->send_name,
   &#39;total_amount&#39; => $total_amount,
   &#39;total_num&#39; => $this->total_num,
   &#39;wishing&#39; => $this->wishing,
   &#39;wxappid&#39; => $this->weixin_appid,
  );
  foreach ($string_array as $key => $value){

   if(!empty($value)){

    $stringA .= "$key=$value";
    if($key != &#39;wxappid&#39;){

     $stringA .= &#39;&&#39;;
    }
   }
  }
  //转成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(&#39;ASCII&#39;,&#39;UTF-8&#39;,&#39;GBK&#39;,&#39;GB2312&#39;));
  $charset = strtolower($charset);
  if("utf-8" != $charset){
   $str = iconv(&#39;UTF-8&#39;,$charset,$str);
  }
  return $str;

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

arrayをxml:arraytoxml.php

にします。

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

}

概要: 以上がこの記事の全内容です、皆さんの学習に役立つことを願っています。

関連する推奨事項:

PHP で実装された 4 つの基本的な並べ替えアルゴリズムの実行時間の比較 (必読)

ロックを使用して PHP に基づく同時実行下でコード取得機能を実装する方法

PHP自動読み込み 簡単実装方法

以上がPHP は赤い封筒 API を自動的に送信する WeChat 公式アカウントを実装しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。