天天看点

h5支付

1、支付宝支付

(1)前端表单

<form name=alipayment action="" method=post>
           

(2)创建订单

include_once(Yii::app()->basePath . '/extensions/alipay/alipay.config.php');
include_once(Yii::app()->basePath . "/extensions/alipay/lib/alipay_submit.class.php");
                //构造要请求的参数数组,无需改动
                $parameter = array(
                    "service" => $alipay_config['service'],
                    "partner" => $alipay_config['partner'],
                    "seller_id" => $alipay_config['seller_id'],
                    "payment_type" => $alipay_config['payment_type'],
                    "notify_url" => "http://xxx/Notify",
                    "return_url" => "http://xxx/Return",
                    "_input_charset" => trim(strtolower($alipay_config['input_charset'])),
                    "out_trade_no" => $sn,//唯一订单号
                    "subject" => $name,//商品标题
                    "total_fee" => $amount,//实付金额
                    "show_url" => $url,//支付完成后跳转地址
                    "app_pay"  => $appPay,//启用此参数能唤起钱包APP支付宝
                    "body" => '',//订单描述
                );
                //建立请求
                $alipaySubmit = new AlipaySubmit($alipay_config);
                $returnStr = $alipaySubmit->buildRequestForm($parameter, "get", "确认");
                echo $returnStr;
           

(3)异步通知

/*
   * 支付宝异步通知
*/
    public function actionNotify(){
        include_once(Yii::app()->basePath.'/extensions/alipay/alipay.config.php');
        include_once(Yii::app()->basePath."/extensions/alipay/lib/alipay_notify.class.php");
        //计算得出通知验证结果
        $alipayNotify = new AlipayNotify($alipay_config);
        $verify_result = $alipayNotify->verifyNotify();

        if($verify_result) {//验证成功
            /
            //请在这里加上商户的业务逻辑程序代


            //——请根据您的业务逻辑来编写程序(以下代码仅作参考)——

            //获取支付宝的通知返回参数,可参考技术文档中服务器异步通知参数列表

            //商户订单号
            $out_trade_no = $_POST['out_trade_no'];

            //支付宝交易号
           $trade_no = $_POST['trade_no'];

            //交易状态
            $trade_status = $_POST['trade_status'];

            //支付金额
            $total_fee = $_POST['total_fee'];

            //卖家支付宝账号
            $seller_email = $_POST['seller_email'];

            Yii::log(json_encode($_POST), 'alipay ___  success');

            $echo = 'success';
            if($trade_status == 'TRADE_FINISHED') {
                //判断该笔订单是否在商户网站中已经做过处理
                //如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序
                //如果有做过处理,不执行商户的业务程序

                //注意:
                //退款日期超过可退款期限后(如三个月可退款),支付宝系统发送该交易状态通知
                //请务必判断请求时的total_fee、seller_id与通知时获取的total_fee、seller_id为一致的

                //调试用,写文本函数记录程序运行情况是否正常
                logResult("TRADE_FINISHED");
                $orderInfo = SaleOrderInfo::model()->findByAttributes(array("sn" => $out_trade_no));

                logResult(print_r($orderInfo,true));
                if($orderInfo && ($seller_email == $alipay_config['alipayName'])) {
                    logResult("chu li ding dan 1");
                    $conn = SaleOrder::model()->getDbConnection();
                    $transaction = $conn->beginTransaction();
                  
                        /*****这里写你的处理逻辑****/
                            if ($bool) {
                                $transaction->commit();
                                $echo = 'success';
                            } else {
                                $transaction->rollback();
                                $echo = 'fail1';
                            }
    
                }
                exit($echo);
            }else if ($_POST['trade_status'] == 'TRADE_SUCCESS') {
                //判断该笔订单是否在商户网站中已经做过处理
                //如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序
                //如果有做过处理,不执行商户的业务程序

                //注意:
                //付款完成后,支付宝系统发送该交易状态通知
                //请务必判断请求时的total_fee、seller_id与通知时获取的total_fee、seller_id为一致的

                //调试用,写文本函数记录程序运行情况是否正常
                logResult("TRADE_SUCCESS");

                $orderInfo = SaleOrderInfo::model()->findByAttributes(array("sn" => $out_trade_no));

                logResult(print_r($orderInfo,true));
                if($orderInfo && ($seller_email == $alipay_config['alipayName'])) {
                    logResult("chu li ding dan 1");

                       
                        /*****这里写你的处理逻辑****/
                     if ($bool) {
                           $transaction->commit();
                           $echo = 'success';
                      } else {
                            $transaction->rollback();
                            $echo = 'fail1';
                      }
       
                }
                exit($echo);

            }
        }
        else {
            //调试用,写文本函数记录程序运行情况是否正常
            logResult("验证失败");

            //验证失败
            exit("fail");


        }
    }
           

(4)回调

