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