VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > PHP >
  • php微信jsapi支付 支付宝支付 两码合一

产品开会提出了这样的需求:一个二维码可以微信支付也可以支付宝支付

经过自己的钻研以及询问技术高人(本人代码一般般)和网上搜索 最终实现其功能  我用微信jsapi 和 支付宝网页支付

其实并不怎么难:

  1.微信jsapi支付流程(微信官方文档:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=11_1)

  2.支付宝支付流程

好了废话不多说 开始开发 代码上(Tp5开发)

 

首先 需要生成一个二维码这个想必大家都会吧!!! phpqrcode(下载地址:https://sourceforge.net/projects/phpqrcode/ )

复制代码
 1         require_once ROOT_PATH.'/phpqrcode/phpqrcode.php';
 2             $value='http://'.$_SERVER['HTTP_HOST'].'/admin.php/pay/wx_zfb; //二维码链接   (这个是重中之重!!!)
 3             $errorCorrectionLevel = 'H';//容错级别
 4             $matrixPointSize = 6;//生成图片大小
 5             //生成二维码图片
 6             QRcode::png($value, 'code/1.png', $errorCorrectionLevel, $matrixPointSize, 2);
 7             $logo = 'code/kunchuan.png';//准备好的logo图片
 8             $QR = 'code/1.png';//已经生成的原始二维码图
 9             if ($logo !== FALSE) {
10                 $QR = imagecreatefromstring(file_get_contents($QR));
11                 $logo = imagecreatefromstring(file_get_contents($logo));
12                 /* $QR = imagecreatefrompng($QR);
13                 $logo = imagecreatefrompng($logo);*/
14                 if (imageistruecolor($logo))
15                 {
16                     imagetruecolortopalette($logo, false, 65535);//添加这行代码来解决颜色失真问题
17                 }
18 
19                 $QR_width = imagesx($QR);//二维码图片宽度
20                 $QR_height = imagesy($QR);//二维码图片高度
21                 $logo_width = imagesx($logo);//logo图片宽度
22                 $logo_height = imagesy($logo);//logo图片高度
23                 $logo_qr_width = $QR_width / 5;
24                 $scale = $logo_width/$logo_qr_width;
25                 $logo_qr_height = $logo_height/$scale;
26                 $from_width = ($QR_width - $logo_qr_width) / 2;
27                 //重新组合图片并调整大小
28                 imagecopyresampled($QR, $logo, $from_width, $from_width, 0, 0, $logo_qr_width,
29                     $logo_qr_height, $logo_width, $logo_height);
30             }
31 
32             $lujing =  'code/merge1'.png';
33 
34             //输出图片
35             imagepng($QR,$lujing);
36             return  '<img src="http://'.$_SERVER['HTTP_HOST'].'/'.$lujing.'" alt="使用微信或者支付宝扫描支付">';
复制代码

ok我们就生成一个二维码  因为个人隐私 我就生成了一个百度的二维码

通过扫描二维码 我们跳转到 wx_zfb方法:

复制代码
 public function wx_zfb()
    {
      //根据自己的需求  链接上边有参数就接值 没有就不做判断
        // if($this->request->isGet()) 
      // {
          //在PHP中HTTP_USER_AGENT是用来获取用户的相关信息的,包括用户使用的浏览器,操作系统等信息,
              $http_user_agent = $_SERVER['HTTP_USER_AGENT'];
              if (strpos($http_user_agent, 'MicroMessenger')) 
       {
         $url="code”;//处理微信支付的方法
                header("location:{$url}");
                exit;
            }elseif (strpos($http_user_agent, 'AlipayClient')) {
                //支付宝链接  
         $url="aliyun”;//处理微信支付的方法 
         header("location:{$url}"); exit
         
            }else{
                $this->assign('error_data','请使用微信或者支付宝扫码哦!');
                return $this->view->fetch('pay/error');
     
            }

         // }else{
         //    $this->assign('error_data','暂时没有哦');
         //     return $this->view->fetch('pay/error');
         //}
    }
复制代码

接下来精彩的代码即将上线(微信jsapi支付)

  damo下载:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=11_1

  首先我们要了解微信jsapi的开发流程

  

 

 

 好了这些你们就了解一下就可以了

复制代码
public function code()
    {
        $appid = '*******';//微信的appid
        $appKey = '******';//APPSECRET:公众帐号secert(仅JSAPI支付的时候需要配置, 登录公众平台,进入开发者中心可设置), 请妥善保管, 避免密钥泄露获取地址:https://mp.weixin.qq.com/advanced/advanced?action=dev&t=advanced/dev&token=2005451881&lang=zh_CN
        $mchid='*******';//商户平台的id
        $apiKey='*******';//KEY:商户支付密钥,参考开户邮件设置(必须配置,登录商户平台自行设置), 请妥善保管, 避免密钥泄露设置地址:https://pay.weixin.qq.com/index.php/account/api_cert
        $wxPay = new WxpayService($mchid,$appid,$appKey,$apiKey);
        $openid = $wxPay->GetOpenid();  
        if($openid){
            Session::set("openid", $openid);
        }else{
            $openid=session('openid');
        }
         //公众号中的话可以授权-获取用户信息
        // $wxPays=new WxPayUser($appid,$appKey);
        // $data = $wxPays->GetOpenid();   
        // $user = $WxPayUser->getUserInfo($data['openid'],$data['access_token']);
    $this->assign('openid',$openid);        
    $this->assign('ip_user',$ip_user);        
    return $this->view->fetch();

}
复制代码
WxpayService.php
 View Code

code.html

复制代码
<html>

<head>
    <meta charset="utf-8" />
    <meta name="viewport"  content="width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=1, user-scalable=no">
    <title>微信支付</title>
    <style>
* {margin:0;padding:0;}
body {font-size:12px;font-family:"Microsoft YaHei","微软雅黑",sans-serif;color:#333;background-color:#f7f7f7;width:100%;}
.clearfix:after { content: "."; display: block; font-size: 0; height: 0; clear: both; visibility: hidden; }
.clearfix { display: inline-table;}
*html .clearfix { height: 1%; }
.clearfix { display: block; }
*+html .clearfix { min-height: 1%; }
ul,li{ list-style:none;border:0; box-sizing:border-box; }
.main {margin:0 auto;width:100%;max-width:750px;min-width:320px;background-color:#f7f7f7;}
.btnpay {margin:0.8rem auto 0;width:100%;}
.btnpay span {display:block;margin:0 auto;width:6.74rem;height:0.8rem;line-height:0.8rem;background-color:#80D983;border-radius:0.1rem;color:#fff;font-size:0.34rem;letter-spacing:0.06rem;text-align:center;}

.xinxi{ margin:0 auto; width: 90%; line-height: 46px; display: flex; flex-direction: row; font-size: 0.32rem; border-bottom: #ccc solid 1px; color: #333;}
.moneychose{ margin:0 auto; width: 90%;}
.moneychose p {font-size:16px;color:#8D8D8F; line-height: 42px;}
.moneychose .list{ display: flex; }
.moneychose .list li{ width: 45%; margin-right:5%; border: #ccc solid 1px; background-color: #fff; border-radius:3px; text-align: center; padding:10px 0;}
.moneychose .list li span{ font-size: 0.32rem;display: block;}
.moneychose .list li.active{border: #e56d33 solid 1px; color:#e56d33;}
.tipbox{ margin:10px auto 0; width: 90%;}
.tipbox a{ text-decoration:none; color: #999; font-size:0.28rem;}

.tkbox .mask,.tkknowbox .mask{margin:0 auto;width:100%;height:100%;position:fixed;left:0px;top:0px;opacity:0.85;z-index:9998;background-color:rgb(0,0,0);}
.tkbox .mymodel,.tkknowbox .mytk{width:6.2rem; padding: 0.25rem 0 0.25rem 0; position:fixed;z-index:10000;display:block;border-radius:5px;background-color:#FFFFFF;}
.mymodel .inputblock{ margin:0 auto 0.3rem; width:5.6rem;}
.mymodel .inputs {width:100%;height:0.8rem;line-height:0.8rem;font-size:0.32rem;border:1px solid #CFCFCF;text-indent:0.2rem;outline:none;white-space:pre;overflow-x:scroll;}
.frminput {margin:0.3rem auto 0;display:flex;flex-direction:row;}
.frminput input {margin-left:0.3rem;width:2.4rem;height:0.8rem;line-height:0.8rem;font-size:0.30rem;padding-left:0.2rem;border:1px solid #CFCFCF; outline:none; }
.frminput .sendCodeBtn {margin-left:0.3rem;width:2rem;height:0.8rem;line-height:0.8rem;background-color:#e56d33;border-radius:5upx;color:#fff;text-align:center;font-size:0.26rem;}
.btnconfrm {margin:0.5rem auto 0;width:5rem;}
.btnconfrm span {display:block;margin:0 auto;width:100%;height:0.8rem;line-height:0.8rem;background-color:#80D983;border-radius:0.1rem;color:#fff;font-size:0.34rem;letter-spacing:0.06rem;text-align:center;}
.topcar{ width: 100%; display: flex; flex-direction: row; margin-bottom: 0.15rem;}
.topcar .cartip{ font-size: 0.32rem;width:1.1rem;height:0.6rem; line-height:0.6rem; padding-left: 0.3rem;}
.che_tit{ text-align:center; padding:20px;}
.ul_pro{ background-color:#CED3D9; text-align:center; padding:4px 2px; font-size:0.32rem;}
.ul_pro li{ float:left; width:11.11%; padding:2px;box-sizing: border-box;}
.ul_pro .li_close{  float:right; width:22.22%;}
.ul_pro .li_close span{ background-color:#ACB3BB;}
.ul_pro .li_clean{  float:right; width:22.22%;}
.ul_pro li span{ display:block; background-color:#fff; border-radius:4px;line-height:32px; padding-top:2px; }
.ul_pro li span:active{ background-color:#4DA9F2; color:#fff;}
.ul_input{ width:4.6rem; margin:0 auto; }
.ul_input li{ float:left; width:14%; padding:0.02rem;text-align:center; }
.ul_input li span{ display:block; background-color:#fff; border:1px solid #ccc; border-radius:4px; width:0.5rem; margin:0 auto; height:0.5rem; line-height:0.5rem;font-size: 0.36rem;}
.ul_keybord{ background-color:#CED3D9; text-align:center; padding:4px 2px; font-size:14px;}
.ul_keybord li{ float:left; width:10%; padding:2px;box-sizing: border-box;}
.ul_keybord .ikey20{ margin-left:5%;}
.ul_keybord .li_w{ width:11.11%; }
.ul_keybord .li_close{  float:right; width:22.22%;}
.ul_keybord .li_close span{ background-color:#ACB3BB;}
.ul_keybord .li_clean{  float:right; width:22.22%;}
.ul_keybord li span{ display:block; background-color:#fff; border-radius:4px; box-shadow: 2px 2px 2px #888888;line-height:32px; padding-top:2px;  }
.ul_keybord li span:active{ background-color:#4DA9F2; color:#fff;}

.tkknowbox .closetk{ width: 0.58rem; height: 0.58rem; position: absolute; top:-39px;right:-9px;z-index: 10001;}
.tkknowbox .closetk .icon{width: 0.58rem; height: 0.58rem;}
.tkknowbox .knowmain{ padding:5px 5% 0;  font-size: 0.28rem; color: #666; line-height:24px;}
.tkknowbox .knowmain .tit{ font-size: 0.30rem;}
</style>
    <script type="text/javascript">
        //调用微信JS api 支付
        function jsApiCall(msg) {
            WeixinJSBridge.invoke(
                'getBrandWCPayRequest',
                msg,
                function (res) {
                    WeixinJSBridge.log(res.err_msg);
                    if (res.err_msg == 'get_brand_wcpay_request:ok') {
                        window.location.href="www.baidu.com";
                        // alert('支付成功!');
                    } else if(res.err_msg=='get_brand_wcpay_request:cancel') {
                        layer.msg('支付取消');
                    }else{
                        layer.msg('支付失败');
                        // alert('支付失败:' + res.err_code + res.err_desc + res.err_msg);                        
                    }
                }
            );
        }
        function callpay(msg) {
            if (typeof WeixinJSBridge == "undefined") {
                if (document.addEventListener) {
                    document.addEventListener('WeixinJSBridgeReady', jsApiCall, false);
                } else if (document.attachEvent) {
                    document.attachEvent('WeixinJSBridgeReady', jsApiCall);
                    document.attachEvent('onWeixinJSBridgeReady', jsApiCall);
                }
            } else {
                jsApiCall(msg);
            }
        }
    </script>
</head>

<body>
    <section class="main">
        <section class="xinxi">
            <span>手机号:</span>
            <span id="phones"></span>
        </section>
        <section class="moneychose">
            <p>选择套餐</p>
            <ul class="list">
                <li class="active" data-type='1'><span>12次洗车次卡</span><span>300元</span></li>
                <li data-type='2'><span>25次洗车次卡</span><span>588元</span></li>
            </ul>
            <input type="hidden" name="openid" id='openid' value="<?php echo $openid;?>">
            <input type="hidden" name="car_num_id" id='car_num_id' value="">
        </section>
        <section class="tipbox" id="tipbox"><span>《支付须知》</span></section>
        <div class="btnpay" onclick="telypay()"><span>立即支付</span></div>
    </section>
    <!-- 弹框开始 -->
    <section class="tkbox"  >
        <section class="mask"></section>
        <section class="mymodel">
            <section class="tipinput">
                <section class="topcar">
                    <div class="cartip">车牌号:</div>
                    <div class="car_input">
                        <ul class="clearfix ul_input">
                            <li class="input_pro"><span></span></li>
                            <li class="input_pp input_zim"><span></span></li>
                            <li class="input_pp"><span></span></li>
                            <li class="input_pp"><span></span></li>
                            <li class="input_pp"><span></span></li>
                            <li class="input_pp"><span></span></li>
                            <li class="input_pp"><span></span></li>
                        </ul>
                    </div>
                </section>
                <div class="inputblock"><input id="phone" type="number" maxlength="11" autocomplete="off" class="inputs" placeholder="请输入手机号" onfocus="closePro()"   ></div>
                <section class="frminput">
                    <input type="number" id="code" class="inputcode" onfocus="closePro()" placeholder="请输入验证码" />
                    <section class="sendCodeBtn" datamark="0" id="sendCodeBtn">发送验证码</section>
                </section>
            </section>
            <section class="btnconfrm" id="btnconfrm"><span>确定</span></section>
        </section>
    </section>

    <!-- 须知弹窗 -->
    <section class="tkknowbox" style="display:none;">
        <section class="mask"></section>
        <section class="mytk">
            <section class="closetk" onclick="$('.tkknowbox').hide();" ><img src="/code/iconclose.png" alt="关闭须知弹框" class="icon" /></section>
            <section class="knowmain">
                <p><span class="tit" >1)次卡:</span><br>
                    <span style="font-weight: bold;">轿车</span>:300元套餐(内含12次洗车服务);588元套餐(内含25次洗车服务且赠送一次打蜡)<br>
                    <span style="font-weight: bold;">SUV</span>: 350元套餐(内含12次洗车服务);688元套餐(内含25次洗车服务且赠送一次打蜡)<br>
                    
                </p>
     
                <p><span class="tit" >2)次卡升级为年卡:</span><br>将剩余次卡数折合为钱数,并支付所差金额;即可升级为年卡且次卡剩余次数清空;<br></p>
                <p>3)其他问题,请联系客服热线 ********** 咨询</p>
            </section>
        </section>
    </section>
    <!-- 弹框结束 -->
    <script type="text/javascript" src="/assets/js/jquery.min.js"></script>
    <script src="/assets/js/shop.js" ></script>

    <script type="text/javascript">
        var isClick = true;
        function telypay() {
            if(!isClick){
              return false;
            }
            // 这里可以写你onclick事件需要获取传到后台的值
            var openid = $('#openid').val();
          var price;
            $(".list li").each(function(){
                 if($(this).hasClass('active')){
                   console.log($(this).attr("data-type"));
                   price = $(this).attr("data-type");
                 }
            });

            $.ajax({
                type: 'post',
                url: "/admin.php/pay/sub_pay",
                data: { 'price': price, 'openid': openid},
                dataType: 'json',
                success: function (msg) {
                    isClick = true;
                    callpay(msg);
                }
            });
        }
        $(function () {
            //隐藏弹框
            var is_user=<?php echo $is_user;?>;
            var car_num_id=<?php echo $car_num_id;?>;
            var phone=<?php echo $phone;?>;
            if(is_user - 1 == 0){
                $("#car_num_id").val(car_num_id);
                $('#phones').text(phone);
                $(".tkbox").hide();
            }


            var W = $('.mymodel').width();
            var H = $('.mymodel').height();
            var winWid = $(window).width() / 2 - W / 2;
            var winHig = $(window).height() / 2 - H / 2;
            $(".mymodel").css({ 'left': winWid, 'top': winHig });

             $(".list li").click(function(){
                 $(".list li").removeClass('active');
                 $(this).addClass('active');
                 console.log($(this).attr("data-type"));

            });

            //发送验证码
            $("#sendCodeBtn").click(function(){
                var datamark = $(this).attr('datamark');
                //console.log(datamark);
                if(datamark - 1 == 0){
                  return false;
                }
                var phone = $("#phone").val();
                if(!phone){
                    layer.msg('请填写您的手机号');
                    return false; 
                }
                var myreg = /^[1][3,4,5,6,7,8,9][0-9]{9}$/;
                if (!myreg.test(phone)) {
                    layer.msg('请填写正确的手机号');
                    return false; 
                }
                $.ajax({
                    type: 'post',
                    url: "/admin.php/pay/send_code",
                    data: { 'phone': phone},
                    dataType: 'json',
                    success: function (msg) {
                        if(msg.code < 0){
                            layer.msg(msg.msg);
                        }else if(msg.code > 0){
                            settime($("#sendCodeBtn"));
                            layer.msg('发送验证码成功');
                        }
                        return false;
                    }
                });
                //settime($("#sendCodeBtn"));

                //此处请求接口,成功后下面
                
            });
            var countdown = 60;
            function settime(obj) 
            {
                if (countdown == 0) {
                    $(obj).attr("datamark", "0");
                    $(obj).html("获取验证码");
                    countdown = 60;
                    return;
                } else {
                    $(obj).attr("datamark", "1");
                    $(obj).html(countdown + "s后重新获取");
                    countdown--;
                }
            setTimeout(function () { settime(obj) }, 1000);
           }
       
            //确定按钮点击
            $("#btnconfrm").click(function () {

                var carnum = $(".car_input").attr("data-pai");
                if(carnum == undefined){
                    layer.msg('请填写您的车牌号');
                    return false;
                }
                carnum = carnum.replace(/[\r\n]/g,"").replace(/\s*/g,"");
              //  console.log(carnum);
                if(carnum.length - 7 < 0){
                    layer.msg('请填写您的车牌号');
                    return false;
                }
                var phone = $("#phone").val();
                var code = $("#code").val();
                if(!phone){
                    layer.msg('请填写您的手机号');
                    return false; 
                }
                var myreg = /^[1][3,4,5,6,7,8,9][0-9]{9}$/;
                if (!myreg.test(phone)) {
                    layer.msg('请填写正确的手机号');
                    return false; 
                }
                if(!code){
                    layer.msg('请填写您的验证码');
                    return false; 
                }
                $('#pro').remove();
               
                $.ajax({
                    type: 'post',
                    url: "/admin.php/pay/car_num",
                    data: { 'carnum': carnum, 'phone': phone, 'code': code},
                    dataType: 'json',
                    success: function (message) {

                        msgs=JSON.parse(message);
                        if(msgs.status=='0'){
                            layer.msg(msgs.msg);
                            return false;
                        }else{
                            $("#car_num_id").val(msgs.id);
                            $('#phones').text(msgs.phone);
                            $(".tkbox").hide();
                            layer.msg('提交成功');
                            // console.log(msg.id +"手机号"+"验证码"+msg.phone);
                            return true;
                        }
                        
                    }
                });

                 //console.log(carnum +"手机号"+phone+"验证码"+code);
                return false;
                
            });


            $("#tipbox").click(function(){
                $(".tkknowbox").show();
                var W1 = $('.mytk').width();
                var H1 = $('.mytk').height();
                var winWid1 = $(window).width() / 2 - W1 / 2;
                var winHig1 = $(window).height() / 2 - H1 / 2;
                $(".mytk").css({ 'left': winWid1, 'top': winHig1 });
            });
            
        });


        (function (doc, win) {
            var docEl = doc.documentElement,
                resizeEvt = 'orientationchange' in window ? 'orientationchange' : 'resize',
                recalc = function () {
                    var clientWidth = docEl.clientWidth;
                    if (!clientWidth) return;
                    if (clientWidth >= 750) {
                        docEl.style.fontSize = '100px';
                    } else {
                        docEl.style.fontSize = 100 * (clientWidth / 750) + 'px';
                    }
                };
            if (!doc.addEventListener) return;
            win.addEventListener(resizeEvt, recalc, false);
            doc.addEventListener('DOMContentLoaded', recalc, false);
        })(document, window);
    </script>
</body>
</html>
复制代码

 

(个人的需求 你们可以删除手机短信的验证 send_code 和car_num 的入库)

 

你们只用sub_pay方法

复制代码
 public function sub_pay()
    {
        $openid=$this->request->post('openid'); 
        $price=$this->request->post('price');
        $price=0.01;//测试金额
        // $outTradeNo = uniqid();     //你自己的商品订单号
        //今日日期+时间戳后五位+毫秒从第三位到第八位+
        $outTradeNo = date('Ymd').substr(time(), -5) . substr(microtime(), 2, 5) . sprintf('%02d', rand(1000, 9999));
        $orderName = '支付测试';    //订单标题
        $notifyUrl = 'http://'.$_SERVER['HTTP_HOST'].'/admin.php/Pay/callback';     //付款成功后的回调地址(不要有问号)
        $payTime = time();      //提交时间
        $order_price=$price*100; //测试
        $sql="INSERT INTO order(`pay_type`,`order_status`,`order_num`,`shop_id`,`pay_status`,`order_price`,`create_time`) VALUES('2','0','$outTradeNo','$ip_user','0','$order_price','$payTime')";
        Db::execute($sql);
        //处理一下数据
     $conf = $this->payconfig($orderName,$openid,$outTradeNo,$order_price,$orderName,$notifyUrl);
    
        $jsApiObj["appId"] =$conf['appid'];
        $timeStamp = time();
        $jsApiObj["timeStamp"] = "$timeStamp";
        $jsApiObj["nonceStr"] = $this->createNoncestr();
        $jsApiObj["package"] ="prepay_id=".$conf['prepay_id'];
        $jsApiObj["signType"] = "MD5";
        $jsApiObj["paySign"] = $this->MakeSign($jsApiObj,'KunLunqifuWangRUIHua162588080619');
        echo json_encode($jsApiObj);
    }
复制代码
payconfig方法
复制代码
#微信JS支付参数获取-注意下面是支付方法可以不需要管!!!#
    protected function payconfig($title,$openid,$no, $fee, $body,$notifyUrl)
    {
        $config = array(
            'mch_id' => '********',
            'appid' => '*******',
            'key' => '**************',
        );
        $url = "https://api.mch.weixin.qq.com/pay/unifiedorder";
        $data['appid'] =$config['appid'];
        $data['mch_id'] =$config['mch_id'];         //商户号
        $data['device_info'] ='WEB';
        $data['body'] = $body;
        $data['out_trade_no'] =$no;             //订单号
        $data['total_fee'] = $fee;              //金额
        $data['spbill_create_ip'] = $_SERVER["REMOTE_ADDR"];
        $data['notify_url'] =$notifyUrl;
        $data['trade_type'] = 'JSAPI';
        $data['openid'] = $openid;   //获取openid
        $data['nonce_str'] = $this->createNoncestr();
        $data['sign'] = $this->MakeSign($data,$config['key']);



        //print_r($data);
        $xml = $this->ToXml($data);
        $curl = curl_init(); // 启动一个CURL会话
        curl_setopt($curl, CURLOPT_URL, $url); // 要访问的地址
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
        curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);
        //设置header
       // curl_setopt($curl, CURLOPT_HEADER, FALSE);
        //要求结果为字符串且输出到屏幕上
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE);
        curl_setopt($curl, CURLOPT_POST, TRUE);       //发送一个常规的Post请求
        curl_setopt($curl, CURLOPT_POSTFIELDS, $xml); // Post提交的数据包
        curl_setopt($curl, CURLOPT_TIMEOUT, 30);      // 设置超时限制防止死循环
        $tmpInfo = curl_exec($curl); // 执行操作
        curl_close($curl); //关闭CURL会话
        $arr = $this->FromXml($tmpInfo);
        return $arr;
    }
复制代码

 

/**
     * 异步回调通知
     * 说明:需要在支付文件中(如native.php或者jsapi.php)的填写回调地址。例如:http://www.xxx.com/wx/notify.php
     * 付款成功后,微信服务器会将付款结果通知到该页面 我的是 callback方法
     */

 

复制代码
 public function callback()
    {

        $xml = file_get_contents("php://input");
        $log = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true);
        $log_1=json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA));
        file_put_contents('1.txt',$log_1,FILE_APPEND);//只有返回参数写进文件中才可以打印 切记切记切记
      3.1根据返回的信息在生成签名防止数据泄漏导致出现“假通知”,造成资金损失。
     $apiKey="*******";
        $newSign = $this->verifySign($log,$apiKey);
     //判断数据库金额和支付金额是否一致 判断签名是否一致 
     if (($yorder_data['order_price']) == (int)$trade['total_fee']&& $newSign == $trade["sign"] ) //
            {
        直接写你的操作数据库逻辑就ok了

     }
     //必须加这个!!!
     $str='<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>';  
        echo $str;
}
  /* $log=array (
              'appid' => 'wx3c3f93ddce1e7845',
              'bank_type' => 'OTHERS',
              'cash_fee' => '1',
              'device_info' => 'WEB',
              'fee_type' => 'CNY',
              'is_subscribe' => 'Y',
              'mch_id' => '1602777325',
              'nonce_str' => 'oz5dzyotw0qyz2a8x2elenbki268cyt5',
              'openid' => 'os2J15vmqW1KXHLZAL4IwBtP7hL8',
              'out_trade_no' => '2021070824865563665180',
              'result_code' => 'SUCCESS',
              'return_code' => 'SUCCESS',
              'sign' => '02B66C17D8A31D0F943448979357DDEB',
              'time_end' => '20210708141109',
              'total_fee' => '1',
              'trade_type' => 'JSAPI',
              'transaction_id' => '4200001181202107085997485076',
          );*/
复制代码

相关的方法

复制代码
  /**
     *    作用:产生随机字符串,不长于32位
     */
    public 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;
    }

    /**
     *    作用:产生随机字符串,不长于32位
     */
    public function randomkeys($length)
    {
        $pattern = '1234567890123456789012345678905678901234';
        $key = null;
        for ($i = 0; $i < $length; $i++) {
            $key .= $pattern{mt_rand(0, 30)};    //生成php随机数
        }
        return $key;
    }
    /**
     * 将xml转为array
     * @param string $xml
     * @throws WxPayException
     */
    public function FromXml($xml)
    {
        //将XML转为array
        return json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)),true);
    }
    /**
     * 输出xml字符
     * @throws WxPayException
     **/
    public function ToXml($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;
    }
    /**
     * 生成签名
     * @return 签名,本函数不覆盖sign成员变量,如要设置签名需要调用SetSign方法赋值
     */
    protected function MakeSign($arr,$key)
    {
        ksort($arr);
        $string = $this->ToUrlParams($arr);
        //签名步骤二:在string后加入KEY
        $string = $string."&key=$key"; //key秘钥
        //签名步骤三:MD5加密
        $string = md5($string);
        //签名步骤四:所有字符转为大写
        $result = strtoupper($string);
        return $result;
    }
    /**
     * 格式化参数格式化成url参数
     */
    protected function ToUrlParams($arr)
    {
        $buff = "";
        foreach ($arr as $k => $v){
            if ($k != "sign" && $v != "" && !is_array($v)) {
                $buff .= $k . "=" . $v . "&";
            }
        }
        $buff = trim($buff, "&");
        return $buff;
    }
    // 判断返回的签名和根据数据生成的数据判断是否相同,防止数据泄漏导致出现“假通知”,造成资金损失。
    function verifySign($params, $apikey)
    {
        ksort($params);
        $string = "";
        foreach ($params as $k => $v) {

            if ($k != "sign" && $v != "" && !is_array($v)) {
                $string .= $k . "=" . $v . "&";
            }
        }
        $string = $string . "key=" . $apikey;
        $string = md5($string);
        $result = strtoupper($string);
        return $result;
    }
复制代码

到这里 微信jsapi就结束了   下一篇讲支付宝的流程以及代码操作

 

出处:https://www.cnblogs.com/yx520zhao/p/15005539.html


相关教程