zoukankan      html  css  js  c++  java
  • 微信支付现金红包接口说明及应用实例代码

    本文我将详细介绍微信红包开发的接口,商户调用接口时,通过指定发送对象以及发送金额的方式发放红包,领取到红包后,用户的资金直接进入微信零钱。后面带有具体调用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;
                    }
            }
         
     
    }
     
    ?>
  • 相关阅读:
    5.基于文件验证的vsftp虚拟用户
    linux系统用户登录ftp
    4.ftp用户禁锢
    原码,反码,补码
    8map
    命令jhsdb jmap heap pid 1 报错
    20211112_mysql_8.0docker部署踩坑
    Windows 下 tail 查看日志命令工具分享
    前后端java+vue 实现rsa 加解密与摘要签名算法
    优化TTFB 至500ms内
  • 原文地址:https://www.cnblogs.com/onlylove2015/p/5934129.html
Copyright © 2011-2022 走看看