封裝微信公衆平臺發送普通紅包,裂變紅包,提現到零錢功能類
-
發送普通紅包,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;
}
}
}