PHP
QQ钱包企业打款给用户
最近博主在做一个项目,需要用到QQ钱包打款的功能,所以自己包装了一些方法,在这里跟大家分享
最近博主在做一个项目,需要用到QQ钱包打款的功能,所以自己包装了一些方法,在这里跟大家分享。
我们先封装一些公告的方法,方便我们来调用,首先是签名生成方法,代码如下:
/**
* 签名算法
* @param $data
* @param $secrect
*/
function getSignContent($data, $secrect)
{
//排序
ksort($data);
//使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串
$str = '';
foreach ($data as $k => $v) {
$str .= $k . '=' . $v . '&';
}
//拼接API密钥
$str .= 'key=' . $secrect;
return md5($str);
}然后是随机字符串的生成,代码如下:
/**
* 生成随机字符
* @param int $randLength
* @param int $addtime
* @param int $includenumber
* @return string
*/
function rand_str($randLength = 6, $addtime = 1, $includenumber = 0)
{
if ($includenumber) {
$chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHJKLMNPQEST123456789';
} else {
$chars = 'abcdefghijklmnopqrstuvwxyz';
}
$len = strlen($chars);
$randStr = '';
for ($i = 0; $i < $randLength; $i++) {
$randStr .= $chars[mt_rand(0, $len - 1)];
}
$tokenvalue = $randStr;
if ($addtime) {
$tokenvalue = $randStr . time();
}
return $tokenvalue;
}然后便是XML转数组跟数组转XML方法,代码如下:
/**
* 数组转成成XML
* @param $data
* @return string
*/
function arrayToXml($data)
{
$str = '';
foreach ($data as $k => $v) {
$str .= '<' . $k . '>' . $v . '';
}
$str .= '';
return $str;
}
/**
* XML转换成数组
* @param $xml
* @return mixed
*/
function xmlToArray($xml)
{
//禁止引用外部xml实体
libxml_disable_entity_loader(true);
$xmlstring = simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA);
$val = json_decode(json_encode($xmlstring), true);
return $val;
}然后便是curl带证书POST请求方法,我们需要将证书放在正确的路径下,代码如下:
/**
* 证书调用
* @param $url
* @param $vars
* @param int $second
* @param array $aHeader
* @return bool|mixed
*/
function curl_post_ssl($url, $vars, $second = 30, $aHeader = array())
{
$isdir = "cert/";//证书位置
$ch = curl_init();//初始化curl
curl_setopt($ch, CURLOPT_TIMEOUT, $second);//设置执行最长秒数
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);//要求结果为字符串且输出到屏幕上
curl_setopt($ch, CURLOPT_URL, $url);//抓取指定网页
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);// 终止从服务端进行验证
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);//
curl_setopt($ch, CURLOPT_SSLCERTTYPE, 'PEM');//证书类型
curl_setopt($ch, CURLOPT_SSLCERT, $isdir . 'apiclient_cert.pem');//证书位置
curl_setopt($ch, CURLOPT_SSLKEYTYPE, 'PEM');//CURLOPT_SSLKEY中规定的私钥的加密类型
curl_setopt($ch, CURLOPT_SSLKEY, $isdir . 'apiclient_key.pem');//证书位置
curl_setopt($ch, CURLOPT_CAINFO, 'PEM');
curl_setopt($ch, CURLOPT_CAINFO, $isdir . 'rootca.pem');
if (count($aHeader) >= 1) {
curl_setopt($ch, CURLOPT_HTTPHEADER, $aHeader);//设置头部
}
curl_setopt($ch, CURLOPT_POST, 1);//post提交方式
//全部数据使用HTTP协议中的"POST"操作来发送
curl_setopt($ch, CURLOPT_POSTFIELDS, $vars);
$data = curl_exec($ch);//执行回话
if ($data) {
curl_close($ch);
return $data;
} else {
$error = curl_errno($ch);
echo "call faild, errorCode:$error\n";
curl_close($ch);
return false;
}
}完成以上所有基本方法封装后,我们便开始我们主程序的调用,代码如下:
#调取地址
$tarGetUrl = "https://api.qpay.qq.com/cgi-bin/epay/qpay_epay_b2c.cgi";
#获取基本数据
$out_trade_no = date('YmHis', time()) . rand(1,100000); //订单号
$total_fee = 1; //打款金额(分单位)
#组合获取sign
$params = array(
'input_charset' => 'UTF-8',
'appid' => QQ钱包商户号,
'uin' => 收钱用户QQ,
'mch_id' => QQ钱包商户号,
'nonce_str' => uniqid(),
'out_trade_no' => $out_trade_no,
'total_fee' => $total_fee,
'op_user_id' => QQ钱包商户号,
'memo' => '签到领红包',
'op_user_passwd' => md5(商户平台登录密码),
'spbill_create_ip' => getIP(),
'check_name' => 'NO_CHECK',
);
//拼接APIkey
$sign = getSignContent($params, $shhKey);
//字符串转大写
$sign = strtoupper($sign);
#再组会调用数组
$params["sign"] = $sign;
#数组转换成XML
$var = arrayToXml($params);
#调取接口
$xml = curl_post_ssl($tarGetUrl, $var, 30, array());
#XML转字符串
$dataList = xmlToArray($xml);
#判断
if (!isset($dataList["return_code"]) || !isset($dataList["retmsg"]) ||
$dataList["return_msg"] != "SUCCESS" || $dataList["retmsg"] != "ok") {
echo "打款失败";
exit();
}
#输出成功
echo "打款成功";
exit();这样我们便成功的在QQ钱包进行企业打款给用户
0条评论