PHP实现支付宝小程序登陆

接入流程

前言

采用TP5.1的框架实现,我知道这里会有很多的坑,在开发这个之前,我就写了两篇前奏,因为这个登录需要一些参数,这个和微信小程序的不太一样

获取code

首先我们需要调用my.getAuthCode接口获取code,然后传给服务端

首先登录一下支付宝开发者工具

首先我们写一个简单的发送code的demo,这个在官网里面有https://opendocs.alipay.com/mini/api/openapi-authorize

后面我这里改了一下js里面的

Page({

  onLoad() {},

  data: {},

  getAuthCode: () => {

    my.getAuthCode({

      scopes: 'auth_user',

      success: (res) => {

        console.log(res.authCode);

        // my.alert({        //  content: res.authCode,        // });        let code = res.authCode

        console.log(res);

        my.request({

            url: 'http://localhost/ttft_2/public/api/v1/getcodeali',

            data: code,

            method: 'POST',

            success: (mes) => {

              console.log(mes);

            }

        });

      },

    });

  },

});

但是这里面又发现了一个坑,不能使用http的请求,因此我们需要在服务器上部署才行,这个口面再发一篇,这里先拿到code再说,注释一下代码,换成这样的

Page({

  onLoad() {},

  data: {},

  getAuthCode: () => {

    my.getAuthCode({

      scopes: 'auth_user',

      success: (res) => {

        console.log(res.authCode);

        my.alert({

          content: res.authCode,

        });

        // let code = res.authCode        // console.log(res);        // my.request({        //    url: 'http://localhost/ttft_2/public/api/v1/getcodeali',        //    data: code,        //    method: 'POST',        //    success: (mes) => {        //      console.log(mes);        //    }        // });      },

    });

  },

});

其他的就按照官网给的就行,然后我们点击获取授权码


会弹出这样的消息,在控制台中打印的可以复制

这样一来,code码到手了

把code码发给服务端

下载支付宝sdk还是给出地址https://docs.open.alipay.com/54/103419

下载好之后把aop文件放到项目的extend目录下

另外开发这个登录需要的参数我们要准备好,不知道的话,我的前一篇博客里面有

https://blog.csdn.net/qq_45163122/article/details/104148904

我把它写到配置文件当中,(一些公共的资料注意还是一律填写到配置文件当中,方便日后的维护和管理)

登录需要的就是以上的四个参数

然后开始写我们的方法

<?php

namespace app\api\model;

use think\facade\Env;

use think\Model;

require Env::get('root_path').'extend/aop/aopClient.php';

require Env::get('root_path').'extend/aop/request/AlipaySystemOauthTokenRequest.php';

class User extends Model

{

    public static function getCodeAli($param){

        $aop = new \aopClient();

        $aop->gatewayUrl = config('base.ali_gatewayUrl');

        $aop->appId = config('base.ali_app_id');

        $aop->rsaPrivateKey = config('base.ali_rsaPrivateKey');

        $aop->alipayrsaPublicKey = config('base.ali_alipayrsaPublicKey');

        $aop->apiVersion = '1.0';

        $aop->signType = 'RSA2';

        $aop->postCharset='utf-8';

        $aop->format='json';

        $request = new \AlipaySystemOauthTokenRequest();

        $request->setGrantType("authorization_code");

        $request->setCode($param['code']);

        //$request->setRefreshToken("201208134b203fe6c11548bcabd8da5bb087a83b");        $result = $aop->execute($request);

        return $result;

    }

}

就这样就可以登录了

这里再贴出支付宝的文档https://docs.open.alipay.com/api_9/alipay.system.oauth.token/

不过有个问题,难道我说登录就登录了吗?程序怎么会这么听话?当然不是,既然支付宝工具调试不了,那就使用api调试工具,我这里使用Postman

使用的是post请求,把我们的地址放进去,输入code,不过好像有点问题,因为我们的code码已经过期了需要重新获取,来,重新获取一个新的code

像这个就是正确的啦,现在服务器已经获取到了access_token这个参数,我们就要进行下一步操作了。

获取用户信息(不能再使用)

通过token接口调用支付宝会员查询接口获取会员信息

来,文档地址https://docs.open.alipay.com/api_2/alipay.user.info.share

上面我们获取的那个access_token是有有效期的,建议存到缓存当中

我们把程序改好了在试一次

<?php

namespace app\api\model;

use think\facade\Env;

use think\Model;

require Env::get('root_path').'extend/aop/aopClient.php';

require Env::get('root_path').'extend/aop/request/AlipaySystemOauthTokenRequest.php';

require Env::get('root_path').'extend/aop/request/AlipayUserInfoShareRequest.php';

class User extends Model

{

    /**

    * 支付宝获取code

    * @param $param

    * @return bool|mixed|\SimpleXMLElement

    * @throws \Exception

    */    public static function getCodeAli($param){

        $aop = new \aopClient();

        $aop->gatewayUrl = config('base.ali_gatewayUrl');

        $aop->appId = config('base.ali_app_id');

        $aop->rsaPrivateKey = config('base.ali_rsaPrivateKey');

        $aop->alipayrsaPublicKey = config('base.ali_alipayrsaPublicKey');

        $aop->apiVersion = '1.0';

        $aop->signType = 'RSA2';

        $aop->postCharset='utf-8';

        $aop->format='json';

        $request = new \AlipaySystemOauthTokenRequest();

        $request->setGrantType("authorization_code");

        $request->setCode($param['code']);

        //$request->setRefreshToken("201208134b203fe6c11548bcabd8da5bb087a83b");        $result = $aop->execute($request);

        //return $result;        $responseNode = str_replace(".", "_", $request->getApiMethodName()) . "_response";

        $accessToken= $result->$responseNode->access_token;

        return self::getUserInfoAli($accessToken);

    }

    /**

    * 获取支付宝用户信息

    * @param $accessToken

    * @return bool|mixed|\SimpleXMLElement

    * @throws \Exception

    */    public static function getUserInfoAli($accessToken){

        $aop = new \AopClient ();

        $aop->gatewayUrl = config('base.ali_gatewayUrl');

        $aop->appId = config('base.ali_app_id');

        $aop->rsaPrivateKey = config('base.ali_rsaPrivateKey');

        $aop->alipayrsaPublicKey = config('base.ali_alipayrsaPublicKey');

        $aop->apiVersion = '1.0';

        $aop->signType = 'RSA2';

        $aop->postCharset='utf-8';

        $aop->format='json';

        $request = new \AlipayUserInfoShareRequest ();

        $result = $aop->execute ( $request , $accessToken );

        return $result;

    }

}

提醒一下,这里code只能使用一次,使用一次之后就会失效

程序写好之后调用发现了一个惊喜,好吧,坑还是有的,按照他的来

提升开发权限

找到我们的小程序

一步一步来

调用,然后再次出错,陷入一阵。。。。。


获取用户信息改变

好吧既然如此,就上官网查看

它居然说不能使用了

通过前台调用用户接口

my.getOpenUserInfohttps://opendocs.alipay.com/mini/api/ch8chh

现在换一种思路,在小程序端查询信息存入到数据库中,

改了一下代码,我在这里贴出来

var app = getApp()

Page({

  data: {

    hasUserInfo: false

  },

  getUserInfo() {

    my.getAuthCode({

      scopes: 'auth_user',

      fail: (error) => {

        console.error('getAuthCode', error);

      },

      success: (res) => {

        let code = res.authCode;

        my.request({

          url: 'https://www.guizimo.top/demo/public/index.php/api/v1/getcodeali',

          method: 'POST',

          data:{

            code:code

          },

        });

        my.getAuthUserInfo({

          fail: (error) => {

            console.error('getAuthUserInfo', error);

          },

          success: (userInfo) => {

            console.log(`userInfo:`, userInfo);

            this.setData({

              userInfo,

              hasUserInfo: true,

            });

            my.request({

              url: 'https://www.guizimo.top/demo/public/index.php/api/v1/setuserinfoali',

              method: 'POST',

              data:{

                avatar:userInfo.avatar,

                nickName:userInfo.nickName

              },

              success: (result) => {

                console.log(result);

                my.alert({

                  content: '登录成功',

                });

              }

            });

          }

        });

      }

    });

  },

  clear() {

    this.setData({

      hasUserInfo: false,

      userInfo: {}

    })

  }

})

后台主要是存入信息,用了两个接口我把实现的方法写在下面

<?php

namespace app\api\model;

use think\Db;

use think\facade\Cache;

use think\facade\Env;

use think\Model;

require Env::get('root_path').'extend/aop/AopClient.php';

require Env::get('root_path').'extend/aop/request/AlipaySystemOauthTokenRequest.php';

class User extends Model

{

    /**

    * 支付宝获取code

    * @param $param

    * @return bool|mixed|\SimpleXMLElement

    * @throws \Exception

    */    public static function getCodeAli($param){

        //return $param;        $aop = new \aopClient();

        $aop->gatewayUrl = config('base.ali_gatewayUrl');

        $aop->appId = config('base.ali_app_id');

        $aop->rsaPrivateKey = config('base.ali_rsaPrivateKey');

        $aop->alipayrsaPublicKey = config('base.ali_alipayrsaPublicKey');

        $aop->apiVersion = '1.0';

        $aop->signType = 'RSA2';

        $aop->postCharset='utf-8';

        $aop->format='json';

        $request = new \AlipaySystemOauthTokenRequest();

        $request->setGrantType("authorization_code");

        $request->setCode($param['code']);

        //$request->setRefreshToken("201208134b203fe6c11548bcabd8da5bb087a83b");        $result = $aop->execute($request);

        //return $result;        $responseNode = str_replace(".", "_", $request->getApiMethodName()) . "_response";

        //$accessToken= $result->$responseNode->access_token;        $userid = $result->$responseNode->user_id;

        //return $userid;        return self::saveUserId($userid);

    }

    /**

    * 保存UserID到数据库

    * @param $userid

    * @return bool

    * @throws \think\db\exception\DataNotFoundException

    * @throws \think\db\exception\ModelNotFoundException

    * @throws \think\exception\DbException

    */    public static function saveUserId($userid){

        $res = UserAli::where('userid',$userid)->find();

        if($res){

            $Uid = $res['id'];

        }else{

            $Uid = Db::name('user_ali')->insertGetId(['userid'=>$userid]);

        }

        $result = Cache::set('Uid',$Uid);

        return $result;

    }

    /**

    * 保存好信息

    * @param $param

    * @return int|string

    * @throws \think\Exception

    * @throws \think\exception\PDOException

    */    public static function setUserInfoAli($param){

        $Uid = Cache::get('Uid');

        //return $Uid;        $res = UserAli::where('id',$Uid)

            ->update([

                'avatar' => $param['avatar'],

                'nickName' => $param['nickName']

            ]);

        return $res;

    }

}

演示

最后来演示一波,实在是太烦了,不过到现在又十分的简单了

在开发者工具中调用接口


注意这个两个接口的状态

说明调用没有什么大问题,后面还是搭建了一个环境来测试,不然每次登录都要来这里面获取,真的是很烦。

最后查看数据库,看看我们的数据是否存入成功了


现在就大功告成了

不过当然还有很多东西需要优化,支付宝的登录和微信小程序的登录有一些不太一样,后面也会写一篇关于微信小程序登录的。

参考链接:https://blog.csdn.net/qq_45163122/article/details/104185435

有什么问题或者项目咨询可以来我们官网咨询

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

推荐阅读更多精彩内容