这是我做微信红包时写的一个类,无需大改动只要把商户的东西换成你的就行了。
不熟悉的先看看微信官方文档 https://pay.weixin.qq.com/wiki/doc/api/tools/cash_coupon.php?chapter=13_4&index=3
下面直接贴代码不罗嗦
<?php
namespace tools;
class SendRedpack{
/*测试微信企业给个人发红包*/
/*
openid为发送用户的openid amount为金额分为单位 wishing为红包祝福语 act_name活动名称
*/
public function weixin_red_packet($openid,$amount,$wishing,$act_name){
// 请求参数
// 随机字符串
$data['nonce_str']=$this->create_noncestr();
//签名
$data['sign']="";
//商户号,输入你的商户号
$data['mch_id']="1234567890";
//商户订单号,可以按要求自己组合28位的商户订单号
$data['mch_billno']=$data['mch_id'].date("ymd")."888888".rand(1000,9999);
//公众帐号appid,输入自己的公众号appid,我是写在配置文件里面的,如果不写直接填这里即可
$data['wxappid']=config('weixin_option.app_id');
//商户名称
$data['send_name']="xx商城";
//用户openid,输入待发红包的用户openid
$data['re_openid']=$openid;
//付款金额
$data['total_amount']=$amount * 100;
//红包发放总人数
$data['total_num']="1";
//红包祝福语
$data['wishing']=$wishing;
//IP地址
$data['client_ip']=$_SERVER["REMOTE_ADDR"];
//活动名称
$data['act_name']=$act_name;
//备注
$data['remark']="test";
//场景ID
// $data['send_id']="PRODUCT_5";
//活动信息
// $data['risk_info']="";
$stringA = $this->formatQueryParaMap($data, false);
$stringSignTemp = $stringA . "&key=HNLqectikbestsecretkey1483608712";
$sign = strtoupper(md5($stringSignTemp));
// 生成签名
$data['sign']=$sign;
//发红包接口地址
$url="https://api.mch.weixin.qq.com/mmpaymkttransfers/sendredpack";
//将请求数据由数组转换成xml
$xml=$this->arrayToXml($data);
//进行请求操作
$res=$this->curl($xml,$url);
//将请求结果由xml转换成数组
$arr=$this->xmltoarray($res);
// 输出请求结果数组
return $arr;
}
// 将数组转换成xml
public function arrayToXml($arr)
{
$xml = "<xml>";
foreach ($arr as $key=>$val)
{
if (is_numeric($val)){
$xml.="<".$key.">".$val."</".$key.">";
}else{
$xml.="<".$key."><![CDATA[".$val."]]></".$key.">";
}
}
$xml.="</xml>";
return $xml;
}
// 将xml转换成数组
private function xmltoarray($xml){
//禁止引用外部xml实体
libxml_disable_entity_loader(true);
$xmlstring=simplexml_load_string($xml,"SimpleXMLElement",LIBXML_NOCDATA);
$arr=json_decode(json_encode($xmlstring),true);
return $arr;
}
//进行curl操作
private function curl($param="",$url) {
$postUrl = $url;
$curlPost = $param;
//初始化curl
$ch = curl_init();
//抓取指定网页
curl_setopt($ch, CURLOPT_URL,$postUrl);
//设置header
curl_setopt($ch, CURLOPT_HEADER, 0);
//要求结果为字符串且输出到屏幕上
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
//post提交方式
curl_setopt($ch, CURLOPT_POST, 1);
// 增加 HTTP Header(头)里的字段
curl_setopt($ch, CURLOPT_POSTFIELDS, $curlPost);
// 终止从服务端进行验证
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
//这个是证书的位置
$zs1=VENDOR_PATH."/WxPay/cert/cert.pem";
$zs2=VENDOR_PATH."/WxPay/cert/key.pem";
curl_setopt($ch,CURLOPT_SSLCERT,$zs1);
//这个也是证书的位置
curl_setopt($ch,CURLOPT_SSLKEY,$zs2);
//运行curl
$data = curl_exec($ch);
//关闭curl
curl_close($ch);
return $data;
}
//随机字符串
public function create_noncestr($length = 32)
{
$chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
$str = "";
for ( $i = 0; $i < $length; $i++ ) {
$str.= substr($chars, mt_rand(0, strlen($chars)-1), 1);
}
return $str;
}
//格式化字符串
public function formatQueryParaMap($paraMap, $urlencode)
{
$buff = "";
ksort($paraMap);
foreach ($paraMap as $k => $v){
if (null != $v && "null" != $v && "sign" != $k) {
if($urlencode){
$v = urlencode($v);
}
$buff .= $k . "=" . $v . "&";
}
}
$reqPar;
if (strlen($buff) > 0) {
$reqPar = substr($buff, 0, strlen($buff)-1);
}
return $reqPar;
}
//获取红包信息
public function getRedPackInfo($mch_billno){
// 随机字符串
$arr['nonce_str']=$this->create_noncestr();
//签名
$arr['sign']="";
//商户订单号
$arr['mch_billno'] = $mch_billno;
//商户号
$arr['mch_id'] = "123456789";
//APPID
$arr['appid'] = config('weixin_option.app_id');
//订单类型
$arr['bill_type'] = "MCHT";
$string = $this->formatQueryParaMap($arr, false);
$stringSign = $string . "&key=HNLqectikbestsecretkey123456789";这个key是商户后台设置的key
$sign = strtoupper(md5($stringSign));
$arr['sign'] = $sign;
//查询红包信息接口
$url="https://api.mch.weixin.qq.com/mmpaymkttransfers/gethbinfo";
//将请求数据由数组转换成xml
$xml=$this->arrayToXml($arr);
//进行请求操作
$res=$this->curl($xml,$url);
//将请求结果由xml转换成数组
$arr=$this->xmltoarray($res);
// 输出请求结果数组
return $arr;
}
}