PHP封裝微信發紅包類

封裝微信公衆平臺發送普通紅包,裂變紅包,提現到零錢功能類

  • 發送普通紅包,params參數爲官方文檔要求傳送的參數的鍵值對數組
    public function sendRedPack($params)

  • 發送裂變紅包
    sendGroupRedPack($params)

  • 提現到零錢
    sendUserCash($params)

<?php
/**
 * Created by PhpStorm.
 * 
 */

class WxRedPackApiClass
{
	const SEND_REDPACK_URL = 'https://api.mch.weixin.qq.com/mmpaymkttransfers/sendredpack';//發送紅包url
	const SEND_GROUP_REDPACK_URL = 'https://api.mch.weixin.qq.com/mmpaymkttransfers/sendgroupredpack';//發送裂變紅包url
	const SEND_USER_CASH_URL = 'https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers';//提現到零錢

	//發送普通紅包
	public function sendRedPack($params){
		$data = $this->arrayToXml( $params );
		if( !empty( $data ) ){
			$result = self::postXmlCurl( $data, self::SEND_REDPACK_URL, true );
			if( !empty( $result ) ){
				return self::xmlToArray( $result );
			}
		}	
		return false;
	}
	//發送裂變紅包
	public function sendGroupRedPack($params){
		$data = $this->arrayToXml( $params );
		if( !empty( $data ) ){
			$result = self::postXmlCurl( $data, self::SEND_GROUP_REDPACK_URL, true );
			if( !empty( $result ) ){
				return self::xmlToArray( $result );
			}
		}	
		return false;
	}

	//提現到零錢
    public function sendUserCash($params){
        $data = $this->arrayToXml( $params );
        if( !empty( $data ) ){
            $result = self::postXmlCurl( $data, self::SEND_USER_CASH_URL, true );
            if( !empty( $result ) ){
                return self::xmlToArray( $result );
            }
        }
        return false;
    }


	//數組轉成xml
	public function arrayToXml( $params ){
		if (empty($params)){
			return false;
		}
		$xml = '<xml>';
		foreach( $params as $key => $val ){
			$xml .= "<{$key}><![CDATA[{$val}]]></{$key}>";
		}
		$xml .= '</xml>';
		
		return $xml;	
	}

	/*
		xml 字符串轉成數組
	*/
	private static function xmlToArray($xmlstring) {
		if( substr($xmlstring, 0, 1) != '<' ){
			return false;
		}
		libxml_disable_entity_loader(true);
        $result = json_decode(json_encode(simplexml_load_string($xmlstring, 'SimpleXMLElement', LIBXML_NOCDATA)), true);
		return $result;
    } 

    /**
     * 獲取參數簽名
     * @param $params
     * @param $token 簽名祕鑰
     * @return string
     */
    public function getSign($params, $token){
        $signstr = '';
        if (is_array($params) && !empty($params)){
            ksort($params);
            foreach ($params as $key => $item) {
				if( !empty( $item ) ){
					$signstr .= $key . '=' . $item . '&';
				}
            }
        }
        $signstr .= 'key=' . $token;

        return strtoupper(md5($signstr));
    }

    /**
     * 簽名驗證
     * @param $params
     * @param $token
     * @return bool
     */
    public function checkSign($params, $token){
        $sign = $params['sign'];
        unset( $params['sign'] );

        $newsign = $this->getSign($params, $token);

        if ( $sign == $newsign ){
            return true;
        }
        return true;
    }
	/**
	 * 以post方式提交xml到對應的接口url
	 * 
	 * @param string $xml  需要post的xml數據
	 * @param string $url  url
	 * @param bool $useCert 是否需要證書,默認不需要
	 * @param int $second   url執行超時時間,默認30s
	 * @throws WxPayException
	 */
	private static function postXmlCurl($xml, $url, $useCert = false, $second = 30)
	{		
		$ch = curl_init();
		//設置超時
		curl_setopt($ch, CURLOPT_TIMEOUT, $second);
		
		//如果有配置代理這裏就設置代理
		if(WxPayConfig::CURL_PROXY_HOST != "0.0.0.0" 
			&& WxPayConfig::CURL_PROXY_PORT != 0){
			curl_setopt($ch,CURLOPT_PROXY, WxPayConfig::CURL_PROXY_HOST);
			curl_setopt($ch,CURLOPT_PROXYPORT, WxPayConfig::CURL_PROXY_PORT);
		}
		curl_setopt($ch,CURLOPT_URL, $url);
		curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,FALSE);
		curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,2);//嚴格校驗
		//設置header
		curl_setopt($ch, CURLOPT_HEADER, FALSE);
		//要求結果爲字符串且輸出到屏幕上
		curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
	
		if($useCert == true){
			//設置證書
			//使用證書:cert 與 key 分別屬於兩個.pem文件
			curl_setopt($ch,CURLOPT_SSLCERTTYPE,'PEM');
			curl_setopt($ch,CURLOPT_SSLCERT, '證書pemz在服務器中的路徑');
			curl_setopt($ch,CURLOPT_SSLKEYTYPE,'PEM');
			curl_setopt($ch,CURLOPT_SSLKEY, '證書密鑰pem在服務器中的路徑');
		}
		//post提交方式
		curl_setopt($ch, CURLOPT_POST, TRUE);
		curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);
		//運行curl
		$data = curl_exec($ch);
		//返回結果
		if($data){
			curl_close($ch);
			return $data;
		} else { 
			$error = curl_errno($ch);
			curl_close($ch);
			return $error;
		}
	}
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章