微信开发文档:
现金红包: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 "; 161 curl_close($ch); 162 return false; 163 } 164 }