PHP实现微信小程序提现到零钱

博客指出微信小程序需开通提现相关接口,否则会提现失败。若用个人营业执照注册的小程序,不能申请提现业务,还给出了接口错误示例,提醒开发者注意权限验证。
 //提现
    public function wx_withdrawal()
    {
        header('content-type:text/html;charset=utf-8');
        $mch_appid = "xxxxx";   #appid
        $key = "xxxxx";     #商户key
        $mchid = "xxxx";    #商户号
        $desc = '提现';
        $openid = 'xxxxxx';
        $check_name = 'NO_CHECK';     #此参数为不验证真实姓名,如果需要验证真实姓名,请参考微信文档,注意参数排序,否则将报错->签名错误
        #$re_user_name='';        #微信真实姓名

        $nonce_str = strtoupper(md5(time()));
        $partner_trade_no = time() . rand(100, 999);   #订单号
        $amount = 0.3 * 100;     #总金额   最小0.3,最大5000,以分为单位,金额*100
        $spbill_create_ip = $_SERVER['REMOTE_ADDR'];
        $www_url = $_SERVER['HTTP_HOST'];
        $stringA = "amount={$amount}&check_name={$check_name}&desc={$desc}&mch_appid={$mch_appid}&mchid={$mchid}&nonce_str={$nonce_str}&openid={$openid}&partner_trade_no={$partner_trade_no}&spbill_create_ip={$spbill_create_ip}";
        $stringSignTemp = $stringA . "&key=" . $key;
        $sign = strtoupper(md5($stringSignTemp));
        $postData =
            "<xml>
    <amount>{$amount}</amount>
    <check_name>{$check_name}</check_name>
    <desc>{$desc}</desc>
    <mch_appid>{$mch_appid}</mch_appid>
    <mchid>{$mchid}</mchid>
    <nonce_str>{$nonce_str}</nonce_str>
    <openid>{$openid}</openid>
    <partner_trade_no>{$partner_trade_no}</partner_trade_no>
    <spbill_create_ip>{$spbill_create_ip}</spbill_create_ip>
    <sign>{$sign}</sign>
    </xml>";
        $url = 'https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers';
        print_r($this->postCertXmlCurl($url, $postData));   #在这里post请求是要带证书,方法如下
        die();
        if ($dataxml['return_code'] == 'SUCCESS' && $dataxml['result_code'] == 'SUCCESS') {
            #执行提现到账后的逻辑
            echo '成功';
        } else {
            $this->error($dataxml['err_code_des']);
        }
    }

    function postCertXmlCurl($url, $xml)
    {

        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);//严格校验
        //设置header
        curl_setopt($ch, CURLOPT_HEADER, FALSE);
        //要求结果为字符串且输出到屏幕上
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);

        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 1);//证书检查
        curl_setopt($ch, CURLOPT_SSLCERTTYPE, 'pem');
        curl_setopt($ch, CURLOPT_SSLCERT, $_SERVER['DOCUMENT_ROOT'] . '/cert/apiclient_cert.pem');
        curl_setopt($ch, CURLOPT_SSLCERTTYPE, 'pem');
        curl_setopt($ch, CURLOPT_SSLKEY, $_SERVER['DOCUMENT_ROOT'] . '/cert/apiclient_key.pem');
        //    curl_setopt($ch,CURLOPT_SSLCERTTYPE,'pem');
        //    curl_setopt($ch,CURLOPT_CAINFO,dirname(__FILE__).'/cert/rootca.pem');

        //post提交方式
        curl_setopt($ch, CURLOPT_POST, TRUE);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);
        //运行curl
        $data = curl_exec($ch);
        $objectxml = (array)simplexml_load_string($data, 'SimpleXMLElement', LIBXML_NOCDATA);
        //         $data = $this->xml_to_json($data);
        return $objectxml;
        //         dump($objectxml);die;
    }

特别注意一点   小程序需要开通提现相关接口  否则会提现失败  
如果你的小程序用的是个人营业执照注册的  将不能申请提现业务
下面是接口错误:

Array

(

    [return_code] => SUCCESS

    [return_msg] => NO_AUTH

    [mch_appid] => xxxxxxxx

    [mchid] => xxxxxxxxx

    [result_code] => FAIL

    [err_code] => NO_AUTH

    [err_code_des] => 产品权限验证失败,请查看您当前是否具有该产品的权限

)

