支付宝支付成功后要重新登录问题解决小记

问题:

项目A使用项目B的支付宝配置信息,支付成功后,进入到了回调地址中,回调地址中的业务处理代码页执行成功,但是在跳转到商户页面时,跳转到非指定页面(如登录页面)或跳转到指定页面但是要求登录。

原因:

session丢失

解决方法:

方法一:在蚂蚁开放平台给项目A创建单独的应用,并指定项目A自己的回调地址。

方法二:蚂蚁开放平台的项目B中不指定回调地址。

方法三:在回调地址中携带登录用户的session信息,然后在回调地址中接收登录用户的session信息,判断如果获取不到登录用户的session,则把携带过来的session信息赋值。

下面代码是在回调地址中加上登录用户的session信息,

$aop = new AopClient ();
$aop->gatewayUrl = 'https://openapi.alipay.com/gateway.do';
$aop->appId = 'your app_id';
$aop->rsaPrivateKey = '请填写开发者私钥去头去尾去回车,一行字符串';
$aop->alipayrsaPublicKey='请填写支付宝公钥,一行字符串';
$aop->apiVersion = '1.0';
$aop->signType = 'RSA2';
$aop->postCharset='GBK';
$aop->format='json';
$request = new AlipayTradePagePayRequest ();

//组织登录用户的session信息,作为参数传递给回调方法,returnUrl是通过get接收参数,所以传递的参数中不能包含=,因此使用urlencode方法和http_build_query方法处理登录用户的session信息
$loginInfo = urlencode(http_build_query(session('login_user_auth')));

//设置请求的异步和同步回调地址
$request->setNotifyUrl('http://www.example.com/index.php?s=/ModuleName/ControllerName/notifyUrl');//异步跳转地址
$request->setReturnUrl('http://www.example.cn/index.php?s=/ModuleName/ControllerName/returnUrl/loginInfo/'.$loginInfo);//同步跳转地址
    
$request->setBizContent("{" .
    "\"out_trade_no\":\"20150320010101001\"," .
    "\"product_code\":\"FAST_INSTANT_TRADE_PAY\"," .
    "\"total_amount\":88.88," .
    "\"subject\":\"Iphone6 16G\"," .
    "\"body\":\"Iphone6 16G\"" .
"}");
$result = $aop->pageExecute ( $request); 

$responseNode = str_replace(".", "_", $request->getApiMethodName()) . "_response";
$resultCode = $result->$responseNode->code;
if(!empty($resultCode)&&$resultCode == 10000){
    echo "成功";
} else {
    echo "失败";
}

下面代码是在回调地址中对接收到的参数做处理,

/**
     * 支付宝支付成功的同步回调函数
     */
    public function returnUrl(){
        //接收支付宝的通知返回参数
        $arr = $_GET;

        //获取到传递给回调方法中的登录用户的session信息
        parse_str(urldecode($arr['loginInfo']),$loginInfo);
        //销毁掉参数中多余的参数,支付宝验签时指定了需要的参数,其他的都是多余的参数,需要unset掉
        unset($arr['loginInfo']);

        Vendor('Alipay.service.AlipayTradeService');
        $alipaySevice = new \AlipayTradeService($config);
        $result = $alipaySevice->check($arr);#此处的$arr中不能有支付宝指定验签参数之外的其他参数,否则返回的$result为false
        if($result) {//验证成功
            /**************商户的业务逻辑代码******************/
            ...

            //判断登录用户的session是否还在
            $loginSession = session('login_user_auth');
            //如果不在了,则把传递的session信息赋值
            if(empty($loginSession)){
                session('login_user_auth', $loginInfo);
            }

            //业务处理完后,跳转到商户的页面
            $this->success('/ModuleName/ControllerName/ActionName');
            //$this->redirect('/ModuleName/ControllerName/ActionName');
        }else {
            //验证失败
            echo "fail";
        }
    }

如上处理后,就解决了回调方法后跳转到商户页面session丢失的问题。

你可能感兴趣的:(php)