勤奋鸟旗下 软件定制开发 安全交付平台!一次合作,终身售后!全程项目经理一对一跟进测试!公司以自研团队结合搭档圈,为用户提供安全快速稳定的软件源码开发服务!

java实现支付宝授权登录

2024-09-04 17:20:52
复制链接

4775

授权登录 获取信息

支付宝相关准备

1.小程序的APPID

2.小程序接口加签

首先下载 支付宝开放平台开发助手 生成私钥和公钥

然后将应用公钥填写到小程序开发设置中进行加签

顺便在配置一下接口内容加密方式

最后在能力管理中添加相关能力


application.yml 配置文件

# 支付宝配置  https://open.alipay.com/
ali:
# 支付宝分配给开发者的应用ID
appId: 2021003127613788
# 商户私钥,您的 PKCS8 格式 RSA2 私钥 (使用 支付宝开放平台开发助手 生成的应用私钥)
merchantPrivateKey: MIICi.......7zph
# 支付宝公钥 (支付宝加签后得到的公钥)
alipayPublicKey: MIIB......AQAB
# 签名方式
signType: RSA2
# 字符编码格式
charset: UTF-8
# 字符编码格式
format: json
# 支付宝网关
gatewayUrl: https://openapi.alipay.com/gateway.do

配置类

@Data
@Component
@ConfigurationProperties(prefix = "ali")
public class AliPayProperty {

/** 支付宝APPID */
public String appId; /** 商户私钥,您的 PKCS8 格式 RSA2 私钥 (使用 支付宝开放平台开发助手 生成的应用私钥) */
public String merchantPrivateKey ;
/** 支付宝公钥,查看地址:https://openhome.alipay.com 对应 APPID 下的支付宝公钥。 */
public String alipayPublicKey;
/** 接口格式规范 */
public String format;
/** 签名方式 */
public String signType;
/** 字符编码格式 */
public String charset;
/** 支付宝网关 https://openapi.alipay.com/gateway.do 这是正式地址 */
public String gatewayUrl;

/** 支付宝客户端 */
public AlipayClient getAlipayClient(){
AlipayClient alipayClient = new DefaultAlipayClient(
this.gatewayUrl,
this.appId,
this.merchantPrivateKey,
this.format,
this.charset,
this.alipayPublicKey,
this.signType);
return alipayClient;
}
}

实体类

@Data
public class AlipayAuthUser implements Serializable {
private static final long serialVersionUID = 647188207421940004L;

/** 支付宝用户的userId */
private String userId;

/** 系统用户ID */
private Long sysUserId;

/** 用户头像地址 */
private String avatar;

/** 性别(F:M:) */
private String gender;

/** 昵称 */
private String nickName;

/** 省份 */
private String province;

/** 城市 */
private String city;

/** 创建时间 */
private Date createTime;

}

Controller

