phperlinxinlan

PHP实现微信企业付款

一、封装微信企业付款类WeiXinPayToUser,如下图代码所示:

class WeixinPayToUser
{
    /**
     * API 参数
     * @var array
     * \'mch_appid\'         # 公众号APPID
     * \'mchid\'             # 商户号
     * \'device_info\'       # 设备号
     * \'nonce_str\'         # 随机字符串
     * \'partner_trade_no\'  # 商户订单号
     * \'openid\'            # 收款用户openid
     * \'check_name\'        # 校验用户姓名选项 针对实名认证的用户
     * \'re_user_name\'      # 收款用户姓名
     * \'amount\'            # 付款金额
     * \'desc\'              # 企业付款描述信息
     * \'spbill_create_ip\'  # Ip地址
     * \'sign\'              # 签名
     */
    public $parameters = [];
    public $SSLROOTCA_PATH=\'\';
    public $SSLCERT_PATH=\'\';
    public $SSLKEY_PATH=\'\';
    public $appid=\'\';
    public $secret=\'\';
    public $mchid=\'\';
    public $key=\'\';//商户密钥

    public function __construct()
    {

        $this->url = \'https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers\';
        $this->curl_timeout = 10;
        $this->SSLROOTCA_PATH=dirname(__FILE__).\'/weixin/cert/rootca.pem\';
        $this->SSLCERT_PATH=dirname(__FILE__).\'/weixin/cert/apiclient_cert.pem\';
        $this->SSLKEY_PATH=dirname(__FILE__).\'/weixin/cert/apiclient_key.pem\';
    }

    public function setParameter($key,$value){
        $this->parameters[$key]=$value;
    }

    function arrayToXml($arr,$dom=0,$item=0){
        if (!$dom){
            $dom = new DOMDocument("1.0");
        }
        if(!$item){
            $item = $dom->createElement("xml");
            $dom->appendChild($item);
        }
        foreach ($arr as $key=>$val){
            $itemx = $dom->createElement(is_string($key)?$key:"item");
            $item->appendChild($itemx);
            if (!is_array($val)){
                $text = $dom->createTextNode($val);
                $itemx->appendChild($text);

            }else {
                $this->arrayToXml($val,$dom,$itemx);
            }
        }
        $dom->encoding = \'UTF-8\'; // insert proper
        return $dom->saveXML();
    }

    public function getSign($paramArr){//print_r($paramArr);
        ksort($paramArr);
        $paramStr = http_build_query($paramArr);
        $paramStr=urldecode($paramStr);
        $param_temp=$paramStr.\'&key=\'.$this->key;//echo $param_temp.\'<br>\';
        $signValue=strtoupper(md5($param_temp));//echo $signValue.\'<br>\';
        return $signValue;

    }

    /**
     * 生成请求xml数据
     * @return string
     */
    public function createXml()
    {
        $this->parameters[\'mch_appid\'] = $this->appid;
        $this->parameters[\'mchid\']     = $this->mchid;
       // $this->parameters[\'nonce_str\'] = md5(time());
        $this->parameters[\'nonce_str\'] = \'dddfff\';
        $this->parameters[\'sign\']      = $this->getSign($this->parameters);
        $a= $this->arrayToXml($this->parameters);
        //echo $a;
        return $a;
    }

    public function pay(){
        $xml=$this->createXml();
        $url=$this->url;
        return $this->postXmlSSLCurl($xml,$url,$second=30);
    }

    /**
     *     作用:使用证书,以post方式提交xml到对应的接口url
     */
    function postXmlSSLCurl($xml,$url,$second=30)
    {

        $ch = curl_init();
        //超时时间
        curl_setopt($ch,CURLOPT_TIMEOUT,$second);
        //这里设置代理,如果有的话
        //curl_setopt($ch,CURLOPT_PROXY, \'8.8.8.8\');
        //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);
        //设置header
        curl_setopt($ch,CURLOPT_HEADER,FALSE);
        //要求结果为字符串且输出到屏幕上
        curl_setopt($ch,CURLOPT_RETURNTRANSFER,TRUE);
        //设置证书
        //curl_setopt($ch,CURLOPT_CAINFO, $this->SSLROOTCA_PATH);
        //使用证书:cert 与 key 分别属于两个.pem文件
        //默认格式为PEM,可以注释
        curl_setopt($ch,CURLOPT_SSLCERTTYPE,\'PEM\');
        curl_setopt($ch,CURLOPT_SSLCERT, $this->SSLCERT_PATH);
        //默认格式为PEM,可以注释
        curl_setopt($ch,CURLOPT_SSLKEYTYPE,\'PEM\');
        curl_setopt($ch,CURLOPT_SSLKEY, $this->SSLKEY_PATH);

        //post提交方式
        curl_setopt($ch,CURLOPT_POST, true);
        curl_setopt($ch,CURLOPT_POSTFIELDS,$xml);
        $data = curl_exec($ch);
        //返回结果
        if($data){
            curl_close($ch);
            return $data;
        }
        else {
            $error = curl_errno($ch);
            echo "curl出错,错误码:$error"."<br>";
            echo "<a href=\'http://curl.haxx.se/libcurl/c/libcurl-errors.html\'>错误原因查询</a></br>";
            curl_close($ch);
            return false;
        }
    }


}
?>

二、调用WeiXinPayToUser,如下图所示:

 /**
     * 企业付款测试
     */
    public function payToUser()
    {

$mchPay = new WeiXinPayToUser(); // 用户openid $mchPay->setParameter(\'openid\', \'oy2lbszskklaslEKThrzqEziKEBzqU\'); // 商户订单号 $mchPay->setParameter(\'partner_trade_no\', \'test-\'.time()); // 校验用户姓名选项 $mchPay->setParameter(\'check_name\', \'NO_CHECK\'); // 企业付款金额 单位为分 $mchPay->setParameter(\'amount\', 100); // 企业付款描述信息 $mchPay->setParameter(\'desc\', \'开发测试\'); // 调用接口的机器IP地址 自定义 $mchPay->setParameter(\'spbill_create_ip\', \'127.0.0.1\'); # getClientIp() // 收款用户姓名 // $mchPay->setParameter(\'re_user_name\', \'Max wen\'); // 设备信息 // $mchPay->setParameter(\'device_info\', \'dev_server\'); $response = $mchPay->postXmlSSL(); if( !empty($response) ) { $data = simplexml_load_string($response, null, LIBXML_NOCDATA); echo json_encode($data); }else{ echo json_encode( array(\'return_code\' => \'FAIL\', \'return_msg\' => \'transfers_接口出错\', \'return_ext\' => array()) ); } } }

 

发表于 2018-09-07 16:27  dreams7433  阅读(1812)  评论(0编辑  收藏  举报
 

分类:

技术点:

相关文章: