zoukankan      html  css  js  c++  java
  • 支付宝H5、APP支付服务端的区别(php)

    php支付宝H5和APP支付
    1.准备工作
    需要前往 蚂蚁金服开放平台申请
    https://openhome.alipay.com/developmentDocument.htm

    2.大致流程
    1.用户添加商品生成订单,选择支付宝支付方式,点击购买按钮,前端发送ajax请求到后端,后端调用支付宝统一下单接口生成预付单。对于H5支付返回的是一个表单的字符串,前端接收到直接复制给页面某个div,会自动调起支付宝APP进行支付,如下图:

    首先出现的是前面一个图然后自己跳到后面的图进行支付,点击后退回到前面的图,可以点继续支付重新打开后面的图。用户支付完成跳转到支付宝统一下单接口中设置的同步回调接口。H5的支付结果应该以异步回调或者查询订单API返回的值为准。APP支付同步异步的返回结果都可以作为判断是否成功支付的依据。APP支付代开的页面没有前面的图,


    3.核心代码
    1.统一下单接口
    pay_type 0表示H5支付,1表示APP支付,下载支付宝SDK解压到项目中的目录。

    if($pay_type==0)
    {
        $request = new AlipayTradeWapPayRequest();
        $request->setNotifyUrl(PAYNOTIFYURL);//异步回调接口
        $bizcontent =json_encode(array('subject'=>$goods_id,'out_trade_no'=>$order_num,'total_amount'=>$order_price,'product_code'=>'QUICK_WAP_WAY'));    
        $request->setReturnUrl(API_URL.'/cloud/alipay?method=alipay.trade.wap.pay.return');//同步回调接口
        $request->setBizContent($bizcontent);
        $response = $aop->pageExecute($request);
    }else 
    {
        $request = new AlipayTradeAppPayRequest();
        $request->setNotifyUrl(PAYNOTIFYURL);
        $bizcontent=json_encode(array('subject'=>$goods_id,'out_trade_no'=>$order_num,'total_amount'=>$order_price,'product_code'=>'QUICK_MSECURITY_PAY'));
        $request->setReturnUrl(API_URL.'/cloud/alipay?method=pay_check');
        $request->setBizContent($bizcontent);
        //这里和普通的接口调用不同,使用的是sdkExecute
        $response = $aop->sdkExecute($request);
    }
    $retObj = new stdClass();
    $retObj->appId = $alipay_appid;
    $retObj->priv_key_md5 = md5($private_key);
    $retObj->order_sign = $response;
    echo json_encode($retObj);

    2.异步回调接口

    判断返回参数是否合法:

    if(!array_key_exists('out_trade_no',$_POST)
        || !array_key_exists('trade_no',$_POST)
        || !array_key_exists('auth_app_id',$_POST)
        || !array_key_exists('seller_id',$_POST)
        || !array_key_exists('total_amount',$_POST)
        || !array_key_exists('sign',$_POST)
        || !array_key_exists('sign_type',$_POST)
        || !array_key_exists('trade_status',$_POST))
    {
        exit;
    }
    $order_num    = $_REQUEST['out_trade_no'];
    $alinum       = $_REQUEST['trade_no'];
    $aliapp_id    = $_REQUEST['auth_app_id'];
    $seller_id    = $_REQUEST['seller_id'];
    $total_amount = $_REQUEST['total_amount'];
    $sign         = $_REQUEST['sign'];
    $signType     = $_REQUEST['sign_type'];
    $trade_status = $_REQUEST['trade_status'];
    if(!in_array($trade_status,array('TRADE_SUCCESS','TRADE_FINISHED')))
    {
        exit;
    }

    2.查询订单表的状态是否已经更改,若已经更改说明已经回调过,直接exit。
    3.核对支付宝商户号,app_id,支付金额是否对得上,验证传过来的签名是否合法,从而拒绝非法回调。

    if($aliapp_id != $alipay_appid || $total_amount != $order_price || $seller!=$seller_id)
    {
        $db->close();
        exit;
    }
    $sign = str_replace(' ','+',$_POST['sign']);
    $result=$aop->rsaCheckV1($_POST, NULL, "RSA2");
    if(!$result)
    {
        $db->close();
        exit();
    }

    4.开启事务,更新订单表支付状态,订单状态等,写支付日志。
    5.代码最后输出success,以免支付宝重复回调。

    echo "success";

    3.查询订单接口

    H5与APP返回不同,不能共用一个接口。
    APP:
    1.检验返回值

    $retObj = new stdClass();
    if( !array_key_exists('order_id',$_POST)
        || !array_key_exists('result',$_POST)
        || !array_key_exists('resultStatus',$_POST))
    {
        $retObj->msg=0;
        echo json_encode($retObj);
        unset($retObj);
        exit;
    }
    $order_id   = trim($_POST['order_id']);
    //转义result反斜杠
    $syncrst    = stripslashes(trim($_POST['result']));
    $resultStatus = (int)$_POST['resultStatus'];
    if(empty($syncrst)||empty($order_id) || empty($resultStatus))
    {
        $retObj->msg=0;
        echo json_encode($retObj);
        unset($retObj);
        exit;
    }
    if(!is_object(json_decode($syncrst)))
    {
        $retObj->msg=0;
        echo json_encode($retObj);
        unset($retObj);
        exit;
    }

    2.根据返回状态判断

    if($resultStatus == 9000 || $resultStatus ==8000 || $resultStatus==6004)
    {
        $arr = json_decode($syncrst);
        //支付是否成功 ,订单号码,订单交易号,订单完成时间
        $msg           = $arr->alipay_trade_app_pay_response->msg;
        $order_num_get = $arr->alipay_trade_app_pay_response->out_trade_no;
        $order_trade   = $arr->alipay_trade_app_pay_response->trade_no;
        $time          = strtotime($arr->alipay_trade_app_pay_response->timestamp);
        $total_amount  = $arr->alipay_trade_app_pay_response->total_amount;
        $seller_id_get = $arr->alipay_trade_app_pay_response->seller_id;
        $alipay_appid_get    = $arr->alipay_trade_app_pay_response->app_id;
        //支付成功验证签名
        if($msg == "Success")
        { //支付成功,后续可以查询订单的状态值是否更改过,若已经更改,说明异步回调成功了,若没有更改可以再次更改订单状态,处理业务
        $sign = $arr->sign;
                $signType = $arr->sign_type;
                $aop = new AopClient;
                $aop->alipayrsaPublicKey=$public_key;       
                $sign = str_replace(' ','+',$arr->sign);
                $result = $aop->verify(json_encode($arr->alipay_trade_app_pay_response),$sign,NULL,$signType);
        }
    }

    H5:
    1.接收返回值

    $order_num = $_GET['out_trade_no'];
    $alinum = $_GET['trade_no'];
    $aliapp_id = $_GET['app_id'];
    $seller_id = $_GET['seller_id'];
    $total_amount = $_GET['total_amount'];
    $sign = $_GET['sign'];
    $signType=$_GET['sign_type'];

    2.查询订单表订单状态,若为已支付,则直接返回支付成功
    3.调用支付宝查询接口

    //调用支付宝sdk
    $aop = new AopClient ();
    $aop->gatewayUrl = WAYURL;
    $aop->appId = $alipay_appid;
    //$aop->rsaPrivateKeyFilePath =$private_key;
    $aop->rsaPrivateKey =$private_key;
    $aop->format = FORMAT;
    $aop->charset = CHARSET;
    $aop->signType = SIGNTYPE;
    $aop->apiVersion = '1.0';
    $aop->postCharset=CHARSET;
    $request = new AlipayTradeQueryRequest ();
    $request->setBizContent("{" .
    ""out_trade_no":"$order_num"," .
    ""trade_no":"$alinum"" .
    "  }");
    $result = $aop->execute ($request); 
    $responseNode = str_replace(".", "_", $request->getApiMethodName()) . "_response";
    $resultNode = $result->$responseNode;

    4.根据状态判断

    if($resultNode->code == 10000 || $resultNode->msg =='Success')
    {
            //支付成功
    }
  • 相关阅读:
    Linux目录
    find命令
    107. Binary Tree Level Order Traversal II
    grep命令
    110. Balanced Binary Tree
    111. Minimum Depth of Binary Tree
    什么是泛型
    自动装箱与拆箱
    HDU 3001 Travelling (状压DP + BFS)
    POJ 3411 Paid Roads (状态压缩+BFS)
  • 原文地址:https://www.cnblogs.com/mverting/p/10487843.html
Copyright © 2011-2022 走看看