• 电脑端网页 微信扫码支付和支付宝支付


    电脑端网页 微信扫码支付和支付宝支付

    注意:支付完成后的通知地址中,格式要使用a53这种的,而不是a=5&b=3这种的,否则通知不到。

    电脑端手机端的微信和支付宝支付都已掌握,贴一下代码备用 ,基于thinkphp

    微信:

    class WxpayMobile extends Action{
           //在类初始化方法中,引入相关类库    
        public function _initialize() {
            header("Content-type:text/html;charset=utf-8");
            vendor('WxPayPubHelper.SDKRuntimeException'); 
            define("APPID", C('WX_APPID'));
            define("MCHID", C('WX_MCHID'));
            define("KEY", C('WX_KEY'));
            define("APPSECRET", C('WX_APPSECRET'));
            define("JS_API_CALL_URL", C('site_url').U('Wxpay/wap_dowxpay'));
            define('SSLCERT_PATH',C('site_url').'/Framework/Extend/Vendor/WxPayPubHelper/cacert/apiclient_cert.pem');
            define('SSLKEY_PATH',C('site_url').'/Framework/Extend/Vendor/WxPayPubHelper/cacert/apiclient_key.pem');
            define('NOTIFY_URL',C('site_url').'/index.php/Wxpay/通知接口');
            define('CURL_TIMEOUT',30);
            vendor('WxPayPubHelper.WxPayPubHelper'); 
        }
        public function index() {
           echo "禁止访问";
            
        }
        public function dowxpay(){
            //使用统一支付接口
            $unifiedOrder = new UnifiedOrder_pub();
            $fee = $_POST['pay_cash']*100;
            //echo "'".$_POST['mas_id']."'";
            //设置统一支付接口参数
            //设置必填参数
            //appid已填,商户无需重复填写
            //mch_id已填,商户无需重复填写
            //noncestr已填,商户无需重复填写
            //spbill_create_ip已填,商户无需重复填写
            //sign已填,商户无需重复填写
            $unifiedOrder->setParameter("body","订单付款");//商品描述
            //自定义订单号,此处仅作举例
            $out_trade_no = $_POST['order_no'];
            $unifiedOrder->setParameter("out_trade_no",$out_trade_no);//商户订单号 
            $unifiedOrder->setParameter("total_fee",$fee);//总金额
            $unifiedOrder->setParameter("notify_url",NOTIFY_URL);//通知地址 
            $unifiedOrder->setParameter("trade_type","NATIVE");//交易类型
            //非必填参数,商户可根据实际情况选填
            //$unifiedOrder->setParameter("sub_mch_id","XXXX");//子商户号  
            //$unifiedOrder->setParameter("device_info","XXXX");//设备号 
            //$unifiedOrder->setParameter("attach","'".$_POST['mas_id']."'");//附加数据 
            //$unifiedOrder->setParameter("time_start","XXXX");//交易起始时间
            //$unifiedOrder->setParameter("time_expire","XXXX");//交易结束时间 
            //$unifiedOrder->setParameter("goods_tag","XXXX");//商品标记 
            //$unifiedOrder->setParameter("openid","XXXX");//用户标识
            //$unifiedOrder->setParameter("product_id","XXXX");//商品ID
            
            //获取统一支付接口结果
            $unifiedOrderResult = $unifiedOrder->getResult();
            
            //print_r($unifiedOrderResult);
            //商户根据实际情况设置相应的处理流程
            if ($unifiedOrderResult["return_code"] == "FAIL") 
            {
                //商户自行增加处理流程
            //    echo "通信出错:".$unifiedOrderResult['return_msg']."<br>";
            }
            elseif($unifiedOrderResult["result_code"] == "FAIL")
            {
                //商户自行增加处理流程
            //    echo "错误代码:".$unifiedOrderResult['err_code']."<br>";
                //echo "错误代码描述:".$unifiedOrderResult['err_code_des']."<br>";
            }
            elseif($unifiedOrderResult["code_url"] != NULL)
            {
                //从统一支付接口获取到code_url
                $code_url = $unifiedOrderResult["code_url"];
                //商户自行增加处理流程
                //......
            }
            $this->assign('code_url',$code_url);
            $this->assign('out_trade_no',$out_trade_no);
            $this->display();
         }
         
        //支付界面
        public function pay_online(){
            //获取会员信息
            if(!isset($_SESSION['open_id'])){
                get_code();
            }
            $Apply = D('ApplyView');
            $where = array(
                'id'=>$_GET['out_trade_no'],
                );
            $my_order=$Apply->where($where)->find();
            //$my_order = $Apply->where($where)->find();
            if(empty($my_order)){
               $this->error('该订单不存在!',U('User/index'));
            }elseif($my_order['pay_state']==1){
               $this->error('该订单已经支付过!',U('User/index'));
            }else{
                header("Content-type:text/html;charset=utf-8");
                //获取店铺微信支付数据
                define("APPID", C('WX_APPID'));
                define("MCHID", C('WX_MCHID'));
                define("KEY", C('WX_KEY'));
                define("APPSECRET", C('WX_APPSECRET'));
                 define('NOTIFY_URL','http://'.$_SERVER['HTTP_HOST'].'/index.php/Wxpay/notifyurl');
                define('CURL_TIMEOUT',30);
                vendor('WxPayPubHelper.WxPayPubHelper'); 
                vendor('WxPayPubHelper.SDKRuntimeException');
                $out_trade_no = $my_order['id'];   //订单号
            
                
                
                $fee = $my_order['cost'];            //应付金额
                //使用jsapi接口
                $jsApi = new JsApi_pub();
                //=========步骤1:网页授权获取用户openid============
                //通过code获得openid
                $openid = $_SESSION['open_id'];
                //=========步骤2:使用统一支付接口,获取prepay_id============
                //使用统一支付接口
                $unifiedOrder = new UnifiedOrder_pub();
                /* 2015年10月12日 18:27:53 用户子商户付款 ↓*/
                //$Shop = M('Shop'); 
                //$shop = $Shop->where('shopid = '.$my_order['shopid'])->find();
                //$unifiedOrder->setParameter("sub_appid",$shop['wx_appid']);//子商户号码
                // echo $shop['wx_appid'];
                
             //    $unifiedOrder->setParameter("sub_mch_id",MCHID);//子商户号码
                /* 2015年10月12日 18:27:53 用户子商户付款 ↑*/
                //dump($openid);dump($out_trade_no);dump(NOTIFY_URL);
                $unifiedOrder->setParameter("openid","$openid");//商品描述
                $unifiedOrder->setParameter("body","报名付款");//商品描述
                //自定义订单号,此处仅作举例
                $unifiedOrder->setParameter("out_trade_no",$out_trade_no);//商户订单号 
                $unifiedOrder->setParameter("total_fee",$fee*100);//总金额
                $unifiedOrder->setParameter("notify_url",NOTIFY_URL);//通知地址 
                $unifiedOrder->setParameter("trade_type","JSAPI");//交易类型
                $prepay_id = $unifiedOrder->getPrepayId();
                
                if($prepay_id==null){
                    $this->error('发起支付失败,请联系管理员!',U('User/index'));
                }
                
                //=========步骤3:使用jsapi调起支付============
                $jsApi->setPrepayId($prepay_id);
                $jsApiParameters = $jsApi->getParameters();
                $this->assign('jsApiParameters',$jsApiParameters);
                $this->assign('my_order',$my_order);
                
                $this->assign('share_ok_url',U('User/index'));
                $this->assign('title',"微信支付");
                $this->display();
            }
            
        }
         
         
         
        public function wap_dowxpay(){
            if($_POST['order_no']){
                $_SESSION['order_no'] = $_POST['order_no'];
            }
            if($_POST['pay_cash']){
                $_SESSION['pay_cash'] = $_POST['pay_cash'];
            }
            if($_SESSION['order_no']){
                $out_trade_no = $_SESSION['order_no'];
            }        
            if($_SESSION['pay_cash']){
                $fee = $_SESSION['pay_cash'];
            }        
            
            //使用jsapi接口
            $jsApi = new JsApi_pub();
            
            //=========步骤1:网页授权获取用户openid============
            //通过code获得openid
            if (!isset($_GET['code']))
            {
                //触发微信返回code码
                $url = $jsApi->createOauthUrlForCode(JS_API_CALL_URL);
                Header("Location: $url"); 
            }else
            {
                //获取code码,以获取openid
                $code = $_GET['code'];
                $jsApi->setCode($code);
                $openid = $jsApi->getOpenId();
            }
            
            //=========步骤2:使用统一支付接口,获取prepay_id============
            //使用统一支付接口
            $unifiedOrder = new UnifiedOrder_pub();
            
            //设置统一支付接口参数
            //设置必填参数
            //appid已填,商户无需重复填写
            //mch_id已填,商户无需重复填写
            //noncestr已填,商户无需重复填写
            //spbill_create_ip已填,商户无需重复填写
            //sign已填,商户无需重复填写
            $unifiedOrder->setParameter("openid","$openid");//商品描述
            $unifiedOrder->setParameter("body","订单付款");//商品描述
            //自定义订单号,此处仅作举例
            $unifiedOrder->setParameter("out_trade_no",$out_trade_no);//商户订单号 
            $unifiedOrder->setParameter("total_fee",$fee*100);//总金额
            $unifiedOrder->setParameter("notify_url",NOTIFY_URL);//通知地址 
            $unifiedOrder->setParameter("trade_type","JSAPI");//交易类型
            //非必填参数,商户可根据实际情况选填
            //$unifiedOrder->setParameter("sub_mch_id","XXXX");//子商户号  
            //$unifiedOrder->setParameter("device_info","XXXX");//设备号 
            //$unifiedOrder->setParameter("attach","XXXX");//附加数据 
            //$unifiedOrder->setParameter("time_start","XXXX");//交易起始时间
            //$unifiedOrder->setParameter("time_expire","XXXX");//交易结束时间 
            //$unifiedOrder->setParameter("goods_tag","XXXX");//商品标记 
            //$unifiedOrder->setParameter("openid","XXXX");//用户标识
            //$unifiedOrder->setParameter("product_id","XXXX");//商品ID
        
            $prepay_id = $unifiedOrder->getPrepayId();
            //=========步骤3:使用jsapi调起支付============
            $jsApi->setPrepayId($prepay_id);
            $jsApiParameters = $jsApi->getParameters();
            $this->assign('catename',"微信支付");
            $this->assign('pay_cash',$fee);
            $this->assign('jsApiParameters',$jsApiParameters);
            $this->assign_ur_here('微信支付',array(array('title'=>'微信支付','url'=>U('Index/wap_dowxpay'))));
            $this->display('Index:wap_dowxpay');
        }
    
        /******************************
        服务器异步通知页面方法
        其实这里就是将notify_url.php文件中的代码复制过来进行处理
        
        *******************************/
        public function notifyurl(){
           
            //使用通用通知接口
            $notify = new Notify_pub();
        
            //存储微信的回调
            $xml = $GLOBALS['HTTP_RAW_POST_DATA'];    
            $notify->saveData($xml);
            
            //验证签名,并回应微信。
            //对后台通知交互时,如果微信收到商户的应答不是成功或超时,微信认为通知失败,
            //微信会通过一定的策略(如30分钟共8次)定期重新发起通知,
            //尽可能提高通知的成功率,但微信不保证通知最终能成功。
            if($notify->checkSign() == FALSE){
                $notify->setReturnParameter("return_code","FAIL");//返回状态码
                $notify->setReturnParameter("return_msg","签名失败");//返回信息
            }else{
                $notify->setReturnParameter("return_code","SUCCESS");//设置返回码
            }
            $returnXml = $notify->returnXml();
            echo $returnXml;
            
            //==商户根据实际情况设置相应的处理流程,此处仅作举例=======
            //$log_name="notify_url.log";//log文件路径
            //$this->log_result($log_name,"【接收到的notify通知】:
    ".$xml."
    ");
        
            if($notify->checkSign() == TRUE)
            {
                if ($notify->data["return_code"] == "FAIL") {
                    //此处应该更新一下订单状态,商户自行增删操作
                    //$this->log_result($log_name,"【通信出错】:
    ".$xml."
    ");
                }
                elseif($notify->data["result_code"] == "FAIL"){
                    //此处应该更新一下订单状态,商户自行增删操作
                    //$this->log_result($log_name,"【业务出错】:
    ".$xml."
    ");
                }
                else{
                    //此处应该更新一下订单状态,商户自行增删操作
                    //买家支付成功,开始修改订单的支付方式和付款状态
                    //$this->log_result($log_name,$out_trade_no."【支付成功0000】:
    ".$xml."
    ");
                    $out_trade_no = $notify->data["out_trade_no"];
                    $Apply=M('Apply');
                    $data['pay_state']=1;
                    $data['pay_type']='wxpay';
                   $ret= $Apply->where(array('id'=>$out_trade_no))->save($data);
                    if($ret){
                        echo "success";
                    }
                }
            }
                    
        }
            
        //查询订单的支付状态
        public function order_query(){
        
            //退款的订单号
            if (!isset($_POST["out_trade_no"]))
            {
                $out_trade_no = " ";
            }else{
                $out_trade_no = $_POST["out_trade_no"];
        
                //使用订单查询接口
                $orderQuery = new OrderQuery_pub();
                $orderQuery->setParameter("out_trade_no","$out_trade_no");//商户订单号 
                //获取订单查询结果
                $orderQueryResult = $orderQuery->getResult();
                
                //商户根据实际情况设置相应的处理流程,此处仅作举例
                if ($orderQueryResult["return_code"] == "FAIL") {
                    echo json_encode($orderQueryResult["return_code"]);
                }
                elseif($orderQueryResult["result_code"] == "FAIL"){
                    echo json_encode($orderQueryResult["result_code"]);
                }
                else{
                   echo json_encode($orderQueryResult['trade_state']);
                }    
                
            }
        }
    
        
        //空操作处理,所有空操作都指向空模块
        public function _empty(){
            $this->redirect('Empty/index');
        }
        //获取面包屑标题
        protected function assign_ur_here($title,$bread){
           //$bread  是一个数组   array   $bread = array('title'=>'ThinkPHP','url'=>'ThinkPHP@gmail.com');
           $breadcrumb = "<a href=".U('Index/index').">首页</a>";
           foreach($bread as $key=>$v){
              $breadcrumb.= "><a href='".$v['url']."'>".$v['title']."</a>";
           }
           $this->assign('breadcrumb',$breadcrumb);
           $this->assign('seo_title',$title);
        }
    }

    支付宝:

    class AlipayMobile extends Action{
              
        public function _initialize() {
            header("Content-type:text/html;charset=utf-8");
        }
        public function index() {
            echo "禁止访问";
        }
        //doalipay方法
        /*该方法其实就是将接口文件包下alipayapi.php的内容复制过来
          然后进行相关处理
        */
        public function doalipay(){
            vendor('Alipay.Corefunction');
            vendor('Alipay.Md5function');
            vendor('Alipay.Notify');
            vendor('Alipay.Submit');   
            /**************************请求参数**************************/
            //这里我们通过TP的C函数把配置项参数读出,赋给$alipay_config;
            $alipay_config = array(
            'partner'             =>   C('alipay_partner'),   //这里是你在成功申请支付宝接口后获取到的PID;
            'key'                 =>   C('alipay_key'),//这里是你在成功申请支付宝接口后获取到的Key
            'private_key_path'      => 'key/rsa_private_key.pem',
            'ali_public_key_path' => 'key/alipay_public_key.pem',
            'sign_type'           => strtoupper('MD5'),
            'input_charset'       => 'utf-8',
            'cacert'              => getcwd().'\cacert.pem',
            'transport'           => 'http',
            );
            $notify_url = C('site_url').'/index.php/Alipay/通知接口'; //服务器异步通知页面路径
            $return_url = C('site_url').U('User/index'); //页面跳转同步通知页面路径
            
            $payment_type = "1"; //支付类型 //必填,不能修改
            $seller_email = C('alipay_seller_email');//卖家支付宝帐户必填
            $out_trade_no = $_POST['order_no'];//商户订单号 通过支付页面的表单进行传递,注意要唯一!
            $subject =  "对订单".$_POST['order_no'].'付款';  //订单名称 //必填 通过支付页面的表单进行传递
            $total_fee = $_POST['pay_cash'];   //付款金额  //必填 通过支付页面的表单进行传递
            $body = '订单付款';
            $anti_phishing_key = "";//防钓鱼时间戳 //若要使用请调用类文件submit中的query_timestamp函数
            $exter_invoke_ip = get_client_ip(); //客户端的IP地址 
            /************************************************************/
            $extra_common_param = $_SESSION['master']['mas_id'];
            //构造要请求的参数数组,无需改动
            $parameter = array(
            "service" => "create_direct_pay_by_user",
            "partner" => trim(C('alipay_partner')),
            "payment_type"    => $payment_type,
            "notify_url"    => $notify_url,
            "return_url"    => $return_url,
            "seller_email"    => $seller_email,
            "out_trade_no"    => $out_trade_no,
            "subject"    => $subject,
            "total_fee"    => $total_fee,
            "body"            => $body,
            "extra_common_param" => $extra_common_param,
            "anti_phishing_key"    => $anti_phishing_key,
            "exter_invoke_ip"    => $exter_invoke_ip,
            "_input_charset"    => trim(strtolower($alipay_config['input_charset']))
            );
            //建立请求
            
            $alipaySubmit = new AlipaySubmit($alipay_config);
            $html_text = $alipaySubmit->buildRequestForm($parameter,"post", "确认");
            echo $html_text;
         }
        //手机端支付
        public function wap_doalipay(){
            header("Content-type:text/html;charset=utf-8");
            vendor('Wap_alipay.Corefunction');
            vendor('Wap_alipay.Md5function');
            vendor('Wap_alipay.Notify');
            vendor('Wap_alipay.Submit');
    
            $alipay_config = array(
            'partner'             =>   C('alipay_partner'),   //这里是你在成功申请支付宝接口后获取到的PID;
            'key'                 =>   C('alipay_key'),//这里是你在成功申请支付宝接口后获取到的Key
            'private_key_path'      => 'key/rsa_private_key.pem',
            'ali_public_key_path' => 'key/alipay_public_key.pem',
            'sign_type'           => strtoupper('MD5'),
            'input_charset'       => 'utf-8',
            'cacert'              => getcwd().'\cacert.pem',
            'transport'           => 'http',
            );
    
            //返回格式
            $format = "xml";
            //必填,不需要修改
            //返回格式
            $v = "2.0";
            //必填,不需要修改
            //请求号
            $req_id = date('Ymdhis');
            //必填,须保证每次请求都是唯一
            
            //**req_data详细信息**
            
            //服务器异步通知页面路径
            $notify_url = C('site_url').'/index.php/Alipay/wap_notifyurl'; //服务器异步通知页面路径
            //需http://格式的完整路径,不允许加?id=123这类自定义参数
            
            //页面跳转同步通知页面路径
            $call_back_url = C('site_url').'/index.php/User/index'; //页面跳转同步通知页面路径
            //需http://格式的完整路径,不允许加?id=123这类自定义参数
            
            //操作中断返回地址
            $merchant_url = C('site_url').'/index.php/User/index'; //页面跳转同步通知页面路径
            //用户付款中途退出返回商户的地址。需http://格式的完整路径,不允许加?id=123这类自定义参数
            
            //卖家支付宝帐户
            $seller_email = C('alipay_seller_email');
            //必填
            
            //商户订单号
            $out_trade_no = $_GET['order_no'];
            //商户网站订单系统中唯一订单号,必填
            
            //订单名称
            $subject = "对订单".$out_trade_no.'付款';
            //必填
            //查询付款金额
            $where=array(
                "is_del"=>'0',
                "id"=>$out_trade_no
                );
            $Apply=M('Apply');
            $data=$Apply->where($where)->find();
           
            $total_fee = $data['cost']; //必填 通过支付页面的表单进行传递$acount
            
            //dump($out_trade_no);dump($subject);dump($data);dump($total_fee);
            //return;
            //付款金额
            //$total_fee = $_POST['pay_cash']; //必填 通过支付页面的表单进行传递$acount
            //必填
            $pay_expire    = 3;  //三分钟有效
            //请求业务参数详细
            $req_data = '<direct_trade_create_req><notify_url>' . $notify_url . '</notify_url><call_back_url>' . $call_back_url . '</call_back_url><seller_account_name>' . $seller_email . '</seller_account_name><out_trade_no>' . $out_trade_no . '</out_trade_no><subject>' . $subject . '</subject><total_fee>' . $total_fee . '</total_fee><merchant_url>' . $merchant_url . '</merchant_url><pay_expire>'.$pay_expire.'</pay_expire></direct_trade_create_req>';
            //必填
            /************************************************************/
    
            //构造要请求的参数数组,无需改动
            $para_token = array(
                    "service" => "alipay.wap.trade.create.direct",
                    "partner" => trim($alipay_config['partner']),
                    "sec_id" => trim($alipay_config['sign_type']),
                    "format"    => $format,
                    "v"    => $v,
                    "req_id"    => $req_id,
                    "req_data"    => $req_data,
                    "_input_charset"    => trim(strtolower($alipay_config['input_charset']))
            );
            
            //dump($para_token);
            //return;
            //建立请求
            $alipaySubmit = new AlipaySubmit($alipay_config);
            $html_text = $alipaySubmit->buildRequestHttp($para_token);
            
            //URLDECODE返回的信息
            $html_text = urldecode($html_text);
            
            //解析远程模拟提交后返回的信息
            $para_html_text = $alipaySubmit->parseResponse($html_text);
            
            //获取request_token
            $request_token = $para_html_text['request_token'];
    
            /**************************根据授权码token调用交易接口alipay.wap.auth.authAndExecute**************************/
            
            //业务详细
            $req_data = '<auth_and_execute_req><request_token>' . $request_token . '</request_token></auth_and_execute_req>';
            //必填
            
            //构造要请求的参数数组,无需改动
            $parameter = array(
                    "service" => "alipay.wap.auth.authAndExecute",
                    "partner" => trim($alipay_config['partner']),
                    "sec_id" => trim($alipay_config['sign_type']),
                    "format"    => $format,
                    "v"    => $v,
                    "req_id"    => $req_id,
                    "req_data"    => $req_data,
                    "_input_charset"    => trim(strtolower($alipay_config['input_charset']))
            );
            //建立请求
            $alipaySubmit = new AlipaySubmit($alipay_config);
            $html_text = $alipaySubmit->buildRequestForm($parameter, 'get', '确认');
            echo $html_text;
        }
        /******************************
        手机支付宝的异步接收
        
        *******************************/
        public function wap_notifyurl(){
            vendor('Wap_alipay.Corefunction');
            vendor('Wap_alipay.Md5function');
            vendor('Wap_alipay.Notify');
            vendor('Wap_alipay.Submit');
            
            //这里我们通过TP的C函数把配置项参数读出,赋给$alipay_config;
            $alipay_config = array(
            'partner'             =>   C('alipay_partner'),   //这里是你在成功申请支付宝接口后获取到的PID;
            'key'                 =>   C('alipay_key'),//这里是你在成功申请支付宝接口后获取到的Key
            'private_key_path'      => 'key/rsa_private_key.pem',
            'ali_public_key_path' => 'key/alipay_public_key.pem',
            'sign_type'           => strtoupper('MD5'),
            'input_charset'       => 'utf-8',
            'cacert'              => getcwd().'\cacert.pem',
            'transport'           => 'http',
            );
            //计算得出通知验证结果
            $alipayNotify = new AlipayNotify($alipay_config);
            $verify_result = $alipayNotify->verifyNotify();
            
            if($verify_result) {//验证成功
                /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
                //请在这里加上商户的业务逻辑程序代
            
                
                //——请根据您的业务逻辑来编写程序(以下代码仅作参考)——
                //获取支付宝的通知返回参数,可参考技术文档中服务器异步通知参数列表
                
                //解析notify_data
                //注意:该功能PHP5环境及以上支持,需开通curl、SSL等PHP配置环境。建议本地调试时使用PHP开发软件
                $doc = new DOMDocument();    
                if ($alipay_config['sign_type'] == 'MD5') {
                    $doc->loadXML($_POST['notify_data']);
                }
                
                if ($alipay_config['sign_type'] == '0001') {
                    $doc->loadXML($alipayNotify->decrypt($_POST['notify_data']));
                }
                
                if( ! empty($doc->getElementsByTagName( "notify" )->item(0)->nodeValue) ) {
                    //商户订单号
                    $out_trade_no = $doc->getElementsByTagName( "out_trade_no" )->item(0)->nodeValue;
                    //支付宝交易号
                    $trade_no = $doc->getElementsByTagName( "trade_no" )->item(0)->nodeValue;
                    //交易状态
                    $trade_status = $doc->getElementsByTagName( "trade_status" )->item(0)->nodeValue;
                    
                    if($trade_status == 'TRADE_FINISHED') {
                        //判断该笔订单是否在商户网站中已经做过处理
                            //如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序
                            //如果有做过处理,不执行商户的业务程序
                                
                        //注意:
                        //该种交易状态只在两种情况下出现
                        //1、开通了普通即时到账,买家付款成功后。
                        //2、开通了高级即时到账,从该笔交易成功时间算起,过了签约时的可退款时限(如:三个月以内可退款、一年以内可退款等)后。
                
                        //调试用,写文本函数记录程序运行情况是否正常
                        //logResult("这里写入想要调试的代码变量值,或其他运行的结果记录");
                        
                        echo "success";        //请不要修改或删除
                    }
                    else if ($trade_status == 'TRADE_SUCCESS') {
                        //买家支付成功,开始修改订单的支付方式和付款状态
                        //买家支付成功,开始修改订单的支付方式和付款状态
                            /*$Apply=M('Apply');
                            $data['pay_state']=1;
                            $data['pay_type']='alipay';
                           $ret= $Apply->where(array('id'=>$out_trade_no))->save($data);
                            if($ret){
                                echo "success";
                            }*/
                    
                    }
                        echo "success";        //请不要修改或删除
                }
            
                //——请根据您的业务逻辑来编写程序(以上代码仅作参考)——
                
                /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
            }
            else {
                //验证失败
                echo "fail".$_SESSION['master']['mas_id'];
            
                //调试用,写文本函数记录程序运行情况是否正常
                //logResult("这里写入想要调试的代码变量值,或其他运行的结果记录");
            }
        }
        /******************************
        服务器异步通知页面方法
        其实这里就是将notify_url.php文件中的代码复制过来进行处理
        
        *******************************/
        public function notifyurl(){
            vendor('Alipay.Corefunction');
            vendor('Alipay.Md5function');
            vendor('Alipay.Notify');
            vendor('Alipay.Submit');   
            //这里我们通过TP的C函数把配置项参数读出,赋给$alipay_config;
            $alipay_config = array(
            'partner'             =>   C('alipay_partner'),   //这里是你在成功申请支付宝接口后获取到的PID;
            'key'                 =>   C('alipay_key'),//这里是你在成功申请支付宝接口后获取到的Key
            'private_key_path'      => 'key/rsa_private_key.pem',
            'ali_public_key_path' => 'key/alipay_public_key.pem',
            'sign_type'           => strtoupper('MD5'),
            'input_charset'       => 'utf-8',
            'cacert'              => getcwd().'\cacert.pem',
            'transport'           => 'http',
            );
    
            //计算得出通知验证结果
            $alipayNotify = new AlipayNotify($alipay_config);
            $verify_result = $alipayNotify->verifyNotify();
            if($verify_result) {
               //验证成功
               //获取支付宝的通知返回参数,可参考技术文档中服务器异步通知参数列表
               $out_trade_no   = $_POST['out_trade_no'];      //商户订单号
               $extra_common_param = $_POST['extra_common_param'];
               $trade_no       = $_POST['trade_no'];          //支付宝交易号
               $trade_status   = $_POST['trade_status'];      //交易状态
               $total_fee      = $_POST['total_fee'];         //交易金额
               $notify_id      = $_POST['notify_id'];         //通知校验ID。
               $notify_time    = $_POST['notify_time'];       //通知的发送时间。格式为yyyy-MM-dd HH:mm:ss。
               $buyer_email    = $_POST['buyer_email'];       //买家支付宝帐号;
               $parameter = array(
                 "out_trade_no"     => $out_trade_no, //商户订单编号;
                 "trade_no"         => $trade_no,     //支付宝交易号;
                 "total_fee"        => $total_fee,    //交易金额;
                 "trade_status"     => $trade_status, //交易状态
                 "extra_common_param" => $extra_common_param,
                 "notify_id"     => $notify_id,    //通知校验ID。
                 "notify_time"   => $notify_time,  //通知的发送时间。
                 "buyer_email"   => $buyer_email,  //买家支付宝帐号;
               );
               if($_POST['trade_status'] == 'TRADE_FINISHED') {  
               }else if ($_POST['trade_status'] == 'TRADE_SUCCESS') {                           
                    //买家支付成功,开始修改订单的支付方式和付款状态
                    $Apply=M('Apply');
                    $data['pay_state']=1;
                    $data['pay_type']='alipay';
                   $ret= $Apply->where(array('id'=>$out_trade_no))->save($data);
                    if($ret){
                        echo "success";
                    }
                    
               }
               echo "success";        //请不要修改或删除
             }else {
                    
                    //验证失败
                    echo "fail".$_SESSION['master']['mas_id'];
            }    
        }
        
        /*
        页面跳转处理方法;
        这里其实就是将return_url.php这个文件中的代码复制过来,进行处理; 
        */
        public function returnurl(){
            vendor('Alipay.Corefunction');
            vendor('Alipay.Md5function');
            vendor('Alipay.Notify');
            vendor('Alipay.Submit');   
            //这里我们通过TP的C函数把配置项参数读出,赋给$alipay_config;
            $alipay_config = array(
            'partner'             =>   C('alipay_partner'),   //这里是你在成功申请支付宝接口后获取到的PID;
            'key'                 =>   C('alipay_key'),//这里是你在成功申请支付宝接口后获取到的Key
            'private_key_path'      => 'key/rsa_private_key.pem',
            'ali_public_key_path' => 'key/alipay_public_key.pem',
            'sign_type'           => strtoupper('MD5'),
            'input_charset'       => 'utf-8',
            'cacert'              => getcwd().'\cacert.pem',
            'transport'           => 'http',
            );
            $notify_url = C('site_url').'/index.php/Alipay/notifyurl'; //服务器异步通知页面路径
            $return_url = C('site_url').U('User/order'); //页面跳转同步通知页面路径
            
            $alipayNotify = new AlipayNotify($alipay_config);//计算得出通知验证结果
            $verify_result = $alipayNotify->verifyReturn();
            if($verify_result) {
                //验证成功
    
               if($_GET['trade_status'] == 'TRADE_FINISHED' || $_GET['trade_status'] == 'TRADE_SUCCESS') {
    
                    $this->success('支付成功',$return_url);
               }else {
                    $this->error('支付失败,'.$_GET['trade_status'],$return_url);
               }
           }else {
               //验证失败
               //如要调试,请看alipay_notify.php页面的verifyReturn函数
               $this->error('支付失败,'.$_GET['trade_status'],$return_url);
           }
           
           
        }
        //空操作处理,所有空操作都指向空模块
        public function _empty(){
            $this->redirect('Empty/index');
        }
    }

     

     

  • 相关阅读:
    「疫期集训day7」周期
    「字符串」哈希板子
    「疫期集训day6」雨林
    「疫期集训day5」火焰
    「数据结构」对顶堆
    「STL中的常用函数 容器」
    「单调队列优化DP」P2034 选择数字
    bootstrap table使用及遇到的问题
    ArcGIS栅格影像怎么从WGS84地理坐标转成Xian80投影坐标
    arcgis如何求两个栅格数据集的差集
  • 原文地址:https://www.cnblogs.com/tingfengqieyu/p/5442744.html
Copyright © 2020-2023  润新知