zoukankan      html  css  js  c++  java
  • 微信支付现金红包接口应用实例代码说明和DEMO详解,适合用来做微信红包营销活动、吸粉利器

     
    本文详细介绍微信红包开发的接口,商户调用接口时,通过指定发送对象以及发送金额的方式发放红包,领取到红包后,用户的资金直接进入微信零钱。后面带有具体调用php实例
     
    总结一下:需要注意的是PEM秘钥文件要注意路径,别弄错了,一般如果调用接口发现没反应,可能就是这个秘钥文件路径错误导致的。
     

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

    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元)

    最新微信发红包接口实例

    (需要做微信红包营销的,可以联系笔者进行定制开发或者租用我们自己研发的云平台,传送门

    下面是一个类。使用方法:

    1
    2
    3
    4
    5
    6
    7
    <span style="font-size: 16px">$arr['openid']='ojgTTt8oF9VdYcGsJMACHpA-jy1U';
                $arr['hbname']="提现申请";
                $arr['body']="您的提现申请已经成功";
                $arr['fee']=1;
    $comm new Common_util_pub();          
    $re $comm->sendhongbaoto($arr);
    var_dump($re);</span>


    注意证书位置和 商户后台设置的key需要修改。

     
     
     
     
     
     
     
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    <?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');
                                                 //引入上面2个PEM即可,下面这个貌似不用
                    curl_setopt($ch,CURLOPT_CAINFO,dirname(__FILE__).'/hongbao/rootca.pem');
       
                    //第二种方式,两个文件合成一个.pem文件
                    //curl_setopt($ch,CURLOPT_SSLCERT,getcwd().'/all.pem');
       
                    ifcount($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;
                    }
            }
          
      
    }
      
    ?>
  • 相关阅读:
    细说java中Map的两种迭代方式
    Greenplum query Oracle via DLINK
    去除高清视频锯齿几个方法
    c语言基础学习09_关于复合类型的复习
    c语言基础学习09_复合类型
    原码、反码、补码 详解
    Win10系统怎样让图片的打开方式为照片查看器?
    Android内存泄漏分析实战
    grid control 11.1.0.1 安装指南
    Web中树形数据(层级关系数据)的实现—以行政区树为例
  • 原文地址:https://www.cnblogs.com/kenshinobiy/p/10343933.html
Copyright © 2011-2022 走看看