Laravel /Lumen实现支付宝小程序授权登录

疫情期间,哪也不能去,在家让尝试把现有的一个微信小程序移植到支付宝上去。移植很顺利,微信小程序使用微信授权登录,支付宝看文档也有相同的功能,那就尝试实现吧。本以为很快就可以实现没想的最终花的时间还不少。

第一步,下载服务器端SDK,因为我的后端是基于lumen开发的,所以下载PHP版。 支付宝SDK下载

下载后,解压后发现,其实代码实现形式不是lumen的命名空间的写法,需要做一些定制修改。在项目app下,新建一个叫libs的目录,名称随便起,将sdk放到libs目录下。


20200216095217.jpg

开始准备实现autoload,在alipay-sdk目录下添加autoload.php

if (!defined("AOP_AUTOLOADER_PATH"))
{
    define("AOP_AUTOLOADER_PATH", dirname(__FILE__));
}

/**
* 注册autoLoader,此注册autoLoader只加载aop文件
* 不要删除,除非你自己加载文件。
**/
require("Autoloader.php");

再添加Autoloader.php

接下来,打开项目中的composer.json文件, 在autoload->classmap下添加sdk目录路径

"autoload": {
    "psr-4": {
        "App\\": "app/"
    },
    "files": ["app/helpers.php"],
    "classmap": ["app/libs/alipay-sdk"]
}

最后一步,执行composer dumpautoload,基本完成sdk的autoload。

为了防止sdk类对全局类的冲突,我对sdk中的加了namespace,可以根据自己的需要决定是否需要使用。如果在使用过程中出现找不到类的问题,例如:使用Exception类,需要改成\Exception,不然会找不到类。

if (strcasecmp($this->fileCharset, $this->postCharset)) {
    throw new \Exception("文件编码:[" . $this->fileCharset . "] 与表单提交编码:[" . $this->postCharset . "]两者不一致!");
}

下面开始通过SDK上实现授权登录,这个是通过证书来实现,代码如下:

$aop            = new AopCertClient();
$appCertPath    = "应用证书路径(要确保证书文件可读),例如:/home/admin/cert/appCertPublicKey.crt";
$alipayCertPath = "支付宝公钥证书路径(要确保证书文件可读),例如:/home/admin/cert/alipayCertPublicKey_RSA2.crt";
$rootCertPath   = "支付宝根证书路径(要确保证书文件可读),例如:/home/admin/cert/alipayRootCert.crt";

$aop->gatewayUrl              = 'https://openapi.alipay.com/gateway.do';
$aop->appId                   = 'your app id';
$aop->rsaPrivateKey           = 'your rsa private key';
$aop->alipayrsaPublicKey      = $aop->getPublicKey($alipayCertPath); //调用getPublicKey从支付宝公钥证书中提取公钥
$aop->apiVersion              = '1.0';
$aop->signType                = 'RSA2';
$aop->postCharset             = 'utf-8';
$aop->format                  = 'json';
$aop->isCheckAlipayPublicCert = true; //是否校验自动下载的支付宝公钥证书,如果开启校验要保证支付宝根证书在有效期内
$aop->appCertSN               = $aop->getCertSN($appCertPath); //调用getCertSN获取证书序列号
$aop->alipayRootCertSN        = $aop->getRootCertSN($rootCertPath); //调用getRootCertSN获取支付宝根证书序列号

$token_request = new AlipaySystemOauthTokenRequest();
$token_request->setCode($request->input('code')); //前端传来的auth code
$token_request->setGrantType("authorization_code");
$response = $aop->execute($token_request);

if (isset($response->alipay_system_oauth_token_response)) {
    $user_id = $response->alipay_system_oauth_token_response->user_id; //这是就是我们需要的用户id了
}

这样后端部分基本完成了,整合过程序中可以会遇到类找不到,直接修改类的引用,如果出现方法重复定义,我这边就遇到了AopEncrypt.php里的方法重复定义,例如加密方法encrypt, 我本地也有这个的全局方法,这里我改成ali_encrypt, 在所有调用的地方也做了修改。解密的方法也做了同样的处理。

/**
 * 加密方法
 * @param string $str
 * @return string
 */
function encrypt($str, $screct_key)
{
    ······
//改为下面的方法
function ali_encrypt($str, $screct_key)
{

小吐槽一下,阿里的文档写的不少,但真的有点乱,这个东西在文档里真的不好找,最终还是通过百度的找到的对应的方法。

你可能感兴趣的:(Laravel /Lumen实现支付宝小程序授权登录)