[原创] 微信红包接口

微信 微信红包 微信用户信息

2015-10-25 12532

微信网页授权获取用户信息的接口实现很早之前已经实现过,链接如下

http://lixuanqi.com/articles/29

微信红包接口文档地址为https://pay.weixin.qq.com/wiki/doc/api/cash_coupon.php?chapter=13_5


红包发放说明

用于企业向微信用户个人发现金红包 

目前支持向指定微信用户的openid发放指定金额红包。(获取openid参见微信公众平台开发者文档:网页授权获取用户基本信息) 

如需操作请登录https://pay.weixin.qq.com/

红包发放说明

红包发放说明

接口调用请求说明 

请求Url https://api.mch.weixin.qq.com/mmpaymkttransfers/sendredpack
是否需要证书 是(证书及使用说明详见商户证书
请求方式 POST

请求参数 

字段名 字段 必填 示例值 类型 说明
随机字符串 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) 
商户名称 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
用户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 发放失败,此请求可能存在风险,已被微信拦截 用户账号异常,被拦截 请提醒用户检查自身帐号是否异常。使用常用的活跃的微信号可避免这种情况。
TIME_LIMITED 企业红包的发送时间受限 当前时间被限制发送红包 请北京时间0:00-8:00时间之外触发红包赠送
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参数


以上内容摘自微信接口文档,参考原始文档实现自己的代码就很简单了。其中需要用到的gem主要还是rest-client,在网页授权接口那个实现中已经做过介绍。实现的主要代码如下,就是封装一个请求的xml,post提交到微信指定的接口地址。因为发放红包的时候需要指定openid,可以把通过网页授权获取的用户信息保存在session中主要代码如下



以上代码中没有签名部分的内容,需要用下面截图中的替换掉post请求部分的内容,这个是后来测试时发现问题找到的解决办法。签名文件直接从微信支付平台下载就好,签名文件的秘钥默认是商户号。这些内容可以参考证书的使用说明文件。在xml参数中的签名文件中需要加入key的值为api的密码,是自己设置的32位秘钥,不要记错了。