<think>我们正在处理用户关于微信小程序提现功能的PHP后端开发问题。根据用户需求,我们需要实现微信小程序提现功能,即企业付款到用户零钱的功能。由于微信支付的企业付款需要使用双向证书,而PHP中我们可以通过cURL来使用证书。 主要步骤: 1. 准备工作:下载微信支付证书(从微信商户平台下载apiclient_cert.p12),然后转换为PEM格式(通常PHP需要两个文件:apiclient_cert.pem和apiclient_key.pem)。转换方法可以使用OpenSSL命令(用户提供的示例中已经给出,但那是针对Python的,我们这里需要适用于PHP的格式,实际上PHP的cURL支持PEM格式,所以转换方法相同)。 2. 统一下单?注意:企业付款和普通支付下单不同,企业付款是直接调用企业付款API,不需要统一下单。 3. 调用企业付款API:https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers 4. 处理回调?注意:企业付款没有回调通知,所以需要我们自己通过查询接口来确认付款结果(或者根据返回结果判断,但有时网络问题可能导致不确定,因此建议在出现异常时使用查询接口确认)。 5. 注意安全:证书和密钥的存放要安全,不要暴露在web可访问的目录下。 具体步骤: 第一步:证书转换 下载的apiclient_cert.p12文件,使用以下命令转换为两个PEM文件(在Linux或Mac的终端中执行): openssl pkcs12 -clcerts -nokeys -in apiclient_cert.p12 -out apiclient_cert.pem openssl pkcs12 -nocerts -in apiclient_cert.p12 -out apiclient_key.pem 注意:执行第二个命令时,会要求输入密码(即p12文件的密码,默认为商户号),然后还会要求输入一个新的密码来加密输出的key文件。为了方便,我们可以设置一个空密码(直接回车两次),但这样会降低安全性。或者,我们可以在PHP代码中设置这个密码(如果设置了的话)。 第二步:编写PHP代码调用企业付款API 企业付款API需要以下参数(必填): mch_appid:小程序ID mchid:商户号 nonce_str:随机字符串 partner_trade_no:商户订单号(需唯一) openid:用户的openid check_name:校验用户姓名选项(NO_CHECK:不校验,FORCE_CHECK:强校验,OPTION_CHECK:针对已实名认证的用户才校验) amount:金额(单位:分) desc:企业付款描述 spbill_create_ip:调用接口的机器IP 另外,还需要签名(sign),签名算法为HMAC-SHA256(注意:微信支付现在默认使用HMAC-SHA256,之前是MD5,具体看文档要求)。 代码步骤: a. 构造请求参数数组 b. 生成签名 c. 将参数数组转换为XML d. 使用cURL发送请求(需要设置证书和密钥) 注意:企业付款需要商户号开通了企业付款功能,且需要满足一定的条件(如账户余额充足)。 由于企业付款没有回调,所以我们需要根据返回结果判断是否成功。如果返回结果中result_code为SUCCESS,则表示请求成功;否则需要根据错误码处理。 示例代码: 假设我们已经将证书文件放在安全目录(如/path/to/cert/)下,文件名为apiclient_cert.pem和apiclient_key.pem。 下面是一个简单的实现示例:</think>### 微信小程序提现功能实现PHP后端开发微信小程序提现功能需调用**微信支付企业付款到零钱**接口,以下是PHP实现的核心步骤: #### 一、准备工作 1. **下载证书** 登录[微信商户平台](https://pay.weixin.qq.com) → API安全 → 证书下载 获取文件:`apiclient_cert.p12`(PKCS#12格式) 2. **转换证书格式**(PHP需PEM格式) ```bash # 转换公钥证书 openssl pkcs12 -clcerts -nokeys -in apiclient_cert.p12 -out apiclient_cert.pem # 转换私钥证书(需设置密码) openssl pkcs12 -nocerts -in apiclient_cert.p12 -out apiclient_key.pem ``` #### 二、PHP核心代码实现 ```php <?php // 配置参数 $mch_id = '商户号'; $appid = '小程序APPID'; $api_key = '商户API密钥'; $cert_path = '/path/to/apiclient_cert.pem'; // 公钥证书路径 $key_path = '/path/to/apiclient_key.pem'; // 私钥证书路径 // 提现请求参数 $params = [ 'mch_appid' => $appid, 'mchid' => $mch_id, 'nonce_str' => md5(uniqid()), // 随机字符串 'partner_trade_no' => '商户订单号'.time(), // 唯一订单号 'openid' => '用户openid', 'check_name' => 'NO_CHECK', // 不校验真实姓名 'amount' => 100, // 金额(分) 'desc' => '提现描述', 'spbill_create_ip' => $_SERVER['REMOTE_ADDR'] // 服务器IP ]; // 生成签名 $params['sign'] = generate_sign($params, $api_key); // 发送企业付款请求 $url = 'https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers'; $xml = array_to_xml($params); $response = curl_post_ssl($url, $xml, $cert_path, $key_path); // 解析响应 $result = xml_to_array($response); if($result['result_code'] == 'SUCCESS') { // 提现成功处理 } else { // 错误处理: $result['err_code_des'] } /** 生成HMAC-SHA256签名 */ function generate_sign($params, $key) { ksort($params); $string = urldecode(http_build_query($params)) . "&key=$key"; return strtoupper(hash_hmac('sha256', $string, $key)); } /** 带证书的CURL请求 */ function curl_post_ssl($url, $xml, $cert_path, $key_path) { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $xml); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 1); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2); curl_setopt($ch, CURLOPT_SSLCERT, $cert_path); curl_setopt($ch, CURLOPT_SSLKEY, $key_path); $response = curl_exec($ch); if(curl_errno($ch)) throw new Exception(curl_error($ch)); curl_close($ch); return $response; } /** XML转换工具函数 */ function array_to_xml($arr) { /* 实现略 */ } function xml_to_array($xml) { /* 实现略 */ } ?> ``` #### 三、关键注意事项 1. **证书安全** - PEM证书必须存储在Web目录不可访问的位置 - 建议设置证书文件权限为`600` 2. **接口限制** - 单用户单日付款上限:$20000$元 - 单笔金额范围:$1$元 ~ $20000$元 - 频率限制:$100$次/分钟(需商户号特殊申请) 3. **错误处理** 需重点监控的错误码: - `NO_AUTH`:商户号无API权限 - `AMOUNT_LIMIT`:超出金额限制 - `SYSTEMERROR`:系统错误(需重试机制) > **重要提示**:企业付款需开通商户号「余额付款」功能,且账户余额充足[^1]。 #### 四、安全增强建议 1. **提现风控** - 二次验证(短信/生物识别) - 单日限额设置(如:$1000$元/天) 2. **异步处理** 使用队列处理提现请求,避免HTTP超时 3. **资金流水** 记录完整资金流水日志,保留$180$天以上
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值