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()) ); } } }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM