背景

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;

}

代码总览

// 使用 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 第三方登录获取用户信息...相关推荐

  1. 微信小程序授权登录获取用户信息详解

    今天来说一下微信小程序的授权登录获取用户信息,首先我们看微信提供的小程序开发文档: https://blog.csdn.net/qq_41971087/article/details/82466647 ...

  2. Spring boot 项目(十三)——实现微信公众号授权登录获取用户信息

    引言 微信公众号开发中,必不可少的一环:公众号授权登录.获取微信用户信息 前期准备 内网渗透=>生成本地指定端口映射的外网域名 链接:内网渗透工具natapp使用详解 域名生成之后修改yml文件 ...

  3. Android之QQ授权登录获取用户信息

    有时候我们开发的app需要方便用户简单登录,可以让用户使用自己的qq.微信.微博登录到我们自己开发的app. 今天就在这里总结一下如何在自己的app中集成QQ授权登录获取用户信息的功能. 首先我们打开 ...

  4. 微信小程序开发之——用户登录-获取用户信息(5),意外收获字节跳动内部资料

    {{userInfo.nickName}} {{userInfo.city}} {{userInfo.gender0?"未知":userInfo.gender1?"男&q ...

  5. php支付宝第三方授权,原生 PHP 实现支付宝 App 第三方登录获取用户信息,_PHP_ 少侠科技...

    详细内容 背景 App 项目要求实现第三方 微信 和 支付宝 登录,微信可以直接在 App 端完成认证拿到用户信息,支付宝则需要后端获取. 流程 1.服务端先拿到 App 端 调用 支付宝 SDK 所 ...

  6. H5网页使用支付宝授权登录获取用户信息详解

    用户信息授权 用户信息授权主要是为了获取支付宝用户ID(USER_ID).授权令牌(access_token),便于开发者处理自身业务逻辑的时候使用,例如:获取支付宝用户信息.发会员卡.快捷登录等.授 ...

  7. 微信第三方登陆,无需注册一键登录,获取用户信息,PHP实现方法

    今天讲讲利用微信oauth2实现第三方登陆的实现方法. 先说说前提吧! 首先你得是服务号,并且是经过认证的.这样微信会给你很多第三方接口的权限,如果是订阅号或者没有认证的服务号那就不用想了! 一开始你 ...

  8. java实现微信公众号授权登录获取用户信息(一)

    参考文章:https://blog.csdn.net/Santiago_M/article/details/79109154 : https://www.cnblogs.com/jilu/p/6123 ...

  9. 支付宝 APP登录 获取用户信息 PHP

    支付宝APP登录服务端流程如下: 1.换取授权访问令牌 2.查询用户信息 APP调用sdk组装授权登录请求(系统交互流程),成功后,支付宝会返回 auth_code,利用此 auth_code 请求 ...

  10. 微信公众号的二次开发(三、接收事件推送获取用户信息)

    在上篇<微信公众号的二次开发(二 自定义菜单的创建)>中我们介绍了自定义菜单的创建.本篇文章将介绍如何通过接收事件推送来获取用户信息.首先我们阅读官方文档: 根据官方文档的介绍 微信公众号 ...

最新文章

  1. redis集群 + 哨兵 + zookeeper_技术干货 | Redis的哨兵和集群
  2. 2020年考证时间表汇总!这些证书值得拥有!
  3. linux调试工具kdbg,Linux下图形化调试工具: kdbg, Affinic
  4. Aptana studio 3汉化教程
  5. python爬虫从小白到高手 Day1 爬取百度音乐歌单
  6. currenthashmap扩容原理_HashMap 深入解析(二)
  7. IntelliJ IDEA开发工具插件GsonFormat插件安装使用
  8. 【Code】浅谈Pascal转C++
  9. Yate学习--基于Windows安装和运行Yate
  10. java怎么画八卦图_八卦图怎么画 最正确的八卦图
  11. 51单片机温度传感器DS18B20
  12. google-auto之自动生成组件化文件
  13. 【愚公系列】2022年10月 微信小程序-电商项目-微信支付小程序确认支付结果和退款功能实现(node)
  14. 长安链ChainMaker基于公钥用户标识的身份模式介绍
  15. [渝粤教育] 西安交通大学 环境工程设计与管理 参考 资料
  16. 6-使用VMWARE虚拟机调试XPE的方法
  17. 浙江台州“安乐死”案承办法官首次披露庭审细节
  18. PS动作组织工具:ActionStation2 for mac
  19. sub html编辑器,目前前端开发必备编辑器有哪几款呢?
  20. 盘点企业生产管理软件的四大优势

热门文章

  1. python全角数字_用Python转换一些常见全角字符为半角
  2. 深度相机---(6)国内深度相机厂家介绍
  3. VS2019 项目过大的缓解方法
  4. 2021年度总结-天总会亮的
  5. 摩擦纳米发电机首次实现对驾驶行为的无干扰测试
  6. esp8266学习笔记③:GPIO模块
  7. 信息系统项目管理师常见考点汇总
  8. Nginx配置proxy代理服务器缓存
  9. 高级同步器:倒计时门闩
  10. 虹科分享|基于CAN/CAN FD技术的机器狗是什么样的?