@RestController
public class AlipayController {

@Autowired
AliPayProperty aliPayProperty;

// 支付宝登录接口---支付宝小程序唤起登录后调用"
@GetMapping("/alipay/{authCode}")
public Object items(@PathVariable("authCode") String authCode) throws Exception {

System.out.println("授权码为: "+authCode);

AlipayAuthUser authUser = null;
// 1. 利用 授权码 authCode 获取 access_tokenuser_id
AlipaySystemOauthTokenResponse response = getAccessToken(authCode);
if (response.isSuccess()) {

/**
* 获取到用户信息后保存到数据库
* 1. 如果数据库不存在, 则注册
* 2. 如果存在,则获取数据库中的信息再返回
*/
String accessToken = response.getAccessToken();
String alipayUserId = response.getUserId();
System.out.println("accessToken: " + accessToken);
System.out.println("alipayUserId: " + alipayUserId);

// 2. ★★★这里是从数据库查询该用户是否存在的操作( 假设不存在---> null )
authUser = null;

if (authUser == null){
// 如果用户不存在,则通过支付宝api获取用户的信息后,再注册用户到自己平台数据库
AlipayUserInfoShareResponse aliUserInfo = getAliUserInfo(accessToken);
if (aliUserInfo != null) {
authUser = new AlipayAuthUser();
authUser.setUserId(alipayUserId);
authUser.setAvatar(aliUserInfo.getAvatar());
authUser.setNickName(aliUserInfo.getNickName());
authUser.setProvince(aliUserInfo.getProvince());
authUser.setCity(aliUserInfo.getCity());
authUser.setGender(aliUserInfo.getGender());

// ★★★这里应该进行数据库保存的逻辑( 这里直接打印输出查看 )
System.out.println("用户信息为: \n"+authUser);

}
}
}
if (authUser == null){
return "error";
}
return authUser;
}

/**
* 解密获取会员手机号
* 官方说明: https://opendocs.alipay.com/mini/api/getphonenumber
* 检验是否具有权限: https://open.alipay.com/api/check?examCode=E000001559
* */
@GetMapping("/getPhoneNumber")
public String getPhoneNumber(String response) throws Exception {
//1. 获取验签和解密所需要的参数
MapString, String> openapiResult = JSON.parseObject(response,new TypeReferenceMapString, String>>() {}, Feature.OrderedField);
String signType = "RSA2"; //加签算法, 默认值
String encryptType = "AES"; //加签算法, 默认值
String charset = "UTF-8"; //验签和解密用的字符集, 默认值
String sign = openapiResult.get("sign");
String content = openapiResult.get("response");
//判断是否为加密内容
boolean isDataEncrypted = !content.startsWith("{");
boolean signCheckPass = false;
//2. 验签
String signContent = content;
String signVeriKey = aliPayProperty.getAlipayPublicKey(); //"你的小程序对应的支付宝公钥(为扩展考虑建议用appId+signType做密钥存储隔离)"
String decryptKey = "7nhiwn2N5fIpYZ2wsBm5hA==";//★★★你的小程序对应的接口加解密密钥(为扩展考虑建议用appId+encryptType做密钥存储隔离)
//如果是加密的报文则需要在密文的前后添加双引号
if (isDataEncrypted) {
signContent = "\"" + signContent + "\"";
} try {
signCheckPass = AlipaySignature.rsaCheck(signContent, sign, signVeriKey, charset, signType);
} catch (AlipayApiException e) {
// 验签异常, 日志
} if (!signCheckPass) {
//验签不通过(异常或者报文被篡改),终止流程(不需要做解密)
throw new Exception("验签失败");
}
//3. 解密
String plainData = null;
if (isDataEncrypted) {
try {
plainData = AlipayEncrypt.decryptContent(content, encryptType, decryptKey, charset);
} catch (AlipayApiException e) {
//解密异常, 记录日志
throw new Exception("解密异常");
}} else {
plainData = content;
}
System.out.println(plainData);
return plainData;
}

/** 用授权码获取 access_token, user_id
* 官方文档: https://opendocs.alipay.com/open/02ailc */
private AlipaySystemOauthTokenResponse getAccessToken(String autoCode) throws AlipayApiException {
AlipayClient alipayClient = aliPayProperty.getAlipayClient();

AlipaySystemOauthTokenRequest request = new AlipaySystemOauthTokenRequest();
request.setGrantType("authorization_code");//请求参数 grant_type
request.setCode(autoCode);//请求参数,授权码 code
// request.setRefreshToken("201208134b203fe6c11548bcabd8da5bb087a83b");//请求参数 refresh_token
AlipaySystemOauthTokenResponse response = alipayClient.execute(request);

System.out.println("返回的信息: "+response.getBody());

if(response.isSuccess()){
System.out.println("获取access_token成功");
return response;
} else {
System.out.println("获取access_token失败");
return null;
}
}

/** 获取支付宝用户信息
* 官方文档: https://opendocs.alipay.com/open/02aild */
private AlipayUserInfoShareResponse getAliUserInfo (String accessToken) throws Exception {
AlipayClient alipayClient = aliPayProperty.getAlipayClient();
AlipayUserInfoShareRequest request = new AlipayUserInfoShareRequest();
AlipayUserInfoShareResponse response = alipayClient.execute(request,accessToken);
if(response.isSuccess()){
System.out.println("获取用户信息成功");
return response;
} else {
System.out.println("获取用户信息失败");
return null;
}
}
}

前端代码

// 支付宝授权登录
my.getAuthCode({
    scopes: ['auth_user'],
    success: res => {
        console.log(JSON.stringify(res));
        if (res.authCode) {
            my.request({
                url: '后端支付宝登录接口', //将授权码 res.authCode 发给后端进行登录处理
                method: 'GET',
                data: {
                    authCode: res.authCode
                },
                success: res => {
                    console.log(res);
                },
                fail: res => {
                    console.log(res);
                }
            });
        }
    }
});

// 支付宝获取用户手机号
my.getPhoneNumber({
    success: (res) => {
        let encryptedData = res.response;
        my.request({
            url: '你的后端电话号解密接口',
            data: encryptedData,
        });
    },
    fail: (res) => {
        console.log(res);
        console.log('getPhoneNumber_fail');
    },
});


17330196230 13230981129

多线程同步开发
项目经理1v1跟进
源码定制交付
一次合作/终身售后

微信扫码登录/注册

提示

您的诉求已经提交请等待工作人员联系,快速通过请联系管理员

