Files
Epay/plugins/qqpay/inc/qpayMchUtil.class.php
2020-02-21 16:21:31 +08:00

150 lines
4.3 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?php
/**
* qpayMachAPI.php
* Created by HelloWorld
* vers: v1.0.0
* User: Tencent.com
*/
require_once (PAY_ROOT.'inc/qpayMch.config.php');
class QpayMchUtil {
/**
* 生成随机串
* @param int $length
*
* @return string
*/
public static function createNoncestr( $length = 32 ) {
$chars = "abcdefghijklmnopqrstuvwxyz0123456789";
$str ="";
for ( $i = 0; $i < $length; $i++ ){
$str.= substr($chars, mt_rand(0, strlen($chars)-1), 1);
}
return $str;
}
/**
* 将参数转为hash形式
* @param $params
* @param $urlencode
*
* @return string
*/
public static function buildQueryStr($params) {
$arrTmp = array();
foreach ($params as $k => $v){
//参数为空不参与签名
if(isset($v) && $v != '' && $k != 'sign'){
array_push($arrTmp, "$k=$v");
}
}
return implode('&', $arrTmp);
}
/**
* 获取参数签名
* @param $params
*
* @return string
*/
public static function getSign($params) {
//第一步对参数按照key=value的格式并按照参数名ASCII字典序排序
ksort($params);
$stringA = QpayMchUtil::buildQueryStr($params);
//第二步拼接API密钥并md5
$stringA = $stringA."&key=".QpayMchConf::MCH_KEY;
$stringA = md5($stringA);
//转成大写
$sign = strtoupper($stringA);
return $sign;
}
/**
* 数组转换成xml字符串
* @param $arr
* @return string
*/
public static function arrayToXml($arr) {
$xml = "<xml>";
foreach ($arr as $key => $val){
if (is_numeric($val)){
$xml.="<$key>$val</$key>";
}
else
$xml.="<$key><![CDATA[$val]]></$key>";
}
$xml.="</xml>";
return $xml;
}
/**
* xml转换成数组
* @param $xml
* @return array|mixed|object
*/
public static function xmlToArray($xml) {
$arr = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true);
return $arr;
}
/**
* 通用curl 请求接口。post方式
* @param $params
* @param $url
* @param int $timeout
*
* @return bool|mixed
*/
public static function reqByCurlNormalPost($params, $url, $timeout = 10) {
return QpayMchUtil::_reqByCurl($params, $url, $timeout, false);
}
/**
* 使用ssl证书请求接口。post方式
* @param $params
* @param $url
* @param int $timeout
*
* @return bool|mixed
*/
public static function reqByCurlSSLPost($params, $url, $timeout = 10) {
return QpayMchUtil::_reqByCurl($params, $url, $timeout, true);
}
private static function _reqByCurl($params, $url, $timeout = 10, $needSSL = false) {
$ch = curl_init();
curl_setopt($ch,CURLOPT_URL, $url);
curl_setopt($ch,CURLOPT_TIMEOUT, $timeout);
curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,FALSE);
curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,FALSE);
curl_setopt($ch,CURLOPT_HEADER,FALSE);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,TRUE);
//是否使用ssl证书
if(isset($needSSL) && $needSSL != false){
curl_setopt($ch,CURLOPT_SSLCERTTYPE,'PEM');
curl_setopt($ch,CURLOPT_SSLCERT, QpayMchConf::SSLCERT_PATH);
curl_setopt($ch,CURLOPT_SSLKEYTYPE,'PEM');
curl_setopt($ch,CURLOPT_SSLKEY, QpayMchConf::SSLKEY_PATH);
}
curl_setopt($ch,CURLOPT_POST, true);
curl_setopt($ch,CURLOPT_POSTFIELDS, $params);
$ret = curl_exec($ch);
if($ret){
curl_close($ch);
//log($ret); //业务记录交互流水。注:流水日志影响性能,如请求量过大,请慎重设计日志。
return $ret;
}
else {
$error = curl_errno($ch);
//log($error); //业务记录错误日志
print_r($error);
curl_close($ch);
return false;
}
}
}