问题:
项目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丢失的问题。