微信支付发放现金红包

这篇博客介绍了如何使用PHP实现微信支付发放红包的功能。首先,需要下载商户平台证书并上传到服务器,然后按照微信官方文档提供的接口和参数顺序组装请求数据。在请求数据中,包括商户订单号、商户号、公众账号ID、红包金额、用户openid等关键信息,并通过API密钥生成签名。最后,使用curl发送XML数据到微信API接口,接收并解析响应结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

微信支付发放现金红包

转载:https://blog.youkuaiyun.com/qq_36025814/article/details/111263998

1.商户平台证书下载并上传至服务器
2.微信官方文档:https://pay.weixin.qq.com/wiki/doc/api/tools/cash_coupon.php?chapter=13_4&index=3

<?php 
/**
 *
 */
 $url = 'https://api.mch.weixin.qq.com/mmpaymkttransfers/sendredpack'; //微信发放红包API地址

 $money = 1;
 $amount = $money * 100; //红包金额:需要转成微信需要的单位-分

 //组装接口请求数据:就按照文档的参数顺序来
 $params = [
     'nonce_str' => getRandStr(), //随机字符串,不长于32位
     //'sign' => '', //签名
     'mch_billno' => getUniqidStr(), //商户订单号(每个订单号必须唯一。取值范围:0~9,a~z,A~Z)
     'mch_id' => '', //商户号-微信支付分配的商户号
     'wxappid' => '', //公众账号appid-微信分配的公众账号ID(企业号corpid即为此appId)。在微信开放平台(open.weixin.qq.com)申请的移动应用appid无法使用该接口。
     'send_name' => '', //商户名称-红包发送者名称(注意:敏感词会被转义成字符*)
     're_openid' => "oAQ256TiClWUwj4sfs1ij0XKqB3Q", //用户openid-接受红包的用户openid
     'total_amount' => $amount, //付款金额:单位-分
     'total_num' => 1, //红包发放总人数:total_num=1
     'wishing' => '', //红包祝福语(注意:敏感词会被转义成字符*)
     'client_ip' => $_SERVER['SERVER_ADDR'], //Ip地址-调用接口的机器Ip地址
     'act_name' => "", //活动名称(注意:敏感词会被转义成字符*)
     'remark' => "", //备注-备注信息
     //'scene_id' => 0, //场景id-否: 红包金额大于200或者小于1元时,请求参数scene_id必传,参数说明见下文。
     //'risk_info' => 0, //活动信息-否  在数据示例中,这个参数是没有 <![CDATA[]] 的,需要注意一下
 ];

 //发放红包使用场景,红包金额大于200或者小于1元时必传:PRODUCT_1:商品促销,PRODUCT_2:抽奖,PRODUCT_3:虚拟物品兑奖,PRODUCT_4:企业内部福利,PRODUCT_5:渠道分润,PRODUCT_6:保险回馈,PRODUCT_7:彩票派奖,PRODUCT_8:税务刮奖,
 if (($money < 1) || ($money > 200)) {
     $params['scene_id'] = 'PRODUCT_1';
 }

 //签名生成
 $params['sign'] = getSign($params, "API密钥");
//
 $xml = arrayToXml($params);
 $response = curlPostXml($xml, $url, true);
//
$obj = simplexml_load_string($response,"SimpleXMLElement", LIBXML_NOCDATA);
$arr = json_decode(json_encode($obj),true);
echo "<pre>";print_r($arr); echo "</pre>";


