微信发送红包示例(php)
微信红包接口
微信红包是微信支付推出的一款基于微信客户端的免费服务应用,微信红包以微信支付
为核心安全保障,为广大用户提供安全,快捷的移劢支付服务。
请求URL
现金红包
https://api.mch.weixin.qq.com/mmpaymkttransfers/sendredpack
裂变红包
https://api.mch.weixin.qq.com/mmpaymkttransfers/sendgroupredpack
企业付款
https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers
请求的参数:

以现金红包为例:请求参数示例:
<xml>
<act_name>123123</act_name>
<client_ip>
<![CDATA[127.0.0.1]]>
</client_ip>
<mch_billno>
1281216601201609200000000000
</mch_billno>
<mch_id>1281216601</mch_id>
<nonce_str>
<![CDATA[CgSaD2zSG6ds2r2ulSuSmj3zKUXSukSS]]>
</nonce_str>
<re_openid>
<![CDATA[okzyKwbDW-d7Spc0M112zWZjaa3E]]>
</re_openid>
<remark>
1231
</remark>
<send_name>
<![CDATA[haha哈]]>
</send_name>
<total_amount>1.00</total_amount>
<total_num>1</total_num>
<wishing>
<![CDATA[祝您好运]]>
</wishing>
<wxappid>
<![CDATA[wxa316d1ce30f2c952]]>
</wxappid>
<sign>
<![CDATA[52F30DAD7E0ADFA842627179502BC2F3]]>
</sign>
</xml>
核心代码如下:
$config里面包含了必须的appid,和其他参数,可以看上图详情。只需调用yiy_send(要发送给谁的(openid),金额,配置参数)
/*随机字符串*/
private function random($length, $numeric = FALSE) {
$seed = base_convert(md5(microtime() . $_SERVER['DOCUMENT_ROOT']), 16, $numeric ? 10 : 35);
$seed = $numeric ? (str_replace('0', '', $seed) . '012340567890') : ($seed . 'zZ' . strtoupper($seed));
if ($numeric) {
$hash = '';
} else {
$hash = chr(rand(1, 26) + rand(0, 1) * 32 + 64);
$length--;
}
$max = strlen($seed) - 1;
for ($i = 0; $i < $length; $i++) {
$hash .= $seed{mt_rand(0, $max)};
}
return $hash;
} //发送红包
private function yiy_send($openid,$price,$config) {
$uniacid = 2;
$api = $config['api'];
$activity = $config['activity'];
$url = 'https://api.mch.weixin.qq.com/mmpaymkttransfers/sendredpack';
$pars = array();
$pars['nonce_str'] = $this->random(32);
$pars['mch_billno'] = $api['mchid'] . date('YmdHis');
$pars['mch_id'] = $api['mchid'];
$pars['wxappid'] = $api['appid'];
$pars['send_name'] = $activity['provider'];
$pars['re_openid'] = $openid;
$pars['total_amount'] = $price*100;
$pars['total_num'] = 1;
$pars['wishing'] = $activity['wish'];
$pars['client_ip'] = $api['ip'];
$pars['act_name'] = $activity['title'];
$pars['remark'] = $activity['remark']; ksort($pars);
$string1 = '';
foreach($pars as $k => $v) {
$string1 .= "{$k}={$v}&";
}
$string1 .= "key={$api['password']}";
$pars['sign'] = strtoupper(md5($string1));
$xml = $this->array2xml($pars);
define(M_PATH, dirname(__FILE__). '/./../../../../addons/ly_huilife/');
$extras = array();
//此处为证书位置(绝对路径),改成适合自己的,我这里放的比较那啥。。。。忽略///
$extras['CURLOPT_CAINFO'] = M_PATH . '/cert/rootca.pem.' . $uniacid;
$extras['CURLOPT_SSLCERT'] = M_PATH . '/cert/apiclient_cert.pem.' . $uniacid;
$extras['CURLOPT_SSLKEY'] = M_PATH . '/cert/apiclient_key.pem.' . $uniacid;
$procResult = null;
$resp = $this->CurlPostSsl($url, $xml, $extras);
return $resp;
} //提交
private function CurlPostSsl($url,$xml,$extras){
$ch = curl_init();
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 60);
curl_setopt($ch,CURLOPT_TIMEOUT,60);
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);
curl_setopt($ch, CURLOPT_SSLVERSION, 1);
curl_setopt($ch,CURLOPT_SSLCERT,$extras['CURLOPT_SSLCERT']);
curl_setopt($ch,CURLOPT_SSLKEY,$extras['CURLOPT_SSLKEY']);
curl_setopt($ch,CURLOPT_CAINFO,$extras['CURLOPT_CAINFO']);
curl_setopt($ch,CURLOPT_POST, 1);
curl_setopt($ch,CURLOPT_POSTFIELDS,$xml);
$data = curl_exec($ch);
var_dump($data);
if($data){
curl_close($ch);
$rsxml = simplexml_load_string($data);
if($rsxml->return_code == 'SUCCESS' && $rsxml->result_code == 'SUCCESS'){
return array('code'=>1,'msg'=>'发放成功');
}else{
//这里你可以获取,并返回详细失败信息,我这里都用这种方式返回了。
return array('code'=>0,'msg'=>'#1未知错误,稍后再试');
}
}else{
$error = curl_errno($ch);
curl_close($ch);
return array('code'=>0,'msg'=>$error );
}
} function array2xml($arr, $level = 1) {
$s = $level == 1 ? "<xml>" : '';
foreach ($arr as $tagname => $value) {
if (is_numeric($tagname)) {
$tagname = $value['TagName'];
unset($value['TagName']);
}
if (!is_array($value)) {
$s .= "<{$tagname}>" . (!is_numeric($value) ? '<![CDATA[' : '') . $value . (!is_numeric($value) ? ']]>' : '') . "</{$tagname}>";
} else {
$s .= "<{$tagname}>" . array2xml($value, $level + 1) . "</{$tagname}>";
}
}
$s = preg_replace("/([\x01-\x08\x0b-\x0c\x0e-\x1f])+/", ' ', $s);
return $level == 1 ? $s . "</xml>" : $s;
}
正确的返回结果是:


