封装微信公众平台发送普通红包,裂变红包,提现到零钱功能类
-
发送普通红包,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;
}
}
}