function arrayToXml($array) {
    $str = "<xml>";
    foreach ($array as $key => $val) {
        $str .= "<{$key}><![CDATA[{$val}]]></{$key}>";
    }
    $str .= "</xml>";
    return $str;
}

     /**
     * 根据微信的规则,计算出sign参数的值
     * @param $array 待处理的参数
     * @param $key 秘钥
     * @return string 结果数据
     */
     function getSign($array, $key) {
        //1、把数组按照键值升序
        ksort($array);
        //2、数组数据拼接成 a=1&b=2&c=3 形式
        $string = getUrlParam($array);
        //3、在string后加入key参数
        $string = $string . "&key=" . $key;
        //4、md5加密
        $string = md5($string);
        //5、字符串转为大写并返回
        return strtoupper($string);
    }

    function getUrlParam($array) {
        $string = "";
        foreach ($array as $key => $value) {
            if ($value && !is_array($value) && ($key != 'sign')) { //值存在并且不是数组;并且键名不为sign
                $string .= "{$key}={$value}&";
            }
        }

        if ($string) { //去除最右边的特殊字符&
            $string = rtrim($string, '&');
        }
        return $string;
    }

        /**
     * 创建随机字符串
     * @param $length
     * @return string
     */
    function getRandStr($length = 16) {
        $string = "";
        $chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; //随机字符
        for ($i = 0; $i < $length; $i++) {
            $string .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);
        }
        return $string;
    }

    /**
     * 创建随机唯一字符串
     * @param string $prefix 自定义前缀:WR-wechatReward
     * @param int $length 随机的字符串长度
     * @return string
     */
    function getUniqidStr($prefix = 'RenEnve', $length = 4) {
        $string = "";
        for($i = 0; $i < $length; $i++) {
            $string .= mt_rand(0, 9);
        }
        return $prefix . uniqid() . $string;
    }

    
    /**
     * post方式传xml数据请求接口
     * 由于curl_setopt设置实在是太多了:这个方法中可能不是很完善,大家实际运用中发现了问题再添加curl_setopt相关设置
     * @param $xml 请求的XML数据
     * @param $url 请求的地址
     * @param bool $certCheck 是否需要证书校验:false-否; true-是
     * @param array $header 请求头设置
     * @param int $second 超时时间设置(默认30秒)
     * @return bool|string 返回的结果数据
     * @throws Exception 接口请求异常提示
     */
     function curlPostXml($xml, $url, $certCheck = false, $header = [], $second = 30) {
        //开启句柄
        $ch = curl_init();

        //超时时间
        curl_setopt($ch,CURLOPT_TIMEOUT,$second);
        curl_setopt($ch,CURLOPT_RETURNTRANSFER, 1);

        //这里设置代理,如果有的话
        //curl_setopt($ch,CURLOPT_PROXY, '11.***.**.11');
        //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);

        //是否传入证书
        //apiclient_cert.p12是商户证书文件,除PHP外的开发均使用此证书文件。
        //咱们PHP使用这两个证书哈:apiclient_cert.pem apiclient_key.pem
        //微信支付证书文档地址:https://pay.weixin.qq.com/wiki/doc/api/tools/cash_coupon.php?chapter=4_3
        if ($certCheck) {
            //请注意:这2个文件隐私性是极高的,我们linux中应该设置这2个文件夹权限为只读,不能修改,也不能下载。
            curl_setopt($ch,CURLOPT_SSLCERTTYPE,'PEM'); //默认格式为PEM,可以注释
            //绝对地址可使用 dirname(__DIR__)打印,如果不是绝对地址会报 58 错误
            curl_setopt($ch,CURLOPT_SSLCERT, 'ssl.crt\apiclient_cert.pem');
            curl_setopt($ch,CURLOPT_SSLKEYTYPE,'PEM');
            curl_setopt($ch,CURLOPT_SSLKEY, 'ssl.key\apiclient_key.pem');
        }

        //设置请求头
        if ($header) {
            curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
        }

        curl_setopt($ch,CURLOPT_POST, 1); //POST请求:第二个值可以传int类型的:1,也可以传bool类型的:true
        curl_setopt($ch,CURLOPT_POSTFIELDS, $xml);
        $data = curl_exec($ch); //去请求接口
        if ($data) {
            curl_close($ch); //关闭句柄
            return $data;
        } else {
            $error = curl_errno($ch); //获取错误码
            curl_close($ch); //关闭句柄
            throw new Exception("请求异常, errorCode:{$error}"); //如果证书地址错误,可能会报58错误
        }
    }


?>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值