微信发送红包示例(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版本 > ...
随机推荐
- Robot Framework 教程 (3) - Resource及关键字 的使用
From:http://www.cnblogs.com/buaawp/p/4754399.html Robot Framework 教程 (3) - Resource及关键字 的使用 在进行软件自动化 ...
- JavaScript--常用的输出方式
1.alert("要输出的内容"); 在浏览器中弹出一个对话框,然后把要输出的内容展示出来 2.document.write("要输出的内容"); ...
- Python学习记录之----网络通信(二)
网络通信 socket 这一节太难了,还是看TA的吧 http://www.cnblogs.com/alex3714/articles/5830365.html 不能执行top等类似的 会持续输出 ...
- (Review cs231n) Gradient Calculation and Backward
---恢复内容开始--- 昨日之补充web. 求解下图的梯度的流动,反向更新参数的过程,表示为 输入与损失梯度的关系,借助链式法则,当前输入与损失之间的梯度关系为局部梯度乘以后一层的梯度. ---恢复 ...
- maven 入门 (一)
纠结了好久,到底要不要写一份maven入门的所谓“教程”,有好几次想写一下,但是都放弃了,因为网上的太多了,而且都很好,但是现在决定了,还是要写出来,因为者有我自己的理解.所以我想写一份教程出来. 首 ...
- POJ 3662 Telephone Lines (二分 + 最短路)
Farmer John wants to set up a telephone line at his farm. Unfortunately, the phone company is uncoop ...
- JustOj 1936: 小明A+B
题目描述 小明今年3岁了, 现在他已经能够认识100以内的非负整数, 并且能够进行100以内的非负整数的加法计算. 对于大于等于100的整数, 小明仅保留该数的最后两位进行计算, 如果计算结果大于等于 ...
- bzoj3196 二逼平衡树
题目链接 平衡树系列最后一题 坑啊 10s时间限制跑了9764ms...还是要学一学bit套主席树啦... 经典的线段树套treap...至于第一发为什么要TLE(我不会告诉你treap插入的时候忘了 ...
- Symfony2 学习笔记之服务容器
现在的PHP应用程序都是面向对象开发,所以主要是由对象构成.有的对象可以方便的分发邮件信息而有的可能帮你把信息写入到数据库中.在你的应用程序中,你可能创建一个对象用于管理你的产品库存,或者另外一个对象 ...
- ORCAl存储过程
1.存储过程结构 1.1 第一个存储过程 create or replace procedure proc1( para1 varchar2, para2 out varchar2, para3 in ...