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

<?php
namespace AliPaySdk;
class Autoloader
{
    /**
     * 类库自动加载,写死路径,确保不加载其他文件。
     * @param string $class 对象类名
     * @return void
     */
    public static function autoload($class)
    {
        $name = $class;
        if (false !== strpos($name, '\\')) {
            $name = strstr($class, '\\', true);
        }

        $filename = AOP_AUTOLOADER_PATH . "/aop/" . $name . ".php";
        if (is_file($filename)) {
            include $filename;
            return;
        }

        $filename = AOP_AUTOLOADER_PATH . "/aop/request/" . $name . ".php";
        if (is_file($filename)) {
            include $filename;
            return;
        }
    }
}
spl_autoload_register('Autoloader::autoload');

接下来,打开项目中的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)
{

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,193评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,306评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,130评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,110评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,118评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,085评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,007评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,844评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,283评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,508评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,667评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,395评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,985评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,630评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,797评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,653评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,553评论 2 352