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

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