微信企业付款到零钱

本文介绍如何使用微信支付的企业打款接口实现自动转账功能,包括必要的参数设置、签名生成、XML数据构造及SSL安全通信等内容。

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

 
//企业提现
    public function actionIndex()
    {
        if (\Yii::$app->request->isPost){
            $data = array(
                'mch_appid' =>'',//小程序appid
                'mchid' => '',//微信支付商户号
                'nonce_str' => $this->getNonceStr(), //随机字符串
                'partner_trade_no' => "1552283579517745", //商户订单号,需要唯一
                'openid' => '',用户openid
                'check_name' => 'NO_CHECK', //OPTION_CHECK不强制校验真实姓名, FORCE_CHECK:强制 NO_CHECK:
                'amount' => 1 * 100, //付款金额单位为分 最少金额必须为1元
                'desc' => "提现测试",
                'spbill_create_ip' => "",服务器ip
                //'re_user_name' => 'jorsh', //收款人用户姓名 *选填
                //'device_info' => '1000',  //设备号 *选填
            );
            $key  = ""; 商户后台生成key
            //生成签名
            $data['sign']=$this->getSign($data,$key);
            //构造XML数据(数据包要以xml格式进行发送)
            $xmldata = $this->arrToXml($data);
            //请求url
            $url = 'https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers';
            //发送post请求
            $res = $this->curl_post_ssl($url,$xmldata);
            $result = $this->xmlToArray($res);
            print_r($result);die;
            return $res;
        }else{
            return $this->isPost();
        }
    }
    /**
     * 随机字符串
     * @param int $length
     * @return string
     */
    private function getNonceStr($length = 32)
    {
        $chars = "abcdefghijklmnopqrstuvwxyz0123456789";
        $str = "";
        for ($i = 0; $i < $length; $i++) {
            $str .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);
        }
        return $str;
    }

    /**
     * 签名
     * @param $data
     * @return string
     */
    private function getSign($obj,$key){
        //生成签名
        foreach ($obj as $k=>$v){
            $copyParameters[$k]=$v;
        }
        //步骤一:按字典排序参数
        $string=$this->formatBizQueryParaMap($copyParameters,false);
        //步骤二:在string后面加key
        $string.='key='.$key;
        //步骤三:md5加密
        $string=md5($string);
        //步骤四:转大小写
        return strtoupper($string);
    }
    private function formatBizQueryParaMap($paraMap,$urlencode){
        //格式化参数
        $buff="";
        ksort($paraMap);
        foreach ($paraMap as $k=>$v){
            if($urlencode){
                $v=urlencode($v);
            }
            $buff.=$k.'='.$v.'&';
        }
        return $buff;
    }

    /**
     * 数组转XML
     * @param $data
     * @return string
     */
    private function arrToXml($data)
    {
        $xml = "<xml>";
        //  遍历组合
        foreach ($data as $k=>$v){
            $xml.='<'.$k.'>'.$v.'</'.$k.'>';
        }
        $xml .= '</xml>';
        return $xml;
    }

    /**
     * [curl_post_ssl 发送curl_post数据]
     * @param  [type]  $url     [发送地址]
     * @param  [type]  $param  [发送文件格式]
     * @return [type]           [description]
     */
    public function curl_post_ssl($url, $xmldata,  $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);

        //默认格式为PEM,可以注释
        curl_setopt($ch,CURLOPT_SSLCERTTYPE,'PEM');
//绝对地址可使用 dirname(__DIR__)打印,如果不是绝对地址会报 58 错误
        curl_setopt($ch,CURLOPT_SSLCERT,'/var/www/html/carWash/cert/apiclient_cert.pem');
        curl_setopt($ch,CURLOPT_SSLKEYTYPE,'PEM');
        curl_setopt($ch,CURLOPT_SSLKEY,'/var/www/html/carWash/cert/apiclient_key.pem');
        if( count($aHeader) >= 1 ){
            curl_setopt($ch, CURLOPT_HTTPHEADER, $aHeader);
        }
        curl_setopt($ch,CURLOPT_POST, 1);
        curl_setopt($ch,CURLOPT_POSTFIELDS,$xmldata);
        $data = curl_exec($ch);
        if($data){
            curl_close($ch);
            return $data;
        }
        else {
            $error = curl_errno($ch);
            echo "call faild, errorCode:$error\n";
            die();
            curl_close($ch);
            return false;
        }
    }
    /**
     * XML转数组
     * @param string
     * return $data
     * */
    private function xmlToArray($xml)
    {
        //禁止引用外部xml实体
        libxml_disable_entity_loader(true);
        $values = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true);
        return $values;
    }

企业提现需主要注意的是:
一:必须要将商户后台的CA证书下载到本地并且传到自己服务器上 ,并且以绝对路径去访问apiclient_cert.pem apiclient_key.pem两个文件
  二: 拼接sign签名需拼接上商户key 签名生成请根据微信官方文档

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值