public function actionReturn(){
        include_once(Yii::app()->basePath.'/extensions/alipay/alipay.config.php');
        include_once(Yii::app()->basePath."/extensions/alipay/lib/alipay_notify.class.php");
        $alipayNotify = new AlipayNotify($alipay_config);
        $verify_result = $alipayNotify->verifyReturn();

        if($verify_result) {//验证成功
            //商户订单号
            $out_trade_no = $_GET['out_trade_no'];

            //支付宝交易号
            $trade_no = $_GET['trade_no'];

            //交易状态
            $trade_status = $_GET['trade_status'];

            //支付金额
            $total_fee = $_GET['total_fee'];

            //卖家支付宝账号
            $seller_id = $_GET['seller_id'];

            Yii::log(json_encode($_GET), '支付宝wap支付验证成功,订单号 '.$out_trade_no);

            //判断该笔订单是否在商户网站中已经做过处理
            //如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序
            //如果有做过处理,不执行商户的业务程序

            //注意:
            //付款完成后,支付宝系统发送该交易状态通知
            //请务必判断请求时的total_fee、seller_id与通知时获取的total_fee、seller_id为一致的

            //调试用,写文本函数记录程序运行情况是否正常
            logResult('支付宝WAP同步跳转处理:');
       
            logResult(print_r($_GET,true));
            if($seller_id == $alipay_config['seller_id']) {
                $conn = SaleOrder::model()->getDbConnection();
                $transaction = $conn->beginTransaction();
               /*****写你的处理逻辑*****/
            }
        }else{
            logResult("支付宝WAP支付验证失败:".print_r($_GET,true));
            exit;
        }
    }
           

2.微信支付

(1)创建订单

ini_set('date.timezone', 'PRC');//Asia/Shanghai
                require_once Yii::app()->basePath.'/extensions/WxpayAPI/lib/WxPay.Api.php';
                require_once Yii::app()->basePath.'/extensions/WxpayAPI/log.php';
                //初始化日志
                //以下临时注释
                /*  $logHandler= new CLogFileHandler(Yii::app()->basePath."/extensions/WxpayAPI/logs/".date('Y-m-d').'.log');
                  $log = Log::Init($logHandler, 15);*/
                $input = new WxPayUnifiedOrder();
                $input->SetBody("****");//订单描述
                $input->SetAttach("微信h5支付");
                $input->SetAppid('***');//appid
                $input->SetMch_id('***');//mch_id
                $input->SetOut_trade_no($sn);
                $input->SetTotal_fee($amount*100);
                $input->SetTime_start(date("YmdHis"));
                $input->SetTime_expire(date("YmdHis", time() + 600));
                //$input->SetGoods_tag("");
                $input->SetNotify_url("http://****/WxNotify");//通知
                $input->SetTrade_type("MWEB");

                $str = "{\"h5_info\": {\"type\":\"Wap\",\"wap_url\": \"https://www.baidu.com\",\"wap_name\": \"购买***\"}}";
                $input->SetScene_info($str);


                $result = WxPayApi::unifiedOrder($input);
                $url_encode_redirect_url = urlencode("*****");//支付完成后返回的地址
                $url                     = $result['mweb_url'] . '&redirect_url=' . $url_encode_redirect_url;
           

(2)异步通知

require_once Yii::app()->basePath.'/extensions/WxpayAPI/lib/WxPay.Api.php';
require_once Yii::app()->basePath.'/extensions/WxpayAPI/lib/WxPay.Notify.php';
require_once Yii::app()->basePath.'/extensions/WxpayAPI/log.php';
require_once Yii::app()->basePath.'/extensions/WxpayAPI/lib/WxPay.Data.php';
require_once Yii::app()->basePath.'/extensions/WxpayAPI/lib/WxPay.Config.php';
           
public function actionWxNotify()
{
    $notify = new WxPayNotifyReply();

    //获取通知的数据
    $xml = $GLOBALS['HTTP_RAW_POST_DATA'];
    Log::DEBUG("微信支付通知:" . $xml);
    //如果返回成功则验证签名
    try {
        $result = WxPayResults::Init($xml);
    } catch (WxPayException $e){
        $msg = $e->errorMessage();
        $result = false;
    }
    if($result == false){
        $notify->SetReturn_code("FAIL");
        $notify->SetReturn_msg($msg);
        Log::DEBUG($msg);
    } else {//验证成功
        Log::DEBUG("微信通知验证成功,内容为:".print_r($result,true));
        $out_trade_no = $result['out_trade_no'];
        $total_fee = $result['total_fee']/100;
        $result_code = $result['result_code'];
        $mch_id = $result['mch_id'];
        if($result_code == 'SUCCESS'){
            if($orderInfo){
                Log::DEBUG("订单验证通过,开始处理订单:".$out_trade_no);
                    if ($orderFlag && $orderLogFlag && $orderInfoFlag) {
                        $transaction->commit();
                        $notify->SetReturn_code("SUCCESS");
                        $notify->SetReturn_msg("OK");
                    } else {
                        $transaction->rollback();
                        $notify->SetReturn_code("FAIL");
                        Log::DEBUG('订单处理失败:'.$out_trade_no);
                    }

//                Yii::log("支付订单【{$e->getMessage()}】订单ID{$orderData->id}!\n", CLogger::LEVEL_ERROR);
//                $notify->SetReturn_code("FAIL");

            }else{//订单验证失败
                Log::DEBUG('订单验证失败(‘不存在’或者 ‘信息异常’、‘已经处理过’)'.$out_trade_no);
                $notify->SetReturn_code("FAIL");
            }
        }

    }

    //回复通知
    if($result == true && $notify->GetReturn_code($return_code) == "SUCCESS")
    {
        $notify->SetSign();
    }
    WxpayApi::replyNotify($notify->ToXml());
    Log::DEBUG("回复微信的通知为:".$notify->ToXml());
    exit;
}