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

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

注意:支付完成后的通知地址中,格式要使用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');
    }
}

 

 

原文地址:https://www.cnblogs.com/tingfengqieyu/p/5442744.html