注意:传入的金额是以分为单位,比如1元,要写成100,不然红包过小会失败的(红包大于等于1元,小于等于200元),比如这样返回:
<xml>
<return_code><![CDATA[SUCCESS]]></return_code>
<return_msg><![CDATA[每个红包的平均金额必须在1.00元到200.00元之间.]]></return_msg>
<result_code><![CDATA[FAIL]]></result_code>
<err_code><![CDATA[MONEY_LIMIT]]></err_code>
<err_code_des><![CDATA[每个红包的平均金额必须在1.00元到200.00元之间.]]></err_code_des>
<mch_billno><![CDATA[1281216601201609200000000000]]></mch_billno>
<mch_id><![CDATA[1281216601]]></mch_id>
<wxappid><![CDATA[wxa316d1ce30f2c952]]></wxappid>
<re_openid><![CDATA[okzyKwbDW-d7Spc0M112zWZjaa3E]]></re_openid>
<total_amount>1</total_amount>
</xml>
更详细的文档:官方pdf:https://pay.weixin.qq.com/helper/cashredopenapi_V2.pdf
微信发送红包示例(php)的更多相关文章
- 使用nodejs调用微信发送红包
前置条件:申请微信发送红包的账户及其权限 依赖 blueimg-md5和 xmlreader 库 /common/weixin.js 源码 /** * Created by chent696 on 2 ...
- php微信公众帐号发送红包
开发框架为we7 所需参数:appid,appSecret,MchId,API密钥 <?php /** * 微信红包的类 * */ CLASS WXHongBao { private $mch_ ...
- ASP.NET微信公众号用于给指定OpenId用户发送红包
ASP.NET微信公众号用于给指定OpenId用户发送红包 微信公众号要实现对指定用户发送红包,必须指定一个存放兵发放金额的商户号,在微信商户平台里面申请商户号并获取相关参数例如发送红包所要用到的安全 ...
- 微信小程序发送红包功能。填坑记录
微信官方文档 1.开通条件 (1)商户号已入驻90日 (2)商户号有连续30天正常交易 (3)只有企业资质的商户才有资格申请 2.注意事项 (1)目前小程序红包仅支持用户微信扫码打开小程序 (2)小程 ...
- C#开发微信门户及应用(34)--微信裂变红包
在上篇随笔<C#开发微信门户及应用(33)--微信现金红包的封装及使用>介绍了普通现金红包的封装和使用,这种红包只能单独一次发给一个人,用户获取了红包就完成了,如果我们让用户收到红包后,可 ...
- 微信"流量红包"的玩法攻略 广东移动用户有福啦
前面我们说了广东移动联合微信正式推出流量红包业务,移动终于hold不住了,想要借此挽回一些些损失.只可惜,现在只是广东小范围测试,其他地区的用户暂时还没有这等福利.那么微信"流量红包&quo ...
- 微信发红包 PHP 实现
最近做生日营销,需要微信发红包,特此从网上找了一篇教程 首先你的有个服务号,并且开通了微信支付,我在这就不说怎么去申请和开通了,我是看了微信官方文档后,想看官方文档的朋友可以到下面这个链接 https ...
- 微信企业红包api接入
项目描述:基于微信浏览器的H5页面,接入微信支付接口和微信红包接口 一.接入前准备条件 1.微信公众号 需要基于已认证的微信公众号承载该H5页面.该条件默认已具备,本文重点为红包接口. 2.微信支付商 ...
- python实现微信发送服务器监控报警消息代码实现
这篇文章主要介绍了python3.8 微信发送服务器监控报警消息代码实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 ! python版本 > ...
随机推荐
- Java多线程-----线程池详解
1. 线程池的实现原理 提交一个任务到线程池中,线程池的处理流程如下: 判断线程池里的核心线程是否都在执行任务,如果不是(核心线程空闲或者还有核心线程没有被创建)则创建一个新的工作线程来执行任务.如果 ...
- <keep-alvie></keep-alive>
<keep-alive></keep-alive>的作用是什么? <keep-alive></keep-alive> 包裹动态组件时,会缓存不活动的组件 ...
- (Review cs231n) Backpropagation and Neural Network
损失由两部分组成: 数据损失+正则化损失(data loss + regularization) 想得到损失函数关于权值矩阵W的梯度表达式,然后进性优化操作(损失相当于海拔,你在山上的位置相当于W,你 ...
- [转载]js 获取ASP RadioButtonList 选中的值
var planList=document.all ('rblPlanType'); for(var i=1;i<planList.length;i++) { if(plan ...
- Django框架----ORM数据库操作注意事项
1.多对多的正向查询 class Class(models.Model): name = models.CharField(max_length=32,verbose_name="班级名&q ...
- Kali linux apt-get update 失败,无release……(最有效)
设置源 编辑 /etc/apt/sources.list nano /etc/apt/sources.list 清空文件内所有内容后添加 deb http://mirrors.ustc.edu.cn/ ...
- 使用WebClient下载网页,用正则匹配需要的内容
WebClient是一个操作网页的类 webClient web=new WebClient(): web.DownloadString(网页的路径,可以是本地路径);--采用的本机默认的编码格式 ...
- EDK II之USB主控制器(EHCI)驱动的实现框架
本文简要介绍一下UEFI中EHCI驱动的代码实现框架: 下图是HCDI: 上图是Host驱动程序向上层驱动提供的接口图: 1.大部分接口的最后动作都是去操作主控制器寄存器,ECHI的spec:< ...
- 如何使用 lsyncd 实时同步并执行 shell 命令
修改 lsyncd 的默认配置,不直接执行rsync 进行同步,而是改用自己的脚本. binary 指定我们的脚本 vim /usr/local/lsyncd/etc/lsyncd.conf sett ...
- PHP 中文工具类,支持汉字转拼音、拼音分词、简繁互转
ChineseUtil 下载地址:https://github.com/Yurunsoft/ChineseUtil 另外一个中文转拼音工具:https://github.com/overtrue/pi ...