php支付宝第三方授权,原生 PHP 实现支付宝 App 第三方登录获取用户信息,_PHP_ 少侠科技...
详细内容
背景
App 项目要求实现第三方 微信 和 支付宝 登录,微信可以直接在 App 端完成认证拿到用户信息,支付宝则需要后端获取。
流程
1、服务端先拿到 App 端 调用 支付宝 SDK 所需要的 infoStr
2、App 端 通过 infoStr 获得用户 授权 code
3、服务端通过 授权 code 拿到请求 token
4、服务端通过 token 获得用户信息
代码
在这之前,支付宝接口对接流程你应该有所了解。
1、创建 RSA2 方法:获得 sign:/**
* enRSA2 RSA加密
*
* @param String $data
* @return String
*/
private function enRSA2($data)
{
$str = chunk_split(trim($this->private_key), 64, "\n");
$key = "-----BEGIN RSA PRIVATE KEY-----\n$str-----END RSA PRIVATE KEY-----\n";
// $key = file_get_contents(storage_path('rsa_private_key.pem')); 为文件时这样引入
$signature = '';
$signature = openssl_sign($data, $signature, $key, OPENSSL_ALGO_SHA256)?base64_encode($signature):NULL;
return $signature;
}
2、创建一个 Get 参数拼接方法,保证符合支付宝加签字符串要求:/**
* myHttpBuildQuery
* 之所以不用 自带函数 `http_build_query`
* 是因为格式化的时间带有 ‘:’ 会被转换成十六进制 utf-8 码
*
* @param Array
* @return String
*/
private function myHttpBuildQuery($dataArr)
{
ksort($dataArr);
$signStr = '';
foreach ($dataArr as $key => $val) {
if (empty($signStr)) {
$signStr = $key.'='.$val;
} else {
$signStr .= '&'.$key.'='.$val;
}
}
return $signStr;
}
3、给到 APP 端需要的 infoStr:/**
* InfoStr APP登录需要的的infostr
*
* @return String
*/
public function infoStr()
{
$infoStr = http_build_query([
'apiname' => 'com.alipay.account.auth',
'method' => 'alipay.open.auth.sdk.code.get',
'app_id' => $this->app_id,
'app_name' => 'mc',
'biz_type' => 'openservice',
'pid' => $this->pid,
'product_id' => 'APP_FAST_LOGIN',
'scope' => 'kuaijie',
'target_id' => mt_rand(999, 99999), //商户标识该次用户授权请求的ID,该值在商户端应保持唯一
'auth_type' => 'AUTHACCOUNT', // AUTHACCOUNT代表授权;LOGIN代表登录
'sign_type' => 'RSA2',
]);
$infoStr .= '&sign='.$this->enRSA2($infoStr);
return $infoStr;
}
4、拿到用户信息:/**
* AlipayToken 获得用户 请求token, 通过它获得 用户信息
*
* 需要按照支付宝加签流程来。
*/
public function userInfo($app_auth_token)
{
$infoArr = [
'method' => 'alipay.system.oauth.token',
'app_id' => $this->app_id,
'charset' => 'utf-8',
'sign_type' => 'RSA2',
'timestamp' => date('Y-m-d H:i:s'),
'version' => '1.0',
'code' => $app_auth_token,
'grant_type' => 'authorization_code',
];
$signStr = $this->myHttpBuildQuery($infoArr);
$sign = urlencode($this->enRSA2($signStr));
$qureStr = $signStr.'&sign='.$sign;
$res = new Client();
$body = $res->get('https://openapi.alipay.com/gateway.do?'.$qureStr)->getBody()->getContents();
$body = json_decode($body);
if (!isset($body->alipay_system_oauth_token_response->access_token)) {
return '接口异常';
} else {
$autho_token = $body->alipay_system_oauth_token_response->access_token;
$userinfo = $this->aliPayUserInfo($autho_token);
return $userinfo; // 或则 返回 json_encode($userinfo) 根据实际需求来
}
}
/**
* AliPayUserInfo 通过 token 获取用户信息
*/
private function aliPayUserInfo($autho_token)
{
$infoArr = [
'method' => 'alipay.user.info.share',
'app_id' => $this->app_id,
'charset' => 'utf-8',
'sign_type' => 'RSA2',
'timestamp' => date('Y-m-d H:i:s'),
'version' => '1.0',
'auth_token' => $autho_token,
];
$signStr = $this->myHttpBuildQuery($infoArr);
$sign = urlencode($this->enRSA2($signStr));
$qureStr = $signStr.'&sign='.$sign;
$res = new Client();
$body = $res->get('https://openapi.alipay.com/gateway.do?'.$qureStr)->getBody()->getContents();
$body = json_decode($body);
if (!isset($body->alipay_user_info_share_response)) {
return '接口异常';
}
$body = $body->alipay_user_info_share_response;
return $body;
}
代码总览<?php
// 使用 Guzzle 做请求操作
use GuzzleHttp\Client;
// 支付宝APP 第三方登录
// 特点:相比微信,支付宝所有敏感信息都在服务端完成, 保证了安全
//
// 流程:
// 1.服务端到APP infoStr
// 2.APP端 通过infoStr 获得 auth_code
// 3.服务端通过 auth_code 拿到请求 token
// 4.服务端通过 token 获得用户信息
class AliPayUser{
protected $app_id = '支付宝app_id';
protected $pid = '支付宝pid';
protected $private_key = '你的私钥';
/**
* InfoStr APP登录需要的的infostr
*
* @return String
*/
public function infoStr()
{
$infoStr = http_build_query([
'apiname' => 'com.alipay.account.auth',
'method' => 'alipay.open.auth.sdk.code.get',
'app_id' => $this->app_id,
'app_name' => 'mc',
'biz_type' => 'openservice',
'pid' => $this->pid,
'product_id' => 'APP_FAST_LOGIN',
'scope' => 'kuaijie',
'target_id' => mt_rand(999, 99999), //商户标识该次用户授权请求的ID,该值在商户端应保持唯一
'auth_type' => 'AUTHACCOUNT', // AUTHACCOUNT代表授权;LOGIN代表登录
'sign_type' => 'RSA2',
]);
$infoStr .= '&sign='.$this->enRSA2($infoStr);
return $infoStr;
}
/**
* AlipayToken 获得用户 请求token, 通过它获得 用户信息
*
* 需要按照支付宝加签流程来。
*/
public function userInfo($app_auth_token)
{
$infoArr = [
'method' => 'alipay.system.oauth.token',
'app_id' => $this->app_id,
'charset' => 'utf-8',
'sign_type' => 'RSA2',
'timestamp' => date('Y-m-d H:i:s'),
'version' => '1.0',
'code' => $app_auth_token,
'grant_type' => 'authorization_code',
];
$signStr = $this->myHttpBuildQuery($infoArr);
$sign = urlencode($this->enRSA2($signStr));
$qureStr = $signStr.'&sign='.$sign;
$res = new Client();
$body = $res->get('https://openapi.alipay.com/gateway.do?'.$qureStr)->getBody()->getContents();
$body = json_decode($body);
if (!isset($body->alipay_system_oauth_token_response->access_token)) {
return '接口异常';
} else {
$autho_token = $body->alipay_system_oauth_token_response->access_token;
$userinfo = $this->aliPayUserInfo($autho_token);
return $userinfo; // 或则 返回 json_encode($userinfo) 根据实际需求来
}
}
/**
* AliPayUserInfo 通过 token 获取用户信息
*/
private function aliPayUserInfo($autho_token)
{
$infoArr = [
'method' => 'alipay.user.info.share',
'app_id' => $this->app_id,
'charset' => 'utf-8',
'sign_type' => 'RSA2',
'timestamp' => date('Y-m-d H:i:s'),
'version' => '1.0',
'auth_token' => $autho_token,
];
$signStr = $this->myHttpBuildQuery($infoArr);
$sign = urlencode($this->enRSA2($signStr));
$qureStr = $signStr.'&sign='.$sign;
$res = new Client();
$body = $res->get('https://openapi.alipay.com/gateway.do?'.$qureStr)->getBody()->getContents();
$body = json_decode($body);
if (!isset($body->alipay_user_info_share_response)) {
return '接口异常';
}
$body = $body->alipay_user_info_share_response;
return $body;
}
/**
* enRSA2 RSA加密
*
* @param String $data
* @return String
*/
private function enRSA2($data)
{
$str = chunk_split(trim($this->private_key), 64, "\n");
$key = "-----BEGIN RSA PRIVATE KEY-----\n$str-----END RSA PRIVATE KEY-----\n";
// $key = file_get_contents(storage_path('rsa_private_key.pem')); 为文件时这样引入
$signature = '';
$signature = openssl_sign($data, $signature, $key, OPENSSL_ALGO_SHA256)?base64_encode($signature):NULL;
return $signature;
}
/**
* myHttpBuildQuery 返回一个 http Get 传参数组
* 之所以不用 自带函数 http_build_query 时间带 ‘:’ 会被转换
*
* @param Array
* @return String
*/
private function myHttpBuildQuery($dataArr)
{
ksort($dataArr);
$signStr = '';
foreach ($dataArr as $key => $val) {
if (empty($signStr)) {
$signStr = $key.'='.$val;
} else {
$signStr .= '&'.$key.'='.$val;
}
}
return $signStr;
}
}
其它
1.注意:这份代码是从原有项目扒出来,主要是为有此需求的开发人员提供参考,并未测试是否能直接使用,请自行测试。
2.之所以不用支付宝 php_SDK,是因为需求有限:只获取用户的信息,没必要。
3.代码有不合理的地方还请提出来,大家互相学习。
php支付宝第三方授权,原生 PHP 实现支付宝 App 第三方登录获取用户信息,_PHP_ 少侠科技...相关推荐
- 微信小程序授权登录获取用户信息详解
今天来说一下微信小程序的授权登录获取用户信息,首先我们看微信提供的小程序开发文档: https://blog.csdn.net/qq_41971087/article/details/82466647 ...
- Spring boot 项目(十三)——实现微信公众号授权登录获取用户信息
引言 微信公众号开发中,必不可少的一环:公众号授权登录.获取微信用户信息 前期准备 内网渗透=>生成本地指定端口映射的外网域名 链接:内网渗透工具natapp使用详解 域名生成之后修改yml文件 ...
- Android之QQ授权登录获取用户信息
有时候我们开发的app需要方便用户简单登录,可以让用户使用自己的qq.微信.微博登录到我们自己开发的app. 今天就在这里总结一下如何在自己的app中集成QQ授权登录获取用户信息的功能. 首先我们打开 ...
- H5网页使用支付宝授权登录获取用户信息详解
用户信息授权 用户信息授权主要是为了获取支付宝用户ID(USER_ID).授权令牌(access_token),便于开发者处理自身业务逻辑的时候使用,例如:获取支付宝用户信息.发会员卡.快捷登录等.授 ...
- 支付宝 APP登录 获取用户信息 PHP
支付宝APP登录服务端流程如下: 1.换取授权访问令牌 2.查询用户信息 APP调用sdk组装授权登录请求(系统交互流程),成功后,支付宝会返回 auth_code,利用此 auth_code 请求 ...
- 微信第三方登陆,无需注册一键登录,获取用户信息,PHP实现方法
今天讲讲利用微信oauth2实现第三方登陆的实现方法. 先说说前提吧! 首先你得是服务号,并且是经过认证的.这样微信会给你很多第三方接口的权限,如果是订阅号或者没有认证的服务号那就不用想了! 一开始你 ...
- 微信小程序授权登录获取用户信息并保存至缓存用于下次登录
1.获取用户信息 wx.getUserProfile(Object object) 获取用户信息.页面产生点击事件(例如 button 上 bindtap 的回调中)后才可调用,每次请求都会弹出授权窗 ...
- java实现微信公众号授权登录获取用户信息(一)
参考文章:https://blog.csdn.net/Santiago_M/article/details/79109154 : https://www.cnblogs.com/jilu/p/6123 ...
- 微信小程序用户未授权bug解决方法,微信小程序获取用户信息失败解决方法
微信小程序开发交流qq群 173683895 承接微信小程序开发.扫码加微信. 正文: bug示例图: 导致这个bug的原因是 wx.getUserInfo(OBJECT) 接口做了调整: ...
最新文章
- 字符串或文件处理的一个可选流程
- mysql权限配置文件_MySQL权限管理、配置文件(三)
- python起步输入-第 4 节 小Python 起步
- linux查看主机端口进程命令
- 11. IDEA 在同一工作空间创建多个项目
- enum in c language
- 指针和const限定
- 分布式计算solutions
- Win2008 R2 VDI动手实验系列之八:远程桌面虚拟机终极测试
- sql查询前50条_您必须知道的前50条SQL查询
- 一个react项目案例01 组件部分
- Dump文件分析工具 - MAT图文解析
- 8000401a 因为配置标识不正确,系统无法开始服务器进程。请检查用户名和密码。
- 墨刀和axure使用经验分享
- java.sql. SQLException: No suitable driver found for jdbc :mysql://localhost:3306/test
- Java多线程并发面试
- ESXI 7.0 安装教程
- matlab计算铰接式履带车辆转向性能
- U812.0凭证冲销后前台不能删除问题
- html改变按钮水平位置,div中button水平居中