微信支付現金紅包接口正式開放,只需開通微信支付,即可接入現金紅包。通過現金紅包接口,公眾號開發者可以策划相關運營活動,向用戶發放微信支付現金紅包,更好的達到品牌推廣及回饋用戶的效果。具體能力如下:
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元) |
最新微信發紅包接口實例
(需要做微信紅包營銷的,可以聯系筆者進行定制開發或者租用我們自己研發的雲平台,傳送門)
下面是一個類。使用方法:
1
2
3
4
5
6
7
|
<span style=
"font-size: 16px"
>
$arr
[
'openid'
]=
'ojgTTt8oF9VdYcGsJMACHpA-jy1U'
;
$arr
[
'hbname'
]=
"提現申請"
;
$arr
[
'body'
]=
"您的提現申請已經成功"
;
$arr
[
'fee'
]=1;
$comm
=
new
Common_util_pub();
$re
=
$comm
->sendhongbaoto(
$arr
);
var_dump(
$re
);</span>
|
注意證書位置和 商戶后台設置的key需要修改。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
|
<?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'
);
//引入上面2個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;
}
}
}
?>
|