微信支付現金紅包接口正式開放,只需開通微信支付,即可接入現金紅包。通過現金紅包接口,公眾號開發者可以策划相關運營活動,向用戶發放微信支付現金紅包,更好的達到品牌推廣及回饋用戶的效果。具體能力如下:
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;
}
}
}
?>
