1. 程式人生 > >php實現支付寶授權登錄

php實現支付寶授權登錄

gin mem pau info redirect direct ember csrf攻擊 登錄

第一步:

登錄到螞蟻金服開放平臺 https://open.alipay.com/platform/home.htm,前提是有商戶號。創建應用之後,然後到開發者中心開通對應功能。如圖:

技術分享

第二步:

到應用信息裏面填寫應用網關與授權回調地址。應用網關填寫域名即可,如:www.baidu.com;授權回調地址則需要具體到頁面或者方法,如:www.baidu.com/aliLogin.php。

技術分享

第三步:

填寫接口加簽方式。去官方下載簽名生成器,然後生成一對秘鑰(應用公鑰和應用私鑰),設置好應用公鑰之後,能拿到對應的支付寶公鑰。(重點是 應用私鑰和支付寶公鑰)

技術分享

第四步:

數據表的設計。可以新建數據表存儲支付寶返回數據,也可以在用戶表裏面新加字段存儲。我的實現方法是後者,如圖:

技術分享

下面代碼可以看到支付寶返回數據存入對應字段

第五步:

下載sdk,地址 https://doc.open.alipay.com/docs/doc.htm?spm=a219a.7629140.0.0.iw1InW&treeId=193&articleId=103419&docType=1 。根據以上步驟拿到的appid,應用私鑰(RSA_PRIVATE_KEY)和支付寶公鑰(ALIPAY_RSA_PBULIC_KEY),開始調用支付寶接口獲取數據。上代碼:

 1
/** 2 * 支付寶授權登錄 3 */ 4 public function aliLogin(){ 5 //獲取配置文件的ali參數 6 $ali_config = C("ALI_CONFIG"); 7 8 //應用的APPID 9 $app_id = "2017061407485473"; 10 //【成功授權】後的回調地址 11 $my_url = "http://".$_SERVER[HTTP_HOST]."/Home/User/aliLogin";
12 13 //Step1:獲取auth_code 14 $auth_code = $_REQUEST["auth_code"];//存放auth_code 15 if(empty($auth_code)){ 16 //state參數用於防止CSRF攻擊,成功授權後回調時會原樣帶回 17 $_SESSION[alipay_state] = md5(uniqid(rand(), TRUE)); 18 //拼接請求授權的URL 19 $url = "https://openauth.alipay.com/oauth2/publicAppAuthorize.htm?app_id=".$app_id."&scope=auth_user&redirect_uri=".$my_url."&state=" 20 . $_SESSION[alipay_state]; 21 22 echo("<script> top.location.href=‘" . $url . "‘</script>"); 23 } 24 //Step2: 使用auth_code換取apauth_token 25 if($_REQUEST[state] == $_SESSION[alipay_state] || 1) 26 { 27 vendor("Alipay.AopClient"); //引入sdk 28 $aop = new \AopClient(); 29 $aop->gatewayUrl   = "https://openapi.alipay.com/gateway.do"; 30 $aop->appId   = $app_id; 31 $aop->rsaPrivateKey = $ali_config[RSA_PRIVATE_KEY];  //應用私鑰 32 $aop->alipayrsaPublicKey = $ali_config[ALIPAY_RSA_PBULIC_KEY];  //支付寶公鑰 33 $aop->apiVersion   = 1.0; 34 $aop->signType   = RSA2; 35 $aop->postCharset = utf-8; 36 $aop->format   = json; 37 38 //根據返回的auth_code換取access_token 39 vendor("Alipay.AlipaySystemOauthTokenRequest");  //調用sdk裏面的AlipaySystemOauthTokenRequest類 40 $request = new \AlipaySystemOauthTokenRequest(); 41 $request->setGrantType("authorization_code"); 42 $request->setCode($auth_code); 43 $result = $aop->execute($request); 44 $access_token = $result->alipay_system_oauth_token_response->access_token; 45 46 //Step3: 用access_token獲取用戶信息 47 vendor("Alipay.AlipayUserInfoShareRequest");  //調用sdk裏面的AlipayUserInfoShareRequest類 48 $request = new \AlipayUserInfoShareRequest(); 49 $result = $aop->execute ( $request, $access_token); 50 $responseNode = str_replace(".", "_", $request->getApiMethodName()) . "_response"; 51 $resultCode = $result->$responseNode->code; 52 if(!empty($resultCode)&&$resultCode == 10000){ 53 $user_data = $result->$responseNode; 54 $m = M("Member"); 55 $data = array(); 56 $data[sex] = $user_data->gender==m?1:2; 57 $data[province] = $user_data->province; 58 $data[city] = $user_data->city; 59 $data[person_name] = $user_data->nick_name; 60 $data[ali_openid] = $user_data->user_id; 61 $data[ali_name] = $user_data->nick_name; 62 $data[ali_img] = $user_data->avatar; 63 $data[addtime] = date("Y-m-d H:i:s", time()); 64 $data[person_img] = $user_data->avatar; 65 $data[signtime] = date("Y-m-d H:i:s", time()); 66 67 $user = M("Member")->where(array("ali_openid"=> $user_data->user_id))->find(); 68 69     //判斷是否是第一次登錄 70 if($user){ 71 $res = M("Member")->where(array("ali_openid"=> $user_data->user_id))->setField("signtime", date("Y-m-d H:i:s", time())); 72 if($res){ 73   //成功登錄業務邏輯 74 75 }else{ 76 $this->error("操作異常,拒絕訪問!", U(user/login)); 77 } 78 }else{ 79 $res=$m->add($data); 80 if($res){ 81   //成功登錄業務邏輯 82 83 84 }else{ 85 $this->error("操作異常,拒絕訪問!", U(user/login)); 86 } 87 } 88 89 } else { 90 $this->error("操作異常,拒絕訪問!", U(user/login)); 91 } 92 93 } 94 }

php實現支付寶授權登錄