一、 标题获取支付宝登录二维码
1、通过curl访问 https://auth.alipay.com/login/index.htm
2、获取源码中下面这四个参数
authcenter_querypwd_login、
authcenter_qrcode_login、
rds_form_token、
alieditUid
对应的参数值
3、组装代码串,保存起来,在第二步用到
// PHP代码
$body = "support=000001&needTransfer=&CtrlVersion=1,1,0,1&loginScene=index&redirectType=&personalLoginError=&goto=https://www.alipay.com/&errorVM=&sso_hid=&site=&errorGoto=&json_tk=&method=qrCodeLogin&logonId=&superSwitch=true&noActiveX=false&password_input=&password_rsainput=&J_aliedit_using=true&password=&J_aliedit_key_hidn=password&REMOTE_PCID_NAME=_seaside_gogo_pcid&_seaside_gogo_pcid=&_seaside_gogo_=&_seaside_gogo_p=&J_aliedit_prod_type=&security_activeX_enabled=false&J_aliedit_net_info=&checkCode=&idPrefix=&preCheckTimes=5&ua=&passwordSecurityId=web|authcenter_querypwd_login|".$authcenter_querypwd_login."&qrCodeSecurityId=web|authcenter_qrcode_login|".$authcenter_qrcode_login."&rds_form_token=".$rds_form_token."&J_aliedit_uid_hidn=alieditUid&alieditUid=".$alieditUid."";
4、组装登录链接,并生成二维码,给支付宝扫码
// A code block
$login_url = "https://qr.alipay.com/_d?_b=PAI_LOGIN_DY&securityId=web%257Cauthcenter_qrcode_login%257C".$authcenter_qrcode_login;
第一步完整PHP代码
public function get_alipay_qr(){
$header['referer'] = 'https://auth.alipay.com/';
$content = A('Cron')->request('https://auth.alipay.com/login/index.htm',false,$header);
preg_match('/value="web\|authcenter_querypwd_login\|(.*?)"/', $content, $temps);
$authcenter_querypwd_login = $temps[1];
preg_match('/value="web\|authcenter_qrcode_login\|(.*?)"/', $content, $temps);
$authcenter_qrcode_login = $temps[1];
S('sid',$authcenter_qrcode_login);
preg_match('#<input type="hidden" value="(.*?)" name="rds_form_token"/>#', $content, $temps);
$rds_form_token = $temps[1];
preg_match('#<input type="hidden" id="alieditUid" name="alieditUid" value="(.*?)" />#', $content, $temps);
$alieditUid = $temps[1];
$body = "support=000001&needTransfer=&CtrlVersion=1,1,0,1&loginScene=index&redirectType=&personalLoginError=&goto=https://www.alipay.com/&errorVM=&sso_hid=&site=&errorGoto=&json_tk=&method=qrCodeLogin&logonId=&superSwitch=true&noActiveX=false&password_input=&password_rsainput=&J_aliedit_using=true&password=&J_aliedit_key_hidn=password&REMOTE_PCID_NAME=_seaside_gogo_pcid&_seaside_gogo_pcid=&_seaside_gogo_=&_seaside_gogo_p=&J_aliedit_prod_type=&security_activeX_enabled=false&J_aliedit_net_info=&checkCode=&idPrefix=&preCheckTimes=5&ua=&passwordSecurityId=web|authcenter_querypwd_login|".$authcenter_querypwd_login."&qrCodeSecurityId=web|authcenter_qrcode_login|".$authcenter_qrcode_login."&rds_form_token=".$rds_form_token."&J_aliedit_uid_hidn=alieditUid&alieditUid=".$alieditUid."";
S('body_'.$authcenter_qrcode_login,$body);
$login_url = "https://qr.alipay.com/_d?_b=PAI_LOGIN_DY&securityId=web%257Cauthcenter_qrcode_login%257C".$authcenter_qrcode_login;
if($_REQUEST['test']){
$_REQUEST['data'] = $login_url;
$_REQUEST['name'] = time();
$_REQUEST['return'] = 1;
$login_img = A('Api')->curl_qrcode();
$login_img = str_replace('./','/',$login_img);
echo "<img src='".$login_img."' /><br>";
}
echo json_encode(['code' => 200 , 'msg' => '请使用手机支付宝扫码', 'url' => $login_url , 'sid' => $authcenter_qrcode_login]);
}
二、通过前端循环调用下面的方法,获取登录状态和cookie
public function get_alipay_cookie(){
$SecurityId = $_REQUEST['sid'];
$header['referer'] = 'https://auth.alipay.com/';
$content = A('Cron')->request("https://securitycore.alipay.com/barcode/barcodeProcessStatus.json?securityId=web%7Cauthcenter_qrcode_login%7C".$SecurityId."&_callback=light.request._callbacks.callback250",1,$header);
$first_cookie = implode('',$content['cookie']);
preg_match('#light.request._callbacks..*?\((.*?)\)#', $content['body'], $temps);
$rr = json_decode($temps[1],true);
$barcodeStatus = $rr['barcodeStatus'];
if($barcodeStatus=='waiting') $msg = "请使用手机支付宝扫码";
else if($barcodeStatus=='scanned') $msg = "已扫码,请确认";
else if($barcodeStatus=='confirmed') $msg = "获取支付宝cookie成功";
if($barcodeStatus =='confirmed') {
$body = S('body_'.$SecurityId);
$this->get_alipay_cookie_ok($body);
}
else
echo json_encode(['code' => 100 ,'msg'=>$msg, 'status' => $barcodeStatus ]);
}
//返回首页获取真正Cookie
public function get_alipay_cookie_ok($body=""){
header("Content-type:text/html;charset=utf-8");
$header['Accept'] = 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9';
$header['Accept-Encoding'] = 'gzip, deflate, br';
$header['Accept-Language'] = 'zh-CN,zh;q=0.9';
$header['User-Agent'] = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Safari/537.36';
$header['Content-Type'] = 'application/x-www-form-urlencoded';
$header['referer'] = 'https://auth.alipay.com/';
$header['Origin'] = 'https://auth.alipay.com';
$header['sec-ch-ua'] = '" Not A;Brand";v="99", "Chromium";v="96", "Google Chrome";v="96"';
$header['Connection'] = 'keep-alive';
$header['Host'] = 'authsa128.alipay.com';
$content = A('Cron')->request('https://auth.alipay.com/login/index.htm',1,$header,'post',$body);
$first_cookie = str_replace(' ','',implode('',$content['cookie']));
$response = A('Api')->strToUtf8($content['body']);
parse_str(str_replace(';','&',$first_cookie),$cookir_arr); //转数组
//拼接有价值的cookie
$real_cookie[] = "zone=".trim($cookir_arr['zone']);
$real_cookie[] = "ctoken=".trim($cookir_arr['ctoken']);
$real_cookie[] = "JSESSIONID=".trim($cookir_arr['JSESSIONID']);
$real_cookie[] = "ALIPAYJSESSIONID=".trim($cookir_arr['ALIPAYJSESSIONID']);
$real_cookie[] = "CLUB_ALIPAY_COM=".trim($cookir_arr['CLUB_ALIPAY_COM']);
$real_cookie_str = implode(";",$real_cookie).';';
$userId = trim($cookir_arr['CLUB_ALIPAY_COM']);
if($userId){
//userId已存在的判断逻辑,自己根据情况写
}
else{
echo json_encode(['code' => 200 ,'msg'=>'cookie格式有误,请重试' , 'cookie' => $real_cookie_str, 'userId'=>$userId]);
return;
}
echo json_encode(['code' => 200 ,'msg'=>'扫码成功,请保存cookie' , 'cookie' => $real_cookie_str, 'userId'=>$userId, 'tips'=>$tips]);
}
三、发送心跳包,确保cookie一直生效(把cookie通过curl调用支付宝首页即可) 下面是获得的cookie示例
zone=RZ42B;ctoken=Kf_t8tYiWip;JSESSIONID=6F6A0A83EE6981CEFE37544E51;ALIPAYJSESSIONID=RZLr3NBYAiHmIypRlPS4authRZ42;CLUB_ALIPAY_COM=2088***6;
四、通过cookie获取余额
public function balance_v3(){
$cookie = $_REQUEST['cookie']; //这个cookie就是上面获取到的cookie
set_time_limit(0);
$url="https://lab.alipay.com/user/assets/queryBalance.json";
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => $url,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => '',
CURLOPT_MAXREDIRS => 0,
CURLOPT_TIMEOUT => 15,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_HTTPHEADER => array(
'accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
'accept-language: zh-CN,zh;q=0.9,en;q=0.8',
'cache-control: max-age=0',
'Cookie: '.$cookie,
'dnt: 1',
'sec-ch-ua: " Not;A Brand";v="99", "Google Chrome";v="91", "Chromium";v="91"',
'sec-ch-ua-mobile: ?0',
'sec-fetch-dest: document',
'sec-fetch-mode: navigate',
'sec-fetch-site: none',
'sec-fetch-user: ?1',
'upgrade-insecure-requests: 1',
'user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.101 Safari/537.36',
'referer:https://auth.alipay.com/',
'Connection:keep-alive',
),
));
$response = curl_exec($curl);
$re = json_decode($response,true);
if($re['stat'] == 'ok'){
$balance = $re['availableAmount'];
$return = array(
'availableBalance'=>0, //可用余额
'frozenBalance'=>0, //冻结金额
'balance' =>$balance,
'userId'=>0, //支付宝uid
'ownerLogonId'=>0, //支付宝账号
'ownerName'=>0,//支付宝姓名
);
return $return;
}
}