微信開發文檔:
現金紅包:https://pay.weixin.qq.com/wiki/doc/api/tools/cash_coupon.php?chapter=13_5
裂變紅包:https://pay.weixin.qq.com/wiki/doc/api/tools/cash_coupon.php?chapter=16_5
一、微信紅包SDK
1、請求url:
現金紅包:https://api.mch.weixin.qq.com/mmpaymkttransfers/sendredpack
裂變紅包:https://api.mch.weixin.qq.com/mmpaymkttransfers/sendgroupredpack
2、紅包發送規則
1)現金紅包發送規則
1、發送頻率規則
◆ 每分鍾發送紅包數量不得超過1800個;
◆ 同一個商戶號,每分鍾最多給同一個用戶發送一個紅包;
2、紅包規則
◆ 單個紅包金額介於[1.00元,200.00元]之間;
◆ 同一個紅包只能發送給一個用戶;(如果以上規則不滿足您的需求,請發郵件至wxhongbao@tencent.com獲取升級指引)
◆ 紅包發放后72小時未被領取將進行退款
2)裂變紅包發送規則
1、 發送頻率規則
◆ 每分鍾發送紅包數量不得超過1800個;
◆ 北京時間0:00-8:00不觸發紅包贈送;
(如果以上規則不滿足您的需求,請發郵件至wxhongbao@tencent.com獲取升級指引)
2、紅包規則
◆ 單個紅包金額介於[1.00元,1000.00元]之間;
◆ 裂變組合中的每個紅包平均金額介於[1.00元,200.00元]之間;
◆ 同一組裂變紅包只能發送給一個用戶;
(如果以上規則不滿足您的需求,請發郵件至wxhongbao@tencent.com獲取升級指引)
3、參數說明
1)現金紅包參數:
字段名 | 字段 | 必填 | 示例值 | 類型 | 說明 |
---|---|---|---|---|---|
隨機字符串 | nonce_str | 是 | 5K8264ILTKCH16CQ2502SI8ZNMTM67VS | String(32) | 隨機字符串,不長於32位 |
簽名 | sign | 是 | C380BEC2BFD727A4B6845133519F3AD6 | String(32) | 詳見簽名生成算法 |
商戶訂單號 | mch_billno | 是 | 10000098201411111234567890 | String(28) | 商戶訂單號(每個訂單號必須唯一) 組成:mch_id+yyyymmdd+10位一天內不能重復的數字。 接口根據商戶訂單號支持重入,如出現超時可再調用。 |
商戶號 | mch_id | 是 | 10000098 | String(32) | 微信支付分配的商戶號 |
公眾賬號appid | wxappid | 是 | wx8888888888888888 | String(32) | 微信分配的公眾賬號ID(企業號corpid即為此appId)。接口傳入的所有appid應該為公眾號的appid(在mp.weixin.qq.com申請的),不能為APP的appid(在open.weixin.qq.com申請的)。 |
商戶名稱 | send_name | 是 | 天虹百貨 | String(32) | 紅包發送者名稱 |
用戶openid | re_openid | 是 | oxTWIuGaIt6gTKsQRLau2M0yL16E | String(32) | 接受紅包的用戶 用戶在wxappid下的openid |
付款金額 | total_amount | 是 | 1000 | int | 付款金額,單位分 |
紅包發放總人數 | 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) | 備注信息 |
數據示例:
<xml>
<sign><![CDATA[E1EE61A91C8E90F299DE6AE075D60A2D]]></sign>
<mch_billno><![CDATA[0010010404201411170000046545]]></mch_billno>
<mch_id><![CDATA[888]]></mch_id>
<wxappid><![CDATA[wxcbda96de0b165486]]></wxappid>
<send_name><![CDATA[send_name]]></send_name>
<re_openid><![CDATA[onqOjjmM1tad-3ROpncN-yUfa6uI]]></re_openid>
<total_amount><![CDATA[200]]></total_amount>
<total_num><![CDATA[1]]></total_num>
<wishing><![CDATA[恭喜發財]]></wishing>
<client_ip><![CDATA[127.0.0.1]]></client_ip>
<act_name><![CDATA[新年紅包]]></act_name>
<remark><![CDATA[新年紅包]]></remark>
<nonce_str><![CDATA[50780e0cca98c8c8e814883e5caa672e]]></nonce_str>
</xml>
返回參數
字段名 | 變量名 | 必填 | 示例值 | 類型 | 說明 |
---|---|---|---|---|---|
返回狀態碼 | 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,接口傳入的所有appid應該為公眾號的appid(在mp.weixin.qq.com申請的),不能為APP的appid(在open.weixin.qq.com申請的)。 |
用戶openid | re_openid | 是 | oxTWIuGaIt6gTKsQRLau2M0yL16E | String(32) | 接受收紅包的用戶 用戶在wxappid下的openid |
付款金額 | total_amount | 是 | 1000 | int | 付款金額,單位分 |
發放成功時間 | send_time | 是 | 20150520102602 | int | 紅包發送時間 |
微信單號 | send_listid | 是 | 100000000020150520314766074200 | String(32) | 紅包訂單的微信單號 |
成功示例:
<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>
<send_listid>100000000020150520314766074200</send_listid>
<send_time>20150520102602</send_time>
</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>
錯誤碼
錯誤碼 | 錯誤描述 | 原因 | 解決方式 |
---|---|---|---|
NO_AUTH | 發放失敗,此請求可能存在風險,已被微信攔截 | 用戶賬號異常,被攔截 | 請提醒用戶檢查自身帳號是否異常。使用常用的活躍的微信號可避免這種情況。 |
SENDNUM_LIMIT | 該用戶今日領取紅包個數超過限制 | 該用戶今日領取紅包個數超過你在微信支付商戶平台配置的上限 | 如有需要、請在微信支付商戶平台【api安全】中重新配置 【每日同一用戶領取本商戶紅包不允許超過的個數】。 |
ILLEGAL_APPID | 非法appid,請確認是否為公眾號的appid,不能為APP的appid | 錯誤傳入了app的appid | 接口傳入的所有appid應該為公眾號的appid(在mp.weixin.qq.com申請的),不能為APP的appid(在open.weixin.qq.com申請的)。 |
MONEY_LIMIT | 紅包金額發放限制 | 發送紅包金額不再限制范圍內 | 每個紅包金額必須大於1元,小於200元(可聯系微信支付wxhongbao@tencent.com申請調高額度) |
SEND_FAILED | 紅包發放失敗,請更換單號再重試 | 該紅包已經發放失敗 | 如果需要重新發放,請更換單號再發放 |
FATAL_ERROR | openid和原始單參數不一致 | 更換了openid,但商戶單號未更新 | 請商戶檢查代碼實現邏輯 |
金額和原始單參數不一致 | 更換了金額,但商戶單號未更新 | 請商戶檢查代碼實現邏輯 | 請檢查金額、商戶訂單號是否正確 |
CA_ERROR | CA證書出錯,請登錄微信支付商戶平台下載證書 | 請求攜帶的證書出錯 | 到商戶平台下載證書,請求帶上證書后重試 |
SIGN_ERROR | 簽名錯誤 | 1、沒有使用商戶平台設置的商戶API密鑰進行加密(有可能之前設置過密鑰,后來被修改了,沒有使用新的密鑰進行加密)。 2、加密前沒有按照文檔進行參數排序(可參考文檔) 3、把值為空的參數也進行了簽名。可到(http://mch.weixin.qq.com/wiki/tools/signverify/ )驗證。 4、如果以上3步都沒有問題,把請求串中(post的數據)里面中文都去掉,換成英文,試下,看看是否是編碼問題。(post的數據要求是utf8) |
1. 到商戶平台重新設置新的密鑰后重試 2. 檢查請求參數把空格去掉重試 3. 中文不需要進行encode,使用CDATA 4. 按文檔要求生成簽名后再重試 在線簽名驗證工具:http://mch.weixin.qq.com/wiki/tools/signverify/ |
SYSTEMERROR | 請求已受理,請稍后使用原單號查詢發放結果 | 系統無返回明確發放結果 | 使用原單號調用接口,查詢發放結果,如果使用新單號調用接口,視為新發放請求 |
XML_ERROR | 輸入xml參數格式錯誤 | 請求的xml格式錯誤,或者post的數據為空 | 檢查請求串,確認無誤后重試 |
FREQ_LIMIT | 超過頻率限制,請稍后再試 | 受頻率限制 | 請對請求做頻率控制(可聯系微信支付wxhongbao@tencent.com申請調高) |
NOTENOUGH | 帳號余額不足,請到商戶平台充值后再重試 | 賬戶余額不足 | 充值后重試 |
OPENID_ERROR | openid和appid不匹配 | openid和appid不匹配 | 發紅包的openid必須是本appid下的openid |
PARAM_ERROR | act_name字段必填,並且少於32個字符 | 請求的act_name字段填寫錯誤 | 填寫正確的act_name后重試 |
發放金額、最小金額、最大金額必須相等 | 請求的金額相關字段填寫錯誤 | 按文檔要求填寫正確的金額后重試 | |
紅包金額參數錯誤 | 紅包金額過大 | 修改金額重試 | |
appid字段必填,最長為32個字符 | 請求的appid字段填寫錯誤 | 填寫正確的appid后重試 | |
訂單號字段必填,最長為28個字符 | 請求的mch_billno字段填寫錯誤 | 填寫正確的billno后重試 | |
client_ip必須是合法的IP字符串 | 請求的client_ip填寫不正確 | 填寫正確的IP后重試 | |
輸入的商戶號有誤 | 請求的mchid字段非法(或者沒填) | 填寫對應的商戶號再重試 | |
找不到對應的商戶號 | 請求的mchid字段填寫錯誤 | 填寫正確的mchid字段后重試 | |
nick_name字段必填,並且少於16字符 | 請求的nick_name字段錯誤 | 按文檔填寫正確的nick_name后重試 | |
nonce_str字段必填,並且少於32字符 | 請求的nonce_str字段填寫不正確 | 按文檔要求填寫正確的nonce_str值后重試 | |
re_openid字段為必填並且少於32個字符 | 請求的re_openid字段非法 | 填寫對re_openid后重試 | |
remark字段為必填,並且少於256字符 | 請求的remark字段填寫錯誤 | 填寫正確的remark后重試 | |
send_name字段為必填並且少於32字符 | 請求的send_name字段填寫不正確 | 按文檔填寫正確的send_name字段后重試 | |
total_num必須為1 | total_num字段值不為1 | 修改total_num值為1后重試 | |
wishing字段為必填,並且少於128個字符 | 缺少wishing字段 | 填寫wishing字段再重試 | |
商戶號和wxappid不匹配 | 商戶號和wxappid不匹配 | 請修改Mchid或wxappid參數 |
2)裂變紅包參數
請求參數
字段名 | 變量名 | 必填 | 示例值 | 類型 | 描述 |
---|---|---|---|---|---|
隨機字符串 | nonce_str | 是 | 5K8264ILTKCH16CQ2502SI8ZNMTM67VS | String(32) | 隨機字符串,不長於32位 |
簽名 | sign | 是 | C380BEC2BFD727A4B6845133519F3AD6 | String(32) | 詳見簽名生成算法 |
商戶訂單號 | mch_billno | 是 | 10000098201411111234567890 | String(28) | 商戶訂單號(每個訂單號必須唯一) 組成: mch_id+yyyymmdd+10位一天內不能重復的數字。 接口根據商戶訂單號支持重入, 如出現超時可再調用。 |
商戶號 | mch_id | 是 | 10000098 | String(32) | 微信支付分配的商戶號 |
公眾賬號appid | wxappid | 是 | wx8888888888888888 | String(32) | 微信分配的公眾賬號ID(企業號corpid即為此appId),接口傳入的所有appid應該為公眾號的appid(在mp.weixin.qq.com申請的),不能為APP的appid(在open.weixin.qq.com申請的)。 |
商戶名稱 | send_name | 是 | 天虹百貨 | String(32) | 紅包發送者名稱 |
用戶openid | re_openid | 是 | oxTWIuGaIt6gTKsQRLau2M0yL16E | String(32) | 接收紅包的種子用戶(首個用戶) 用戶在wxappid下的openid |
總金額 | total_amount | 是 | 1000 | int | 紅包發放總金額,即一組紅包金額總和,包括分享者的紅包和裂變的紅包,單位分 |
紅包發放總人數 | total_num | 是 | 3 | int | 紅包發放總人數,即總共有多少人可以領到該組紅包(包括分享者) |
紅包金額設置方式 | amt_type | 是 | ALL_RAND | String(32) | 紅包金額設置方式 ALL_RAND—全部隨機,商戶指定總金額和紅包發放總人數,由微信支付隨機計算出各紅包金額 |
紅包祝福語 | wishing | 是 | 感謝您參加猜燈謎活動,祝您元宵節快樂! | String(128) | 紅包祝福語 |
活動名稱 | act_name | 是 | 猜燈謎搶紅包活動 | String(32) | 活動名稱 |
備注 | remark | 是 | 猜越多得越多,快來搶! | String(256) | 備注信息 |
數據示例:
<sign><![CDATA[E1EE61A91C8E90F299DE6AE075D60A2D]]></sign>
<mch_billno><![CDATA[0010010404201411170000046545]]></mch_billno>
<mch_id><![CDATA[1000888888]]></mch_id>
<wxappid><![CDATA[wxcbda96de0b165486]]></wxappid>
<send_name><![CDATA[send_name]]></send_name>
<re_openid><![CDATA[onqOjjmM1tad-3ROpncN-yUfa6uI]]></re_openid>
<total_amount><![CDATA[600]]></total_amount>
<amt_type><![CDATA[ALL_RAND]]></amt_type>
<total_num><![CDATA[3]]></total_num>
<wishing><![CDATA[恭喜發財]]></wishing>
<act_name><![CDATA[新年紅包]]></act_name>
<remark><![CDATA[新年紅包]]></remark>
<nonce_str><![CDATA[50780e0cca98c8c8e814883e5caa672e]]></nonce_str>
</xml>
返回參數
字段名 | 變量名 | 必填 | 示例值 | 類型 | 描述 |
---|---|---|---|---|---|
返回狀態碼 | 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) | 微信分配的公眾賬號ID(企業號corpid即為此appId) |
用戶openid | re_openid | 是 | oxTWIuGaIt6gTKsQRLau2M0yL16E | String(32) | 接受收紅包的用戶 用戶在wxappid下的openid |
總金額 | total_amount | 是 | 1000 | int | 付款總金額,單位分 |
發放成功時間 | send_time | 是 | 20150227091010 | String(14) | 紅包發放成功時間,格式為yyyyMMddHHmmss,如2015年02月27日9點10分10秒表示為20150227091010。 |
微信單號 | send_listid | 是 | 100000000020150520314766074200 | String(32) | 微信紅包訂單號 |
成功示例:
<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>3</total_amount>
<send_time><![CDATA[20150227091010]]></send_time>
<send_listid><![CDATA[1000000000201502270093647546]]></send_listid>
</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>3</total_amount>
</xml>
錯誤碼
錯誤碼 | 描述 | 解決方案 |
---|---|---|
NO_AUTH | 發放失敗,此請求可能存在風險,已被微信攔截 | 請提醒用戶檢查自身帳號是否異常。使用常用的活躍的微信號可避免這種情況。 |
SENDNUM_LIMIT | 該用戶今日領取紅包個數超過限制 | 如有需要、請在微信支付商戶平台【api安全】中重新配置 【每日同一用戶領取本商戶紅包不允許超過的個數】。 |
CA_ERROR | 請求未攜帶證書,或請求攜帶的證書出錯 | 到商戶平台下載證書,請求帶上證書后重試。 |
ILLEGAL_APPID | 錯誤傳入了app的appid | 接口傳入的所有appid應該為公眾號的appid(在mp.weixin.qq.com申請的),不能為APP的appid(在open.weixin.qq.com申請的)。 |
SIGN_ERROR | 商戶簽名錯誤 | 按文檔要求重新生成簽名后再重試。 |
FREQ_LIMIT | 受頻率限制 | 請對請求做頻率控制 |
XML_ERROR | 請求的xml格式錯誤,或者post的數據為空 | 檢查請求串,確認無誤后重試 |
PARAM_ERROR | 參數錯誤 | 請查看err_code_des,修改設置錯誤的參數 |
OPENID_ERROR | Openid錯誤 | 根據用戶在商家公眾賬號上的openid,獲取用戶在紅包公眾賬號上的openid 錯誤。請核對商戶自身公眾號appid和用戶在此公眾號下的openid。 |
NOTENOUGH | 余額不足 | 商戶賬號余額不足,請登錄微信支付商戶平台充值 |
FATAL_ERROR | 重復請求時,參數與原單不一致 | 使用相同商戶單號進行重復請求時,參數與第一次請求時不一致,請檢查並修改參數后再重試。 |
SECOND_OVER_LIMITED | 企業紅包的按分鍾發放受限 | 每分鍾發送紅包數量不得超過1800個;(可聯系微信支付wxhongbao@tencent.com調高額度) |
DAY_ OVER_LIMITED | 企業紅包的按天日發放受限 | 單個商戶日發送紅包數量不大於10000個;(可聯系微信支付wxhongbao@tencent.com調高額度) |
MONEY_LIMIT | 紅包金額發放限制 | 每個紅包金額必須大於1元,小於1000元(可聯系微信支付wxhongbao@tencent.com調高額度至4999元) |
SEND_FAILED | 紅包發放失敗,請更換單號再重試 | 原商戶單號已經失敗,如果還要對同一個用戶發放紅包, 需要更換新的商戶單號再試。 |
SYSTEMERROR | 系統繁忙,請再試。 | 可用同一商戶單號再次調用,只會發放一個紅包 |
二、代碼實現:
1 //生成一個長度10,的阿拉伯數字隨機字符串 2 $rnd_num = array('0','1','2','3','4','5','6','7','8','9'); 3 $rndstr = ""; 4 while(strlen($rndstr)<10){ 5 $rndstr .= $rnd_num[array_rand($rnd_num)]; 6 } 7 $mch_id = "0000000000"; //微信支付分配的商戶號 8 $mch_billno = $mch_id.date("Ymd").$rndstr;//訂單ID 9 $wxappid = 'wx4b83ddf2e918461e';//公眾賬號appid 10 $send_name = 'sendname'; //商戶名稱 11 $re_openid = 'or6TQjlK6579JAIo41ZwzNUUQNOw'; //用戶openid 12 $total_amount = '300'; // 付款金額,單位分 13 $total_num = '3'; //紅包發放總人數 14 $wishing = 'wishing'; //紅包祝福語 15 $act_name = '猜燈謎搶紅包活動'; //活動名稱 16 $remark = 'remarkcontent'; //備注 17 $nonce_str = md5(rand()); //隨機字符串,不長於32位 18 $paysecret = 'as99Ee13KkwsdfuGeNd5ia9orter323A'; //32位 19 20 $redpack_info = array ( 21 'mch_billno' => $mch_billno, 22 'mch_id' => $mch_id, 23 'wxappid' => $wxappid, 24 'send_name' => $send_name, 25 're_openid' => $re_openid, 26 'total_amount' => $total_amount, 27 'total_num' => $total_num, 28 'wishing' => $wishing, 29 'act_name' => $act_name, 30 'remark' => $remark, 31 'nonce_str'=> $nonce_str 32 ); 33 sendRedpack($redpack_info);//發送現金紅包 34 35 36 /* 37 現金紅包 38 */ 39 function sendRedpack($array) 40 { 41 if('/'==DIRECTORY_SEPARATOR){ 42 $client_ip=$_SERVER['SERVER_ADDR']; 43 }else{ 44 $client_ip=@gethostbyname($_SERVER['SERVER_NAME']); 45 } 46 $array['client_ip'] = $client_ip; 47 array_filter($array); // 清空參數為空的數組元素 48 ksort($array); // 按照參數名ASCII碼從小到大排序 49 50 $stringA = ""; 51 foreach($array as $key => $row){ 52 $stringA .= "&" . $key . '=' . $row; 53 } 54 $stringA = substr ( $stringA, 1 ); 55 // 拼接API密鑰: 56 $stringSignTemp = $stringA."&key=".$paysecret; 57 $sign = strtoupper(md5($stringSignTemp));//簽名 58 $textTpl = '<xml> 59 <mch_billno><![CDATA[%s]]></mch_billno> 60 <mch_id><![CDATA[%s]]></mch_id> 61 <wxappid><![CDATA[%s]]></wxappid> 62 <send_name><![CDATA[%s]]></send_name> 63 <re_openid><![CDATA[%s]]></re_openid> 64 <total_amount><![CDATA[%s]]></total_amount> 65 <total_num><![CDATA[%s]]></total_num> 66 <wishing><![CDATA[%s]]></wishing> 67 <client_ip><![CDATA[%s]]></client_ip> 68 <act_name><![CDATA[%s]]></act_name> 69 <remark><![CDATA[%s]]></remark> 70 <nonce_str><![CDATA[%s]]></nonce_str> 71 <sign><![CDATA[%s]]></sign> 72 </xml>'; 73 $resultStr = sprintf($textTpl, $array['mch_billno'], $array['mch_id'], $array['wxappid'], $array['send_name'],$array['re_openid'],$array['total_amount'],$array['total_num'],$array['wishing'],$array['client_ip'],$array['act_name'],$array['remark'],$array['nonce_str'],$sign); 74 $url = "https://api.mch.weixin.qq.com/mmpaymkttransfers/sendredpack"; 75 echo $this->curl_post_ssl($url, $resultStr); 76 } 77 78 /* 79 裂變紅包 80 */ 81 function sendGroupRedpack($array) 82 { 83 $amt_type = "ALL_RAND"; //紅包金額設置方式 ALL_RAND—全部隨機,商戶指定總金額和紅包發放總人數,由微信支付隨機計算出各紅包金額 84 $array['amt_type']=$amt_type; 85 array_filter($array); // 清空參數為空的數組元素 86 ksort($array); // 按照參數名ASCII碼從小到大排序 87 88 $stringA = ""; 89 foreach($array as $key => $row){ 90 $stringA .= "&" . $key . '=' . $row; 91 } 92 $stringA = substr ( $stringA, 1 ); 93 // 拼接API密鑰: 94 $stringSignTemp = $stringA."&key=".$paysecret; 95 $sign = strtoupper(md5($stringSignTemp));//簽名 96 $textTpl = '<xml> 97 <sign><![CDATA[%s]]></sign> 98 <mch_billno><![CDATA[%s]]></mch_billno> 99 <mch_id><![CDATA[%s]]></mch_id> 100 <wxappid><![CDATA[%s]]></wxappid> 101 <send_name><![CDATA[%s]]></send_name> 102 <re_openid><![CDATA[%s]]></re_openid> 103 <total_amount><![CDATA[%s]]></total_amount> 104 <amt_type><![CDATA[%s]]></amt_type> 105 <total_num><![CDATA[%s]]></total_num> 106 <wishing><![CDATA[%s]]></wishing> 107 <act_name><![CDATA[%s]]></act_name> 108 <remark><![CDATA[%s]]></remark> 109 <nonce_str><![CDATA[%s]]></nonce_str> 110 </xml>'; 111 $resultStr = sprintf($textTpl, $sign, $array['mch_billno'], $array['mch_id'], $array['wxappid'], $array['send_name'],$array['re_openid'],$array['total_amount'],$array['amt_type'],$array['total_num'],$array['wishing'],$array['act_name'],$array['remark'],$array['nonce_str']); 112 $url = "https://api.mch.weixin.qq.com/mmpaymkttransfers/sendgroupredpack"; 113 echo $this->curl_post_ssl($url, $resultStr); 114 } 115 116 function curl_post_ssl($url, $vars, $second=30,$aHeader=array()) 117 { 118 $ch = curl_init(); 119 //超時時間 120 curl_setopt($ch,CURLOPT_TIMEOUT,$second); 121 curl_setopt($ch,CURLOPT_RETURNTRANSFER, 1); 122 //這里設置代理,如果有的話 123 //curl_setopt($ch,CURLOPT_PROXY, '10.206.30.98'); 124 //curl_setopt($ch,CURLOPT_PROXYPORT, 8080); 125 curl_setopt($ch,CURLOPT_URL,$url); 126 curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,false); 127 curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,false); 128 129 //以下兩種方式需選擇一種 130 131 //第一種方法,cert 與 key 分別屬於兩個.pem文件 132 //默認格式為PEM,可以注釋 133 curl_setopt($ch,CURLOPT_SSLCERTTYPE,'PEM'); 134 curl_setopt($ch,CURLOPT_SSLCERT,'apiclient_cert.pem'); 135 //默認格式為PEM,可以注釋 136 curl_setopt($ch,CURLOPT_SSLKEYTYPE,'PEM'); 137 curl_setopt($ch,CURLOPT_SSLKEY,'apiclient_key.pem'); 138 curl_setopt($ch,CURLOPT_CAINFO,'rootca.pem'); 139 140 //第二種方式,兩個文件合成一個.pem文件 141 //curl_setopt($ch,CURLOPT_SSLCERT,getcwd().'/all.pem'); 142 143 if( count($aHeader) >= 1 ){ 144 curl_setopt($ch, CURLOPT_HTTPHEADER, $aHeader); 145 } 146 147 curl_setopt($ch,CURLOPT_POST, 1); 148 curl_setopt($ch,CURLOPT_POSTFIELDS,$vars); 149 $data = curl_exec($ch); 150 if($data){ 151 $rsxml = simplexml_load_string($data); 152 153 if($rsxml->result_code=='SUCCESS'){echo "業務結果成功<br/>";} 154 echo "call success"; 155 curl_close($ch); 156 return $data; 157 } 158 else { 159 $error = curl_errno($ch); 160 echo "call faild, errorCode:$error\n"; 161 curl_close($ch); 162 return false; 163 } 164 }