小程序授权之支付宝(证书模式)

最近有点忙,一直没有更新支付宝如何利用证书模式来进行授权的,今天正好有点时间,对支付宝证书模式授权做一下记录,前段时间,我在一篇博文中说明了支付宝普通公钥如何进行授权,在此,一些创建小程序,配置问题不再细作说明,感兴趣的朋友可以查看小程序授权之支付宝(普通公钥)

证书模式相较于普通公钥模式安全性更高,对此,官方做了明确说明,在需要调用资金变动类接口时必须使用证书模式,可以根据业务需求选择相应的模式
1.下载安装密钥生成器
在下图中选择生成密钥之后,需要获取CSR文件,而不是上传公钥
在这里插入图片描述
在这里插入图片描述
之后,将获取的CSR文件上传到证书模式的加签方式中
在这里插入图片描述
这样就获取到了授权需要的证书

2.关键代码,前端获取授权码可以查看小程序授权之支付宝(普通公钥)
这里之写了证书授权的关键部分

授权公共类


 public AlipayClient AlipayAuthorization() {
        /* 初始化 **/
        CertAlipayRequest certAlipayRequest = new CertAlipayRequest();
        /* 支付宝网关 **/
        certAlipayRequest.setServerUrl(alipayConfig.getGateway());
        /* 应用id,如何获取请参考:https://opensupport.alipay.com/support/helpcenter/190/201602493024 **/
        certAlipayRequest.setAppId(alipayConfig.getAppId());
        /* 应用私钥, 如何获取请参考:https://opensupport.alipay.com/support/helpcenter/207/201602471154?ant_source=antsupport **/
        certAlipayRequest.setPrivateKey("应用私钥");
        /* 应用公钥证书路径,下载后保存位置的绝对路径 **/
        certAlipayRequest.setCertPath("应用公钥证书路径,下载后保存位置的绝对路径");
        /* 支付宝公钥证书路径,下载后保存位置的绝对路径 **/
        certAlipayRequest.setAlipayPublicCertPath("支付宝公钥证书路径,下载后保存位置的绝对路径");
        /* 支付宝根证书路径,下载后保存位置的绝对路径 **/
        certAlipayRequest.setRootCertPath("支付宝根证书路径,下载后保存位置的绝对路径");
        /* 设置签名类型 **/
        certAlipayRequest.setSignType("RSA2");
        /* 设置请求格式,固定值json **/
        certAlipayRequest.setFormat("json");
        /* 设置编码格式 **/
        certAlipayRequest.setCharset("UTF-8");
        AlipayClient alipayClient = null;
        try {
            alipayClient = new DefaultAlipayClient(certAlipayRequest);
        } catch (AlipayApiException e1) {
            e1.printStackTrace();
        }
        return alipayClient;
    }

证书授权获取userId

  public AlipaySessionDTO InsuranceAlipayLoginCertificate(String authCode){
        //调用支付宝授权公共类
        AlipayClient alipayClient = alipayAuthorization.AlipayAuthorization();

        /** 实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称alipay.system.oauth.token(换取授权访问令牌) **/
        AlipaySystemOauthTokenRequest request = new AlipaySystemOauthTokenRequest();
        /*
         * 值为authorization_code时,代表用code换取;值为refresh_token时,代表用refresh_token换取
         */
        request.setGrantType(alipayConfig.getGrantType());
        /* 授权码,用户对应用授权后得到,可参考文档:https://opendocs.alipay.com/open/284/web */
        request.setCode(authCode);
        /* 刷新令牌,上次换取访问令牌时得到。见出参的refresh_token字段 **/
        //request.setRefreshToken("");
        /*第三方调用(服务商模式),传值app_auth_token后,会收款至授权token对应商家账号,如何获传值app_auth_token请参考文档:https://opensupport.alipay.com/support/helpcenter/79/201602494631 **/
        //request.putOtherTextParam("app_auth_token", "传入获取到的app_auth_token值");
        AlipaySystemOauthTokenResponse response = null;
        try {
            response = alipayClient.certificateExecute(request);
        } catch (AlipayApiException e) {
            e.printStackTrace();
        }

        if (response.isSuccess()){
            AlipaySessionDTO sessionDto = new AlipaySessionDTO();
            sessionDto.setUserId(response.getUserId());
            return sessionDto;
        }
        return  null;
      }

业务层

public ResponseResult alipayLogin(String authCode){
        //获取授权返回的数据
        AlipaySessionDTO sessionDto = alipayLoginCertificate.InsuranceAlipayLoginCertificate(authCode);
        String userId = sessionDto.getUserId();
        if (StringUtils.isNotEmpty(userId) && StringUtils.isNotBlank(userId)){
            InsuranceMemberDO memberDO = insuranceMemberDao.getListByUserId(userId);
            if (memberDO == null){
                //说明新用户
                memberDO = new InsuranceMemberDO();
                memberDO.setUserId(userId);
                memberDO.setStatus(1);
                memberDO.setAuth(1);
                memberDO.setAddTime(new Date());
                insuranceMemberDao.save(memberDO);
            }
            return new ResponseData<>(CommonCode.SUCCESS, memberDO);
        }
        return new ResponseData<>(CommonCode.FAIL, "登录失败");
    }

这里只是获取到userId,如需获取其他用户信息查看小程序授权之支付宝(普通公钥)

如有疑问,欢迎留言

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值