php獲取支付寶使用者資訊
阿新 • • 發佈:2018-12-24
php獲取支付寶使用者資訊
一:建立應用
要在您的應用中使用支付寶開放產品的介面能力:
- 您需要先去螞蟻金服開放平臺(open.alipay.com),在開發者中心建立登記您的應用,此時您將獲得應用唯一標識(APPID);
- 請在【功能資訊】中點選【新增功能】,選擇【獲取會員資訊】;
- 提交稽核,等待稽核通過,該應用正式可以使用。
需要詳細瞭解開放平臺建立應用步驟請參考《開放平臺應用建立指南》。
二:配置金鑰
開發者呼叫介面前需要先生成RSA金鑰,RSA金鑰包含應用私鑰(APP_PRIVATE_KEY)、應用公鑰(APP_PUBLIC_KEY)。生成金鑰後在開放平臺開發者中心進行金鑰配置,配置完成後可以獲取支付寶公鑰(ALIPAY_PUBLIC_KEY)。詳情請參考《 配置應用環境》。
三:搭建和配置開發環境
1. 下載服務端SDK
為了幫助開發者呼叫開放介面,我們提供了開放平臺服務端SDK,包含JAVA、PHP和.NET三個語言版本,封裝了簽名&驗籤、HTTP介面請求等基礎功能。請先下載對應語言版本的SDK並引入您的開發工程。
各語言版本服務端SDK詳細使用說明,請參考《服務端SDK說明》,本文需要下載的就是PHP的SDK包了。
2. 介面呼叫配置
先看前端程式碼:
2.1 先從後臺獲取二維碼,並且展示出來
function show(){ var parmss = { phone:userName }; $.ajax({ url: model.base_url+ "/Alipay/getQRcode", data: parms, type: "post", dataType: "text", success: function(res, status, xhr) { if(res != '' || res != null){ //將二維碼顯示出來 var url = res.body.url; popupUrl.find(".pm-left").find("img").attr("src",url); } }, error:function(data) { } }); $("#popup-bind").show(); int = setInterval(model.bindQuery,"1000");//通過定時器,判斷是否繫結過第三方支付 }
2.2 定時器,判斷是否繫結成功
//根據請求後臺看是否資料已經繫結
function bindQuery(){ var parmss = { phone:userName }; $.ajax({ url: model.base_url+"Authorland/getBindsucess", data: parmss, type: "post", dataType: "text", success: function(res, status, xhr) { if(res != '' || res != null){ if(bind_num == 0){ var zfb_id = res.body.zfb_id; bind_num = 1; }else{ var wx_ids = res.body.wx_id; }
如果支付寶已經繫結,就把已經繫結的圖片換上去,並且把二維碼關閉掉 if(zfb_id != undefined || zfb_ids != undefined){ $("#bind-zfb").unbind(); $("#bind-zfb").addClass("on"); $("#bind-zfb").find("p").text("已繫結支付寶"); $("#bind-zfb").find("img").attr("src","/public/Content/Images/wallet/zfb_on.png"); } if(wx_id != wx_ids || zfb_id != zfb_ids){ clearInterval(int);//清除定時器 } } } }); }
2.3 php 後臺處理程式碼
直接看php程式碼
<?php namespace app\service\controller; use think\Loader; use think\Session; use alipay\jssdk; use think\Db; use alipayapi\aop\AopClient; use alipayapi\aop\request\AlipaySystemOauthTokenRequest; use alipayapi\aop\request\AlipayUserInfoShareRequest; use alipayapi\aop\request\AlipayUserUserinfoShareRequest; /** * Class Alipay * @package app\service\controller * @note 該控制器是做支付寶第三方登入的 */ class Alipay extends Base{ private $appid; private $rsaPrivateKey; //應用金鑰 private $alipayrsaPublicKey; //支付寶公鑰 private $grantRedirect; //授權後回撥地址 private $aop; //操作第三方登入的類物件 public function __construct() { require("./extend/alipayapi/AopSdk.php"); $this->appid='2018111362173186'; $this->alipayrsaPublicKey='您的公鑰'; $this->rsaPrivateKey='您的私鑰'; //該回調地址必須和支付寶開發者平臺對應的應用設定的回撥地址一致 $this->grantRedirect='https://www.baidu.com/Alipay/getAlipayUseInfo'; /** * 該類是支付寶官方sdk方法 */ $this->aop = new AopClient(); $aop=$this->aop; $aop->gatewayUrl = 'https://openapi.alipay.com/gateway.do'; $aop->appId = $this->appid; $aop->rsaPrivateKey = $this->rsaPrivateKey; $aop->alipayrsaPublicKey = $this->alipayrsaPublicKey; $aop->apiVersion = '1.0'; $aop->signType = 'RSA2'; $aop->postCharset='UTF-8'; $aop->format='json'; parent::__construct(); } /** * 動態建立二維碼 */ public function alipayCreateQRcode(){ $phone = input("param.phone");//接收電話號碼 $codeObj = new \qrcode\QRcode(); $url='https://www.baidu.com/Alipay/goQRcodefunc?mobile='.$phone;//url拼接電話號碼引數,準備只做二維碼 $dir = './public/qrcode/'; $size = 10; if(!is_dir($dir)){ @mkdir($dir,0777); } $createDirImg = $dir.$moblie.'_alipay.jpg';//生成的二維碼圖片的地址 $codeObj::png($url,$createDirImg,'L',$size,2);//生成二維碼 $msg['code'] = 10000; $msg['url'] = 'https://www.baidu.com'.substr($createDirImg,1,strlen($createDirImg));; $msg['mobile'] = $moblie; echo json_encode($msg);//返回二維碼地址 } /** * @note 掃二維碼跳轉到的方法 */ public function goQRcodefunc(){ $mobile=input("param.mobile");//接收二維碼傳過來的電話 $this->grantRedirect=urlencode($this->grantRedirect."?mobile=$mobile");//拼接授權回撥的地址,吧mobile傳過去 $url ="https://openauth.alipay.com/oauth2/publicAppAuthorize.htm?app_id={$this->appid}&scope=auth_user&redirect_uri={$this->grantRedirect}"; header("Location:".$url);//跳轉到下面的url拉起授權頁面 } /** *@note 根據傳過來的授權碼換取,授權的accessToken */ public function getAccess_token($code){ $request = new AlipaySystemOauthTokenRequest(); $request->setGrantType("authorization_code"); $request->setCode($code);//這裡傳入 code $result = $this->aop->execute($request); $responseNode = str_replace(".", "_", $request->getApiMethodName()) . "_response"; if(isset($result->$responseNode->access_token)&& !empty($result->$responseNode->access_token)){ return $result->$responseNode->access_token; }else{ $files = 'ali/'.date("Ymd").".txt"; $log = 'time:'.date('Y-m-d H:i:s').'---errsssssss code:'.$code.'---response:'.json_encode($result)."\n\n"; filePutContents($files,$log); } } /** * @param $code 根據傳過來的授權碼換取授權的使用者資訊 * @return array 返回使用者的資訊 * @throws \Exception */ public function getAlipayUserdata($code){ $access_token=$this->getAccess_token($code); $request_a = new AlipayUserInfoShareRequest(); $result_a = $this->aop->execute ($request_a,$access_token); //這裡傳入獲取的access_token $user_id = $result_a->alipay_user_info_share_response->user_id; //使用者唯一id $city = $result_a->alipay_user_info_share_response->city; //使用者城市 $province = $result_a->alipay_user_info_share_response->province; //使用者省份 $avatar = $result_a->alipay_user_info_share_response->avatar; //使用者頭像 $is_student_certified = $result_a->alipay_user_info_share_response->is_student_certified; $gender = $result_a->alipay_user_info_share_response->gender; //使用者性別 $user_type = $result_a->alipay_user_info_share_response->user_type; $user_status = $result_a->alipay_user_info_share_response->user_status; $is_certified = $result_a->alipay_user_info_share_response->is_certified; return array( 'user_id'=>$user_id, 'gender'=>$gender, 'city'=>$city, 'avatar'=>$avatar, 'nickname'=>'', 'province'=>$province, 'is_student_certified'=>$is_student_certified, 'user_type'=>$user_type, 'user_status'=>$user_status, 'is_certified'=>$is_certified ); } /** * *@note 授權後成功後回撥的地址方法 */ public function getAlipayUseInfo(){ $input = input('param.');//獲取傳過來的引數 $code = $input['auth_code']; $param=$this->getAlipayUserdata($code); //第三方資訊if(isset($param['user_id'])){ //此處是將資料儲存到資料庫的邏輯
//刪除二維碼圖片 $createDelImg = './public/qrcode/'.$moblie.'_alipay.jpg'; @unlink($createDelImg); echo '<h1 style="margin-top: 5rem; margin-bottom: 5rem; text-align: center;">繫結支付寶成功</h1>'; }else{ $msg['code'] = 405; $msg['msg'] = '伺服器繁忙,請稍後再繫結'; exit(json_encode($msg)); } } } ?>