小程序授权之支付宝(普通公钥)

众所周知啊,微信小程序是可以通过微信本身授权后再登录,平台可以拿到微信用的的账号相关信息,然后保存到数据库中,那么同理在支付宝小程序开发过程中,登录功能的设计也可以如此

最近在开发支付宝小程序,由于第一次开发,特此做下记录,用于后续学习使用,在刚开始的时候也遇到很多坑,在这里将遇到的坑都填好,供大家参考

废话不多说,直接上干货

1.创建小程序
首先进入支付宝开放文档,使用自己的支付宝登陆创建小程序
https://open.alipay.com/platform/home.htm.

小程序授权之支付宝(普通公钥)_第1张图片

2.小程序授权
创建完小程序之后,需要给予支付宝相应的获取会员基础信息的权限,点击自己创建的小程序进入小程序管理,在能力列表中添加相应权限

3.设置接口加密方式
右上角主账户 -> 密钥管理
在这里只是记录了一般情况来实现授权(未涉及资金方式),并不适用证书情况,查看证书情况
小程序授权之支付宝(普通公钥)_第2张图片

这里我模拟使用官方提供的支付宝密钥生成器生成密钥就行,步骤如下:
1.下载安装密钥生成器:https://opendocs.alipay.com/open/291/106097/

小程序授权之支付宝(普通公钥)_第3张图片
小程序授权之支付宝(普通公钥)_第4张图片
这里我们使用的是默认的配置就行,直接点击生成密钥,等几秒钟密钥生成后,点击上传公钥
我们的服务器会需要csr文件,直接点击获取csr文件获取,然后点击打开文件位置,将csr文件保存到服务器上面(后端验证签名和解密需要)。

这时我们就得到了密钥了,我们复制应用公钥回到上一步的接口加签方式页面。
将应用公钥复制粘贴,点击保存设置
如下图:
小程序授权之支付宝(普通公钥)_第5张图片

特别注意:
配置IP白名单和网关,白名单必须要设置 ,本地测试不用设置没有关系 ,但是如果小程序上传发布和设置成体验版的时候,必须要设置白名单,添加后端系统的域名地址,之前说可有可无在此声明一下,我在发布的时候没有设置白名单总是提示无权限访问,设置白名单:开发准备 》服务器设置》开发设置,至于网关和本地测试没有设置白名单的情况,暂时还没有注意到哪里需要设置,目前没有设置,后续如果有要用到的地方会再来更新博客,请读友们持续关注,或者有知道的朋友可以留言

4.获取支付宝唯一标识 userId
接入流程图
小程序授权之支付宝(普通公钥)_第6张图片
客户端获取 authcode

my.getAuthCode({
  scopes: 'auth_user', // 主动授权:auth_user,静默授权:auth_base。或者其它scope
  success: (res) => {
  
    if (res.authCode) {
      // 认证成功
      // 调用自己的服务端接口,让服务端进行后端的授权认证,并且利用session,需要解决跨域问题
      my.request({
        url: 'https://isv.com/auth', // 该url是您自己的服务地址,实现的功能是服务端拿到authcode去开放平台进行token验证
        data: {
          authcode: res.authCode,
        },
        success: () => {
          // 授权成功并且服务器端登录成功
        },
        fail: () => {
          // 根据自己的业务场景来进行错误处理
        },
      });
    }
  },
});

名词解释:
**auth_user:**主动授权
**auth_base:**静默授权
auth_base和auth_user参数详解具体内容请查看官方文档
https://opensupport.alipay.com/support/helpcenter/166/201602487709

注意:
1. 使用auth_base静默授权时,只能通过接口获取到userId的和accessToken,不能再通过accessToken去获取用户的基本信息,如果想获取用户的基本信息必须使用auth_user主动授权,通过button按钮经过用户确认之后才可以,否则会出现权限不足等问题
如果scope=auth_base,不添加其他任何权限,alipay.user.info.share报错“aop.invalid-auth-token(无效的访问令牌 )”。
因此如果要获取具体的会员信息,调用alipay.user.info.share,scope中必填auth_user。

2. 小程序这个接口下架了alipay.user.info.share接口,其他可以正常使用(官方解释,在此未做测试,感兴趣的朋友可以测试一下),如小程序需要获取用户信息,可以使用小程序接口my.getOpenUserInfo直接在小程序方就可以获取,无需通过后端解析
小程序授权之支付宝(普通公钥)_第7张图片

my.getOpenUserInfo获取信息
amxl



  
    请不要一进入小程序就弹框授权,建议先了解小程序的服务内容
    
  

js

