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条评论

发表评论