summerkxy

微信扫码支付

<?php
include \'phpqrcode.php\';
//生成随机字符串
function getNonceNum($numLen=16){
    $chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
    $str = "";
    for ($i = 0; $i < $numLen; $i++) {
      $str .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);
    }
    return $str;
}
//获取用户ip地址
function get_client_ip(){
    $cip = "unknown";
    if($_SERVER[\'REMOTE_ADDR\']){
        $cip = $_SERVER[\'REMOTE_ADDR\'];
    }elseif(getenv("REMOTE_ADDR")){
        $cip = getenv("REMOTE_ADDR");
    }
    return $cip;
}


$nonce_str = getNonceNum();
$out_trade_no = date("Ymd").getNonceNum(10);
$ip = get_client_ip();


$param[\'appid\']             = "###";
$param[\'mch_id\']             = "###";
$param[\'nonce_str\']         = "$nonce_str";
$param[\'body\']                 = "扫码支付";
$param[\'out_trade_no\']         = "$out_trade_no";
$param[\'total_fee\']         = 1;
$param[\'spbill_create_ip\']     = "$ip";
$param[\'notify_url\']         = "###url###";
$param[\'trade_type\']         = "NATIVE";

//排序
ksort($param);

$sign_raw = "";
foreach($param as $k => $v){
    $sign_raw .= $k."=".$v."&";
}
$sign_raw .= "key=###";


//生成签名
$sign = strtoupper(md5($sign_raw));

$xmlString = "<xml>";
foreach($param as $v => $k){
    $xmlString .="<$v>$k</$v>";
}
$xmlString .= "<sign>$sign</sign>";
$xmlString .= "</xml>";

$url = "https://api.mch.weixin.qq.com/pay/unifiedorder";

$result = postXmlCurl($xmlString,$url);

//解析xml
$xml = simplexml_load_string($result);
$bigarr = array();

//循环生成数组
foreach($xml->children() as $child){
    $key =  $child->getName();
    $bigarr["$key"] = "$child";//必须加引号
}
$tiaozhuanurl = $bigarr[\'code_url\'];

/*
生成二维码
*/
$value = "$tiaozhuanurl"; //二维码内容
$errorCorrectionLevel = \'L\';//容错级别
$matrixPointSize = 6;//生成图片大小
//生成二维码图片
QRcode::png($value, \'abc.png\', $errorCorrectionLevel, $matrixPointSize, 2);
/*
$logo = \'logo.png\';//准备好的logo图片
*/
$QR = \'abc.png\';//已经生成的原始二维码图

if ($logo !== FALSE) {
    $QR = imagecreatefromstring(file_get_contents($QR));
    $logo = imagecreatefromstring(file_get_contents($logo));
    $QR_width = imagesx($QR);//二维码图片宽度
    $QR_height = imagesy($QR);//二维码图片高度
    $logo_width = imagesx($logo);//logo图片宽度
    $logo_height = imagesy($logo);//logo图片高度
    $logo_qr_width = $QR_width / 5;
    $scale = $logo_width/$logo_qr_width;
    $logo_qr_height = $logo_height/$scale;
    $from_width = ($QR_width - $logo_qr_width) / 2;
    //重新组合图片并调整大小
    imagecopyresampled($QR, $logo, $from_width, $from_width, 0, 0, $logo_qr_width,
        $logo_qr_height, $logo_width, $logo_height);
}
//输出图片
imagepng($QR, \'abcd.png\');
echo \'<img src="abcd.png">\';



//post请求,带上xml数据,post
function postXmlCurl($xml, $url, $useCert = false, $second = 30){        
    $ch = curl_init();
    //设置超时
    curl_setopt($ch, CURLOPT_TIMEOUT, $second);
    
    
    curl_setopt($ch,CURLOPT_URL, $url);
    if(stripos($url,"https://")!==FALSE){
        curl_setopt($ch, CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSv1);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
    }else{
        curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,TRUE);
        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, "../cert/###.pem");
        curl_setopt($ch,CURLOPT_SSLKEYTYPE,\'PEM\');
        curl_setopt($ch,CURLOPT_SSLKEY, "../cert/###.pem");
        
        curl_setopt($ch, CURLOPT_CAINFO, \'../cert/##.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);
        echo "error";
    }
}

 

分类:

技术点:

相关文章:

  • 2021-10-26
  • 2021-12-09
  • 2022-12-23
  • 2021-11-17
  • 2022-12-23
  • 2021-10-01
  • 2021-10-01
  • 2021-05-12
猜你喜欢
  • 2021-10-11
  • 2021-10-01
  • 2021-11-17
相关资源
相似解决方案