微信扫一扫快速联系

用户协议

欢迎访问我们的网站!我们非常重视用户的隐私权和信息安全,因此制定了以下用户协议,以明确我们与您之间的关系以及您在使用本网站时应遵守的条款。请您仔细阅读并同意本协议的所有条款,以便您能够合法、安全地使用本网站。如果您不同意本协议的任何内容,请立即停止使用本网站。

  1. 服务说明:本网站是一个提供定制软件开发服务和在线找技术搭档的互联网平台。我们保留随时更改、更新或暂停本网站的权利。我们会尽力确保网站的正常运行,但对于因技术问题、系统维护或其他原因导致的网站暂时不可用,我们不承担任何责任。

  2. 用户注册:用户需要通过提供手机号、微信扫码和其他必要信息来注册一个账户。您有责任保护您的用户名和密码,不得将其透露给任何第三方。对于因您的用户名和密码被泄露而导致的任何损失或损害,我们将不承担责任。

  3. 用户行为规范:用户应遵守中华人民共和国相关法律法规,不得发布或传播违法信息、侵犯他人权益的内容。用户应对其发布的内容负责,并承担因发布不当内容而引起的任何法律责任。

  4. 版权声明:本网站所包含的所有文字、图片、音频、视频等素材的著作权均归本网站所有(会员用户上传的默认承诺为不侵权的合法自有技术成果,本网站审核信息后可展示,所有权不归本网站)。未经本网站书面许可,任何单位或个人不得以任何形式复制、转载、修改或传播本网站的任何内容。对于侵犯本网站知识产权的行为,将依法追究其法律责任。

  5. 免责声明:本网站不对因使用本网站而引起的任何直接、间接、偶然、特殊或后果性的损害承担责任。包括但不限于利润损失、数据丢失、业务中断等。

  6. 适用法律和争议解决:本协议的签订、履行、解释及争议解决均适用中华人民共和国法律。如发生争议,双方应首先协商解决;协商不成的,任何一方均有权向有管辖权的人民法院提起诉讼。

  7. 本协议的解释权归本网站所有。如有未尽事宜,本网站保留最终解释权。

  8. 本协议自用户点击“同意”或“接受”按钮时生效。

同意

隐私政策

欢迎访问我们的网站!我们致力于为您提供一个安全、可靠的在线环境。本隐私政策旨在说明我们在您使用我们的网站时如何收集、使用和保护您的个人信息。请仔细阅读以下内容,以了解我们的隐私政策。

  1. 信息收集

在使用我们的网站时,我们可能会收集以下类型的信息:

a) 个人识别信息:如姓名、电子邮件地址、电话号码等。 b) 非个人识别信息:如浏览器类型、操作系统、设备类型、IP地址等。 c) 用户行为信息:如访问页面、点击链接、搜索查询等。

  1. 信息使用

我们收集的信息将用于以下目的:

a) 提供、改进和个性化我们的服务。 b) 与您联系,回应您的询问和请求。 c) 发送您请求的或我们认为对您有帮助的信息。 d) 进行市场调研和分析,以改进我们的产品和服务。 e) 防止欺诈和其他非法活动。

  1. 信息共享

我们不会出售、出租或以其他方式与第三方共享您的个人信息,除非:

a) 获得您的明确同意。 b) 与可信赖的合作伙伴共享,以提供您请求的服务。 c) 根据法律要求或政府机关的要求。 d) 为保护我们的权利、财产或安全。

  1. 信息安全

我们采取合理的安全措施,以保护您的个人信息不受未经授权的访问、披露、更改或破坏。然而,请注意,没有任何一种电子存储方法是100%安全的。

  1. Cookie和跟踪技术

我们的网站使用Cookie和类似的跟踪技术来收集有关您使用我们网站的信息。这些信息有助于我们分析和改进我们的网站,以及提供个性化的内容和广告。您可以通过浏览器设置拒绝接受Cookie,但这可能会影响您使用我们网站的能力。

  1. 第三方链接

我们的网站可能包含指向其他网站的链接。请注意,我们对其他网站的隐私政策和实践不承担任何责任。我们建议您在访问这些网站时查看其隐私政策。

  1. 隐私政策的变更

我们可能会不时更新本隐私政策。请定期查看此页面,以确保您了解我们对个人信息的最新政策。

  1. 联系我们

如果您对我们的隐私政策有任何疑问或建议,请通过以下联系方式与我们联系:

电子邮件:[wangye-101@163.com]

电话:+86-173-3019-6230

地址:中国石家庄市长安区吾悦广场2010室

感谢您的信任和支持!我们将竭诚为您提供更优质的服务。

同意