微信支付现金红包接口正式开放,只需开通微信支付,即可接入现金红包。通过现金红包接口,公众号开发者可以策划相关运营活动,向用户发放微信支付现金红包,更好的达到品牌推广及回馈用户的效果。具体能力如下:
1、商户调用接口时,通过指定发送对象以及发送金额的方式发放红包,这样的方式,允许商户灵活的应用于各种各样丰富的活动场景
2、领取到红包后,用户的资金直接进入微信零钱,避免繁复的领奖流程,带给用户微信支付原生的流畅体验
微信红包发送规则
1. 发送频率规则
◆ 每分钟发送红包数量不得超过1800个;
◆ 北京时间0:00-8:00不触发红包赠送;(如果以上规则不满足您的需求,请发邮件至wxhongbao@tencent.com获取升级指引)
2. 红包规则
◆ 单个红包金额介于[1.00元,200.00元]之间;
◆ 同一个红包只能发送给一个用户;(如果以上规则不满足您的需求,请发邮件至wxhongbao@tencent.com获取升级指引)
商户侧调用红包接口流程
1. 登录微信支付商户平台下载证书以及充值
在调用接口前,请商户使用微信支付商户号登录微信支付商户平台完成下述工作:
备注:
微信支付商户平台地址为pay.weixin.qq.com。微信支付商户号会在商户申请微信支付成功后,通过开户邮件发送给您。请不要使用微信公众平台账号或者appid登录。如果您登录时遇到问题,请联系微信支付小助手weixinpay@tencent.com
◆ 下载证书
商户调用微信红包接口时,服务器会进行证书验证,请在商户平台下载证书
◆ 充值
发放现金红包将扣除商户的可用余额,请注意,可用余额并不是微信支付交易额,需要预先充值,确保可用余额充足。查看可用余额、充值、提现请登录微信支付商户平台,进入“资金管理”菜单,进行操作
2. 微信红包接口调用流程
◆ 后台API调用:待进入联调过程时与开发进行详细沟通;
◆ 告知服务器:告知服务器接收微信红包的用户openID,告知服务器该用户获得的金额;
◆ 从商务号扣款:服务器获取信息后从对应的商务号扣取对应的金额;
◆ 调用失败:因不符合发送规则,商务号余额不足等原因造成调用失败,反馈至调用方;
◆ 发送成功:以微信红包公众账号发送对应红包至对应用户;
用户交互流程
调用现金红包接口,发放成功后,用户领取红包流程如下:
步骤(一):收到领取红包消息,步骤(二):点击领取消息,拆红包
接口详细说明
1.红包发放说明
用于企业向微信用户个人发现金红包
目前支持向指定微信用户的openid发放指定金额红包。(获取openid参见微信公众平台开发者文档: 网页授权获取用户基本信息)
接口参数与用户领用实际效果对应关系如下:
如需操作请登录https://pay.weixin.qq.com/
2.接口调用请求说明
请求Url | https://api.mch.weixin.qq.com/mmpaymkttransfers/sendredpack |
是否需要证书 | 是(证书及使用说明详见商户证书) |
请求方式 | POST |
3.请求参数
字段名 | 字段 | 必填 | 示例值 | 类型 | 说明 |
---|---|---|---|---|---|
随机字符串 | nonce_str | 是 | 5K8264ILTKCH16CQ2502SI8ZNMTM67VS | String(32) | 随机字符串,不长于32位 |
签名 | sign | 是 | C380BEC2BFD727A4B6845133519F3AD6 | String(32) | 详见签名生成算法 |
商户订单号 | mch_billno | 是 | 10000098201411111234567890 | String(28) | 商户订单号(每个订单号必须唯一) 组成: mch_id+yyyymmdd+10位一天内不能重复的数字。 接口根据商户订单号支持重入, 如出现超时可再调用。 |
商户号 | mch_id | 是 | 10000098 | String(32) | 微信支付分配的商户号 |
子商户号 | sub_mch_id | 否 | 10000090 | String(32) | 微信支付分配的子商户号,受理模式下必填 |
公众账号appid | wxappid | 是 | wx8888888888888888 | String(32) | 商户appid |
提供方名称 | nick_name | 是 | 天虹百货 | String(32) | 提供方名称 |
商户名称 | send_name | 是 | 天虹百货 | String(32) | 红包发送者名称 |
用户openid | re_openid | 是 | oxTWIuGaIt6gTKsQRLau2M0yL16E | String(32) | 接受收红包的用户 用户在wxappid下的openid |
付款金额 | total_amount | 是 | 1000 | int | 付款金额,单位分 |
最小红包金额 | min_value | 是 | 1000 | int | 最小红包金额,单位分 |
最大红包金额 | max_value | 是 | 1000 | int | 最大红包金额,单位分 ( 最小金额等于最大金额: min_value=max_value =total_amount) |
红包发放总人数 | total_num | 是 | 1 | int | 红包发放总人数 total_num=1 |
红包祝福语 | wishing | 是 | 感谢您参加猜灯谜活动,祝您元宵节快乐! | String(128) | 红包祝福语 |
Ip地址 | client_ip | 是 | 192.168.0.1 | String(15) | 调用接口的机器Ip地址 |
活动名称 | act_name | 是 | 猜灯谜抢红包活动 | String(32) | 活动名称 |
备注 | remark | 是 | 猜越多得越多,快来抢! | String(256) | 备注信息 |
商户logo的url | logo_imgurl | 否 | https://wx.gtimg.com/mch/img/ico-logo.png | String(128) | 商户logo的url |
分享文案 | share_content | 否 | 快来参加猜灯谜活动 | String(256) | 分享文案 |
分享链接 | share_url | 否 | http://www.qq.com | String(128) | 分享链接 |
分享的图片 | share_imgurl | 否 | https://wx.gtimg.com/mch/img/ico-logo.png | String(128) | 分享的图片url |
数据示例:
<xml> <sign></sign> <mch_billno></mch_billno> <mch_id></mch_id> <wxappid></wxappid> <nick_name></nick_name> <send_name></send_name> <re_openid></re_openid> <total_amount></total_amount> <min_value></min_value> <max_value></max_value> <total_num></total_num> <wishing></wishing> <client_ip></client_ip> <act_name></act_name> <act_id></act_id> <remark></remark> <logo_imgurl></logo_imgurl> <share_content></share_content> <share_url></share_url> <share_imgurl></share_imgurl> <nonce_str></nonce_str> </xml> |
4.返回参数
字段名 | 变量名 | 必填 | 示例值 | 类型 | 说明 |
---|---|---|---|---|---|
返回状态码 | return_code | 是 | SUCCESS | String(16) | SUCCESS/FAIL 此字段是通信标识,非交易标识,交易是否成功需要查看result_code来判断 |
返回信息 | return_msg | 否 | 签名失败
| String(128) | 返回信息,如非空,为错误原因 签名失败 参数格式校验错误 |
以下字段在return_code为SUCCESS的时候有返回 | |||||
签名 | sign | 是 | C380BEC2BFD727A4B6845133519F3AD6 | String(32) | 生成签名方式详见签名生成算法 |
业务结果 | result_code | 是 | SUCCESS | String(16) | SUCCESS/FAIL |
错误代码 | err_code | 否 | SYSTEMERROR | String(32) | 错误码信息 |
错误代码描述 | err_code_des | 否 | 系统错误 | String(128) | 结果信息描述 |
以下字段在return_code 和result_code都为SUCCESS的时候有返回 | |||||
商户订单号 | mch_billno | 是 | 10000098201411111234567890 | String(28) | 商户订单号(每个订单号必须唯一) 组成: mch_id+yyyymmdd+10位一天内不能重复的数字 |
商户号 | mch_id | 是 | 10000098 | String(32) | 微信支付分配的商户号 |
公众账号appid | wxappid | 是 | wx8888888888888888 | String(32) | 商户appid |
用户openid | re_openid | 是 | oxTWIuGaIt6gTKsQRLau2M0yL16E | String(32) | 接受收红包的用户 用户在wxappid下的openid |
付款金额 | total_amount | 是 | 1000 | int | 付款金额,单位分 |
发放成功时间 | |||||
微信单号 |
成功示例:
<xml> <return_code><![CDATA[SUCCESS]]></return_code> <return_msg><![CDATA[发放成功.]]></return_msg> <result_code><![CDATA[SUCCESS]]></result_code> <err_code><![CDATA[0]]></err_code> <err_code_des><![CDATA[发放成功.]]></err_code_des> <mch_billno><![CDATA[0010010404201411170000046545]]></mch_billno> <mch_id>10010404</mch_id> <wxappid><![CDATA[wx6fa7e3bab7e15415]]></wxappid> <re_openid><![CDATA[onqOjjmM1tad-3ROpncN-yUfa6uI]]></re_openid> <total_amount>1</total_amount> </xml> |
失败示例:
<xml> <return_code><![CDATA[FAIL]]></return_code> <return_msg><![CDATA[系统繁忙,请稍后再试.]]></return_msg> <result_code><![CDATA[FAIL]]></result_code> <err_code><![CDATA[268458547]]></err_code> <err_code_des><![CDATA[系统繁忙,请稍后再试.]]></err_code_des> <mch_billno><![CDATA[0010010404201411170000046542]]></mch_billno> <mch_id>10010404</mch_id> <wxappid><![CDATA[wx6fa7e3bab7e15415]]></wxappid> <re_openid><![CDATA[onqOjjmM1tad-3ROpncN-yUfa6uI]]></re_openid> <total_amount>1</total_amount> </xml> |
5.错误码
错误代码 | 描述 | 解决方案 |
---|---|---|
NOAUTH | 无权限 | 请联系微信支付开通api权限 |
PARAM_ERROR | 参数错误 | 请查看err_code_des,修改设置错误的参数 |
OPENID_ERROR | Openid错误 | 根据用户在商家公众账号上的openid,获取用户在红包公众账号上的openid 错误。请核对商户自身公众号appid和用户在此公众号下的openid。 |
NOTENOUGH | 余额不足 | 商户账号余额不足,请登录微信支付商户平台充值 |
SYSTEMERROR | 系统繁忙,请再试。 | 可用同一商户单号再次调用,只会发放一个红包。 |
TIME _LIMITED | 企业红包的发送时间受限 | 请北京时间0:00-8:00时间之外触发红包赠送 |
SECOND_OVER_LIMITED | 企业红包的按分钟发放受限 | 每分钟发送红包数量不得超过1800个;(可联系微信支付wxhongbao@tencent.com调高额度) |
MONEY_LIMIT | 红包金额发放限制 | 每个红包金额必须大于1元,小于200元(可联系微信支付wxhongbao@tencent.com调高额度至4999元) |
最新微信发红包接口实例
下面是一个类。使用方法:
$arr['openid']='ojgTTt8oF9VdYcGsJMACHpA-jy1U';$arr['hbname']="提现申请";$arr['body']="您的提现申请已经成功";$arr['fee']=1;
$comm = new Common_util_pub();
$re = $comm->sendhongbaoto($arr);
var_dump($re);
注意证书位置和 商户后台设置的key需要修改。
<?php
header("Content-type: text/html; charset=utf-8");/*** 现金红包接口* 2015-5-9*作者博客 http://shanmao.me* * @return*/class Common_util_pub
{/**
* hbname 红包名称 fee 红包金额 /元 body 内容 openid 微信用户id
* @param undefined $arr
*
* @return
*/public function sendhongbaoto($arr){//$comm = new Common_util_pub();
$data['mch_id'] = '120005402';
$data['mch_billno'] = '120005402'.date("Ymd",time()).date("His",time()).rand(1111,9999);
$data['nonce_str'] = self::createNoncestr();
$data['re_openid'] = $arr['openid'];
$data['wxappid'] = 'wx8axxxxxbac4905';
$data['nick_name'] = $arr['hbname'];
$data['send_name'] = $arr['hbname'];
$data['total_amount'] = $arr['fee']*100;
$data['min_value'] = $arr['fee']*100;
$data['max_value'] = $arr['fee']*100;
$data['total_num'] = 1;
$data['client_ip'] = $_SERVER['REMOTE_ADDR'];
$data['act_name'] = '测试活动';
$data['remark'] = '备注一下';
$data['wishing'] = $arr['body'];
if(!$data['re_openid']) { $rearr['return_msg']='缺少用户openid';return $rearr;
}
$data['sign'] = self::getSign($data);
$xml = self::arrayToXml($data);
//var_dump($xml);
$url ="https://api.mch.weixin.qq.com/mmpaymkttransfers/sendredpack";
$re = self::wxHttpsRequestPem($xml,$url);
$rearr = self::xmlToArray($re);return $rearr;
}function trimString($value){$ret = null;if (null != $value) {$ret = $value;if (strlen($ret) == 0) {$ret = null;}}return $ret;}/*** 作用:产生随机字符串,不长于32位*/public function createNoncestr( $length = 32 ) {$chars = "abcdefghijklmnopqrstuvwxyz0123456789"; $str ="";for ( $i = 0; $i < $length; $i++ ) { $str.= substr($chars, mt_rand(0, strlen($chars)-1), 1); } return $str;}/*** 作用:格式化参数,签名过程需要使用*/function formatBizQueryParaMap($paraMap, $urlencode){$buff = "";ksort($paraMap);foreach ($paraMap as $k => $v){if($urlencode){$v = urlencode($v);}//$buff .= strtolower($k) . "=" . $v . "&";$buff .= $k . "=" . $v . "&";}$reqPar;if (strlen($buff) > 0) {$reqPar = substr($buff, 0, strlen($buff)-1);}return $reqPar;}/*** 作用:生成签名*/public function getSign($Obj){foreach ($Obj as $k => $v){$Parameters[$k] = $v;}//签名步骤一:按字典序排序参数ksort($Parameters);$String = $this->formatBizQueryParaMap($Parameters, false);//echo '【string1】'.$String.'</br>';//签名步骤二:在string后加入KEY$String = $String."&key="."254554sefg4exxxxxxxxs5cds1"; // 商户后台设置的key//echo "【string2】".$String."</br>";//签名步骤三:MD5加密$String = md5($String);//echo "【string3】 ".$String."</br>";//签名步骤四:所有字符转为大写$result_ = strtoupper($String);//echo "【result】 ".$result_."</br>";return $result_;}/*** 作用:array转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转为array*/public function xmlToArray($xml){ //将XML转为array $array_data = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true); return $array_data;}public function wxHttpsRequestPem( $vars,$url, $second=30,$aHeader=array()){$ch = curl_init();//超时时间curl_setopt($ch,CURLOPT_TIMEOUT,$second);curl_setopt($ch,CURLOPT_RETURNTRANSFER, 1);//这里设置代理,如果有的话//curl_setopt($ch,CURLOPT_PROXY, '10.206.30.98');//curl_setopt($ch,CURLOPT_PROXYPORT, 8080);curl_setopt($ch,CURLOPT_URL,$url);curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,false);curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,false);//以下两种方式需选择一种//第一种方法,cert 与 key 分别属于两个.pem文件//默认格式为PEM,可以注释curl_setopt($ch,CURLOPT_SSLCERTTYPE,'PEM');curl_setopt($ch,CURLOPT_SSLCERT,dirname(__FILE__).'/hongbao/apiclient_cert.pem');//默认格式为PEM,可以注释curl_setopt($ch,CURLOPT_SSLKEYTYPE,'PEM');curl_setopt($ch,CURLOPT_SSLKEY,dirname(__FILE__).'/hongbao/apiclient_key.pem');curl_setopt($ch,CURLOPT_CAINFO,'PEM');curl_setopt($ch,CURLOPT_CAINFO,dirname(__FILE__).'/hongbao/rootca.pem');//第二种方式,两个文件合成一个.pem文件//curl_setopt($ch,CURLOPT_SSLCERT,getcwd().'/all.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;}}}?>