微信支付现金红包接口说明及应用实例代码

本文我将详细介绍微信红包开发的接口,商户调用接口时,通过指定发送对象以及发送金额的方式发放红包,领取到红包后,用户的资金直接进入微信零钱。后面带有具体调用php实例
 

微信支付现金红包接口正式开放,只需开通微信支付,即可接入现金红包。通过现金红包接口,公众号开发者可以策划相关运营活动,向用户发放微信支付现金红包,更好的达到品牌推广及回馈用户的效果。具体能力如下:

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
"; 
                        curl_close($ch);
                        return false;
                }
        }
     
 
}
 
?>
原文地址:https://www.cnblogs.com/onlylove2015/p/5934129.html