php 微信公众号发红包
微信公众号发红包需要满足以下条件:
1.开通微信商户号
2.开通现金红包功能(注意开通要满足条件)

文档地址:https://pay.weixin.qq.com/wiki/doc/api/tools/cash_coupon.php?chapter=13_3&index=2
php发红包demo:
class HongBao
{
private $sslPath;//API安全证书地址
public function __construct(){
$this->sslPath=dirname(__FILE__).DIRECTORY_SEPARATOR.'ssl'.DIRECTORY_SEPARATOR;
}
//支付
public function pay($url,$obj){
//创建随机字符串
$obj['nonce_str'] = $this->createNoncestr();
//创建签名
$string = $this->createSign($obj,false);
$stringSignTemp = $string."&key=$this->key";//key为商户平台设置的密钥key
$sign = strtoupper(md5($stringSignTemp));
$obj['sign'] = $sign;
$postXml = $this->arrayToXml($obj);
$responseXml = $this->curlPostSsl($url,$postXml);
return $responseXml;
}
//发红包
public function send(Request $request){
$money=1;//金额:分
$data = array();
$data['wxappid'] = $this->appId;//公众号appid
$data['mch_id'] = $this->mchId;//商户号
$data['mch_billno'] = $this->mchId.date('YmdHis').rand(1000,9999);//商户订单号 28位
$data['client_ip'] = $request->ip();//本机ip
$data['re_openid'] ="oXzBg6teHK4GgSKMc10TYdZXz85A";//接受人
$data['total_amount'] = $money;//收红包的用户的金额,精确到分
$data['min_value'] = $money;//最小金额
$data['max_value'] = $money;//最大金额
$data['total_num'] = 1;//发送数量
$data['nick_name'] = $this->sendName;//红包商户名称
$data['send_name'] = $this->sendName;//红包派发者名称
$data['wishing'] = "恭喜";//欢迎语
$data['act_name'] = "新年红包活动";//活动名称
$data['remark'] = "新年红包活动";//备注
$url = "https://api.mch.weixin.qq.com/mmpaymkttransfers/sendredpack";//发红包api
$res = $this->pay($url,$data);
libxml_disable_entity_loader(true);
$postObj = simplexml_load_string($res, 'SimpleXMLElement', LIBXML_NOCDATA);
$val = json_decode(json_encode($postObj),true);
var_dump($val);
}
//生成签名,参数:生成签名的参数和是否编码
public function createSign($arr,$urlencode){
$buff = "";
ksort($arr); //对传进来的数组参数里面的内容按照字母顺序排序,a在前面,z在最后(字典序)
foreach ($arr as $k=>$v) {
if(null!=$v && "null" != $v && "sign" != $k){
//签名不要转码
if ($urlencode){
$v = urlencode($v);
}
$buff.=$k."=".$v."&";
}
}
if (strlen($buff)>0) {
$reqPar = substr($buff,0,strlen($buff)-1); //去掉末尾符号“&”
}
return $reqPar;
}
//生成随机字符串,默认32位
public function createNoncestr($length=32){
//创建随机字符
$chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
$str = "";
for($i=0;$i<$length;$i++){
$str.=substr($chars, mt_rand(0,strlen($chars)-1),1);
}
return $str;
}
//数组转xml
public function arrayToXml($arr){
$xml="<xml>";
foreach($arr as $k=>$v){
$xml.="<".$k.">".$v."</".$k.">";
}
$xml.="</xml>";
return $xml;
}
//post请求网站,需要证书
public function curlPostSsl($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_URL,$url);
curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,false);
curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,false);
//商户号API安全证书: cert 与 key 分别属于两个.pem文件
//请确保您的libcurl版本是否支持双向认证,版本高于7.20.1
curl_setopt($ch,CURLOPT_SSLCERT,$this->sslPath.'apiclient_cert.pem');
curl_setopt($ch,CURLOPT_SSLKEY,$this->sslPath.'apiclient_key.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;
}
}
}
♥ 作者:离岸少年
♠ 出处:https://www.cnblogs.com/jackzhuo/
♣ 本博客大多为学习笔记或读书笔记,本文如对您有帮助,还请多推荐下此文,如有错误欢迎指正,相互学习,共同进步。

浙公网安备 33010602011771号