最近有点忙,一直没有更新支付宝如何利用证书模式来进行授权的,今天正好有点时间,对支付宝证书模式授权做一下记录,前段时间,我在一篇博文中说明了支付宝普通公钥如何进行授权,在此,一些创建小程序,配置问题不再细作说明,感兴趣的朋友可以查看小程序授权之支付宝(普通公钥)
证书模式相较于普通公钥模式安全性更高,对此,官方做了明确说明,在需要调用资金变动类接口时必须使用证书模式,可以根据业务需求选择相应的模式
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,如需获取其他用户信息查看小程序授权之支付宝(普通公钥)
如有疑问,欢迎留言