onGetAuthorize(res) {
     my.getOpenUserInfo({
      fail: (res) => {
      },
      success: (res) => {
        let userInfo = JSON.parse(res.response).response // 以下方的报文格式解析两层 response
        console.log(userInfo)
      }
    });
    },

结果
小程序授权之支付宝(普通公钥)_第8张图片
具体详见官方文档: https://opendocs.alipay.com/mini/api/ch8chh

服务端获取 access_token
服务器端调用 alipay.system.oauth.token 接口换取授权访问令牌,开发者可通过获取到的 auth_code 换取access_token 和用户 ID。auth_code 作为换取 access_token 的票据,每次用户授权完成,回调地址中的 auth_code 将不一样,auth_cod 只能使用一次,一天未被使用自动过期,具体请参考官方文档
https://opendocs.alipay.com/apis/api_9/alipay.system.oauth.token

public Map InsuranceAlipayLogin(String authCode){
        //使用支付宝小程序的固定方法获取auth_code
            //String serverUrl, String appId, String privateKey, String format,String charset, String alipayPublicKey, String signType
            //实例化客户端 参数:正式环境URL,Appid,商户私钥 PKCS8格式,字符编码格式,字符格式,支付宝公钥,签名方式
            AlipayClient alipayClient = new DefaultAlipayClient(GATEWAY
                    ,APPID,PRTVATE_KEY,
                    "json",
                    "UTF-8",
                    ALIPAY_PUBLIC_KEY,
                    "RSA2");
            AlipaySystemOauthTokenRequest request = new AlipaySystemOauthTokenRequest();
            // 值为authorization_code时,代表用code换取
            request.setGrantType(GRANT_Type);
            //授权码,用户对应用授权后得到的
            request.setCode(authCode);
            //这里使用execute方法
            AlipaySystemOauthTokenResponse response = null;
        try {
            response = alipayClient.execute(request);
        } catch (AlipayApiException e) {
            log.error("获取支付宝用户信息错误", e);
            e.printStackTrace();
        }
            //刷新令牌,上次换取访问令牌时得到。见出参的refresh_token字段
            request.setRefreshToken(response.getAccessToken());
            //返回成功时 就将唯一标识返回
            if(response.isSuccess()){
                System.out.println("调用成功");
                //我这里只返回了一个字段给前端用
                Map map=new HashMap<>();
                map.put("userid", response.getUserId());
                return map;
            } else {
                return null;
            }
        }

名词解释:

GATEWAY:支付宝网关
APPID:小程序APPID
PRTVATE_KEY:应用私钥
json:参数格式
utf-8:编码格式(也可以为GBK
ALIPAY_PUBLIC_KEY:支付宝公钥(注:此处是支付宝公钥不是应用公钥,千万别搞混
RSA2:加密方式(可以为RSA等,具体看加签是使用哪种方式
authCode: 前端获取的code
GRANT_Type:值为authorization_code表示用code获取
accessToken:可以获取,上面代码未获取

认证成功 把 userId&token 保存到 session 中,在 session 有效期内就不需要每次都走授权平台进行验证
注意 如果仅是为了授权或获取用户 ID,那么到此授权结束

5.获取支付宝用户信息
获取支付宝用户信息,需要在上一步的基础上,通过accessToken获取

// 获取支付宝用户信息
    private AlipayUserInfoShareResponse getAliUserInfo (String accessToken) throws Exception {
        AlipayClient alipayClient = new DefaultAlipayClient(GATEWAY,
                APPID,                    // 1. 填入appid
                PRIVATE_KEY,            // 2. 填入私钥 
                "json", 
                "GBK", 
                ALIPAY_PUBLIC_KEY,         // 3. 填入公钥
                "RSA2");
        AlipayUserInfoShareRequest request = new AlipayUserInfoShareRequest();
        AlipayUserInfoShareResponse response = alipayClient.execute(request, accessToken);
        if(response.isSuccess()){
            System.out.println("获取会员信息 - 调用成功");
            return response;
        }

        return null;
    }

当然你也可以直接在一个方法中进行,获取到accessToken之后直接解析会员基本信息

注意:
在做测试时,支付宝开发工具的小程序必须选择APPID对应的小程序
小程序授权之支付宝(普通公钥)_第9张图片
否则会出现APPID参数错误的问题,刚开始没注意这个,浪费了很多时间

计划
后续会发布小程序获取手机号码,支付宝支付,支付宝退款以及微信的一些功能博文,感兴趣的朋友可以关注下

如有问题,欢迎留言!

你可能感兴趣的:(java,支付宝小程序,小程序)