微信发送红包示例(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版本 > ...
随机推荐
- STL容器之vector
[1]模板类vector 模板类vector可理解为广义数组.广义数组,即与类型无关的数组,具有与数组相同的所有操作. 那么,你或许要问:既然C++语言本身已提供了一个序列式容器array,为什么还要 ...
- springmvc静态资源无法加载
springmvc拦截所有请求,用/: <servlet> <servlet-name>springmvc</servlet-name> <servlet-c ...
- 20165305 实验一: Java开发环境的熟悉
实验1-1 建立"自己学号exp1"的目录. 在"自己学号exp1"目录下建立src,bin等目录. javac,java的执行在"自己学号exp1& ...
- DBUtils (30)
DBUtils是java编程中的数据库操作实用工具,小巧简单实用. DBUtils封装了对JDBC的操作,简化了JDBC操作,可以少写代码. Dbutils三个核心功能介绍 一. QueryRunn ...
- sql server和oracle数据库
sql server和oracle数据库安装按照官方教程即可:以及他们相应的管理工具,sql server management studio自带的,oracle的管理工具PLSQL需要单独下载安装, ...
- ClassThird
动手动脑: 1,在子类中,若要调用父类中被覆盖的方法,可以使用super关键字. 代码: public class Move_hands_Move_head { public void show( ...
- ref 参数与out参数
变量作为参数传给方法,同时希望在方法执行完成后对参数,反应到变量上面.就需要用到ref和out这两个参数. ref参数:在 传入前必须先初始化 out参数:不需要做预先的处理
- Icarscan VCI is definitely the update variation of Start iDiag
Start iCarScan is alternative of Super X431 iDiag, it’ll make your Android smartphone or tablet righ ...
- yield的理解
yield的理解:yield命令是异步两个阶段的分界线需要先对迭代器和生成器进行理解: 迭代器:是一种支持next()操作的对象.它包含一组元素,当执行next()时,返回其中一个元素:当所有元素都被 ...
- python的类和对象
一.面向对象和面向过程 1.1面向过程的特点 优点是:极大的降低了写程序的复杂度,只需要顺着要执行的步骤,堆叠代码即可. 缺点是:一套流水线或者流程就是用来解决一个问题,代码牵一发而动全身. 1.2面 ...