支付宝网页授权登录

沙箱环境
网页授权获取 auth_code 官方文档
获取 access_token 和 userId 官方文档
获取用户信息官方文档
SDK 下载地址
APPID获取地址
支付宝生活号注册

<dependency>
    <groupId>com.alipay.sdk</groupId>
    <artifactId>alipay-sdk-java</artifactId>
    <version>4.11.66.ALL</version>
</dependency>

实现流程:

  1. 判断是否是支付宝浏览器访问
  2. 拼接 Url 获取 auth_code
  3. 用 auth_code 获取 access_token 和 userId
  4. 用 access_token 获取 支付宝用户信息

一、浏览器限制

if (/alipay/i.test(navigator.userAgent)){
  window.localStorage.setItem('PayType', "AliPay");
  next()
} else {
  Toast("请使用支付宝浏览器打开页面")
  return
}

二、页面授权获取 auth_code

var url = window.localStorage.getItem("AlipayAuthorizeUrl");
var code = this.GetUrlParame("auth_code"); // 截取code
if (!code) {
  //  如果没有code,说明用户还没授权
  window.localStorage.setItem("beforeAuthUrl", url) // 保存在授权之前进入页面的路由
  let appID = ""; // 你的 APPId
  let redirectUrl = ""; // 获取到 auth_code 后的回调地址

  let authorizeUrl =
    `https://openauth.alipaydev.com/oauth2/publicAppAuthorize.htm?app_id=${appID}&scope=auth_userinfo&redirect_uri=` +
    `${encodeURIComponent(
      redirectUrl
    )}`;
  window.location.href = authorizeUrl; // 跳转微信链接获取code
} else {
  // 有code,说明用户点击了授权  将获取到的code传递给后台,换取xtoken、用户信息、和userid
  http.post("p-alipayUserId-query", { code: code }).then(res => {
    if (res.code == "ok") {
      console.log(res)
       
    } else {
      Toast(res.message);
    }
  });
}

说明:scope 有两个参数,auth_userinfo 和 auth_base
auth_base:以 auth_base 为 scope 发起的网页授权,是用来获取进入页面的用户的 userId 的,并且是静默授权并自动跳转到回调页的。用户感知的就是直接进入了回调页(通常是业务页面)。
auth_userinfo:以 auth_userinfo 为 scope 发起的网页授权,是用来获取用户的基本信息的(比如头像、昵称等)。但这种授权需要用户手动同意,用户同意后,就可在授权后获取到该用户的基本信息。

截取 auth_code

// URL地址: http:xxxx/?code=xxx&state=xxx#/
// 截取code
GetUrlParame(parameName) {
  /// 获取地址栏指定参数的值
  // 获取url中跟在问号后面的部分
  var parames = window.location.search;
  // 检测参数是否存在
  if (parames.indexOf(parameName) > -1) {
    var parameValue = "";
    parameValue = parames.substring(
      parames.indexOf(parameName),
      parames.length
    );
    // 检测后面是否还有参数
    if (parameValue.indexOf("&") > -1) {
      // 去除后面多余的参数, 得到最终 parameName=parameValue 形式的值
      parameValue = parameValue.substring(0, parameValue.indexOf("&"));
      // 去掉参数名, 得到最终纯值字符串
      parameValue = parameValue.replace(parameName + "=", "");
      return parameValue;
    }
    return "";
  }
}

三、根据 auth_code 获取 useId 和 access_token

String code = ""; // 来自第二步的 auth_code
String gatwayUserIdUrl = "https://openapi.alipaydev.com/gateway.do"; // 沙箱账号测试接口,正式接口为:https://openapi.alipay.com/gateway.do
String private_key = "";  // 你的私钥,用于签名,获取方式见 步骤五
String alipay_public_key = ""; // 支付宝公钥,用于验签,获取方式见 步骤五
String appId = ""; // 你的 appid

AlipayClient alipayClient = new DefaultAlipayClient(gatwayUserIdUrl,appId,private_key,"json","UTF-8",alipay_public_key,"RSA2");
//使用 auth_code 换取接口 access_token
AlipaySystemOauthTokenRequest request = new AlipaySystemOauthTokenRequest();
request.setGrantType("authorization_code");
request.setCode(code);
try {
    AlipaySystemOauthTokenResponse tokenResponse = alipayClient.execute(request);
    if(tokenResponse.isSuccess()){
        logger.info("AccessToken"+tokenResponse.getAccessToken());
    } else {
        logger.error("access_token 获取失败");
    }

} catch (AlipayApiException e) {
    logger.error("access_token 获取失败"+e.getErrMsg(),e);
}

四、根据 access_token 获取用户信息(获取 auth_code 时 scope 必须为auth_userinfo )

AlipayUserInfoShareRequest userInfoShareRequest = new AlipayUserInfoShareRequest();
try {
    AlipayUserInfoShareResponse userInfoShareResponse = alipayClient.execute(userInfoShareRequest,tokenResponse.getAccessToken());
    if(userInfoShareResponse.isSuccess()){
        logger.info("调用成功");
    } else {
        logger.error("调用失败");
    }
} catch (AlipayApiException e) {
    e.printStackTrace();
}

五、获取私钥和支付宝公钥(以沙箱环境为例):

下载密钥工具
注:用来签名私钥与上传的公钥必须是对应的,否则支付宝会验签失败

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

六、附
报错:DK已默认开启SSL服务端证书校验,请确认本地JRE默认自带的CA证书库是否正确
原因:Java环境缺少CA证书库
解决方案
1、JRE安装环境受损导致缺少CA证书库,建议重新安装JRE包后再做测试
2、关闭ssl服务端证书校验:可通过在接口的调用方法内添加 WebUtils.setNeedCheckServerTrusted(false);方法进行关闭

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
对于uniapp的HTML5支付,可以使用支付宝的JSAPI接口来实现。具体步骤如下: 1. 在支付宝开放平台上创建应用,并获取到应用的APPID和应用私钥。 2. 引入支付宝JSAPI的SDK文件。 3. 调用支付宝JSAPI的方法进行支付,例如: ``` AlipayJSBridge.call("tradePay", { tradeNO: "1234567890", // 支付宝订单号 }, function(result) { // 支付结果回调函数 }); ``` 对于uniapp的支付宝小程序支付,可以使用uniapp的uni.request方法调用支付宝小程序的支付API。具体步骤如下: 1. 在支付宝开放平台上创建小程序,并获取到小程序的APPID和应用私钥。 2. 在uniapp中使用uni.request方法调用支付宝小程序的支付API,例如: ``` uni.request({ url: 'alipays://platformapi/startapp?appId=xxxx&orderInfo=xxxx&sign=xxxx', success: function(res) { // 支付结果回调函数 } }); ``` 对于支付宝端的H5支付和用户授权,可以使用支付宝网页授权API和支付API。具体步骤如下: 1. 在支付宝开放平台上创建应用,并获取到应用的APPID和应用私钥。 2. 在网页中使用支付宝网页授权API获取用户授权,例如: ``` https://openauth.alipay.com/oauth2/publicAppAuthorize.htm?app_id=xxxx&scope=auth_user&redirect_uri=xxxx ``` 3. 在网页中使用支付宝的支付API进行支付,例如: ``` https://openapi.alipay.com/gateway.do?app_id=xxxx&method=alipay.trade.page.pay&charset=utf-8&sign_type=RSA2&timestamp=xxxx&version=1.0&biz_content=xxxx&sign=xxxx ``` 其中,biz_content是支付的具体参数,需要根据实际情况进行设置。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值