支付宝登录(一半)

This commit is contained in:
磷叶 2024-12-03 18:03:21 +08:00
parent 8a9a04733f
commit 5c91bfa2aa
14 changed files with 245 additions and 59 deletions
smart-switch-ruoyi
smart-switch-common
pom.xml
src/main/java/com/ruoyi/common
smart-switch-framework/src/main/java/com/ruoyi/framework/web/service
smart-switch-service/src/main/java/com/ruoyi/ss/user
smart-switch-web/src/main
java/com/ruoyi/web/controller/app
resources

View File

@ -16,6 +16,12 @@
</description>
<dependencies>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>2.0.53</version>
</dependency>
<!--hutool-->
<dependency>
<groupId>cn.hutool</groupId>

View File

@ -1,8 +1,21 @@
package com.ruoyi.common.auth.ali;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;
import com.alibaba.fastjson.parser.Feature;
import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayClient;
import com.alipay.api.AlipayConfig;
import com.alipay.api.internal.util.AlipayEncrypt;
import com.alipay.api.internal.util.AlipaySignature;
import com.alipay.api.request.AlipaySystemOauthTokenRequest;
import com.alipay.api.response.AlipaySystemOauthTokenResponse;
import com.ruoyi.common.exception.ServiceException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Map;
/**
* 支付宝认证服务
* @author wjh
@ -11,12 +24,94 @@ import org.springframework.stereotype.Service;
@Service
public class AliAuthService {
@Autowired
private AlipayClient alipayClient;
@Autowired
private AliConfig aliConfig;
public String getOpenId(String loginCode) {
// TODO
// 构造请求参数以调用接口
AlipaySystemOauthTokenRequest request = new AlipaySystemOauthTokenRequest();
// 设置授权码
request.setCode(loginCode);
// 设置授权方式
request.setGrantType("authorization_code");
try {
AlipaySystemOauthTokenResponse response = alipayClient.execute(request);
System.out.println(response.getBody());
if (response.isSuccess()) {
return response.getUserId();
} else {
System.out.println("调用失败");
// sdk版本是"4.38.0.ALL"及以上,可以参考下面的示例获取诊断链接
// String diagnosisUrl = DiagnosisUtils.getDiagnosisUrl(response);
// System.out.println(diagnosisUrl);
}
} catch (Exception e) {
throw new ServiceException(e.getMessage());
}
return null;
}
/**
* 通过密文获取到手机号
*/
public String getPhoneNumber(String response) {
// TODO 获取手机号实现
return this.decrypt(response);
}
/**
* 解密
* @param response 前端响应密文
*/
private String decrypt(String response) {
//1. 获取验签和解密所需要的参数
Map<String, String> openapiResult = JSON.parseObject(response,new TypeReference<Map<String, String>>() {}, Feature.OrderedField);
String signType = "RSA2";
String charset = "UTF-8";
String encryptType = "AES";
String sign = openapiResult.get("sign");
String content = openapiResult.get("response");
//判断是否为加密内容
boolean isDataEncrypted = !content.startsWith("{");
boolean signCheckPass = false;
//2. 验签
String signContent = content;
// 你的小程序对应的支付宝公钥为扩展考虑建议用appId+signType做密钥存储隔离
String signVeriKey = aliConfig.getAlipayPublicKey();
// 你的小程序对应的加解密密钥为扩展考虑建议用appId+encryptType做密钥存储隔离
String decryptKey = aliConfig.getPrivateKey();//如果是加密的报文则需要在密文的前后添加双引号
if (isDataEncrypted) {
signContent = "\"" + signContent + "\"";
} try {
signCheckPass = AlipaySignature.rsaCheck(signContent, sign, signVeriKey, charset, signType);
} catch (AlipayApiException e) {
// 验签异常, 日志
} if (!signCheckPass) {
//验签不通过异常或者报文被篡改终止流程不需要做解密
throw new ServiceException("验签失败");
}
//3. 解密
String plainData = null;
if (isDataEncrypted) {
try {
plainData = AlipayEncrypt.decryptContent(content, encryptType, decryptKey, charset);
} catch (AlipayApiException e) {
//解密异常, 记录日志
throw new ServiceException("解密异常");
}
} else {
plainData = content;
}
return plainData;
}
}

View File

@ -1,6 +1,7 @@
package com.ruoyi.common.auth.ali;
import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayClient;
import com.alipay.api.AlipayConfig;
import com.alipay.api.DefaultAlipayClient;
import lombok.Data;
@ -16,18 +17,36 @@ import org.springframework.stereotype.Component;
@Data
public class AliConfig {
// @Value("${ali.appId}")
// private String appId;
//
// @Value("${ali.privateKey}")
// private String privateKey;
//
// @Bean
// public AlipayConfig alipayConfig() {
// AlipayConfig config = new AlipayConfig();
// config.setAppId(appId);
// config.setPrivateKey(privateKey);
//
// return config;
// }
// 应用ID
@Value("${ali.appId}")
private String appId;
// 应用私钥
@Value("${ali.privateKey}")
private String privateKey;
// 应用公钥
@Value("${ali.publicKey}")
private String publicKey;
// 支付宝公钥
@Value("${ali.alipayPublicKey}")
private String alipayPublicKey;
private AlipayConfig getAlipayConfig() {
AlipayConfig alipayConfig = new AlipayConfig();
alipayConfig.setServerUrl("https://openapi.alipay.com/gateway.do");
alipayConfig.setAppId(appId);
alipayConfig.setPrivateKey(privateKey);
alipayConfig.setAlipayPublicKey(alipayPublicKey);
alipayConfig.setFormat("json");
alipayConfig.setCharset("UTF-8");
alipayConfig.setSignType("RSA2");
return alipayConfig;
}
@Bean
public AlipayClient alipayClient() throws AlipayApiException {
return new DefaultAlipayClient(getAlipayConfig());
}
}

View File

@ -172,11 +172,21 @@ public class Constants
*/
public static final String CUSTOM_LOGIN_WX = "wx_login";
/**
* 支付宝登录
*/
public static final String CUSTOM_LOGIN_ALI = "ali_login";
/**
* 登录用户为微信
*/
public static final String USER_TYPE_WX = "USER_TYPE_WX";
/**
* 登录用户为支付宝
*/
public static final String USER_TYPE_ALI = "USER_TYPE_ALI";
/**
* 登录用户为APP账密登录
*/

View File

@ -244,4 +244,7 @@ public class SmUser extends BaseEntity
@ApiModelProperty("代理商是否允许商户开关设备")
private Boolean agentAllowMchSwitch;
@ApiModelProperty("支付宝openId")
private String aliOpenId;
}

View File

@ -16,8 +16,8 @@ import javax.validation.constraints.NotNull;
@ApiModel
public class AliLoginBody {
// @ApiModelProperty("用于获取手机号的授权码,首次登录必填")
// private String mobileCode;
@ApiModelProperty("获取手机号的密文")
private String mobileCiphertext;
@NotBlank(message = "登录授权码不允许为空")
@ApiModelProperty("my.getAuthCode获取的登录授权码用于获取openId必填")

View File

@ -7,6 +7,7 @@ import cn.binarywang.wx.miniapp.bean.WxMaPhoneNumberInfo;
import com.alibaba.fastjson2.JSONObject;
import com.ruoyi.common.auth.ali.AliAuthService;
import com.ruoyi.common.core.domain.entity.SmUser;
import com.ruoyi.common.core.domain.model.AliLoginBody;
import com.ruoyi.common.core.domain.model.WxLoginBody;
import com.ruoyi.common.enums.UserStatus;
import com.ruoyi.common.enums.UserType;
@ -270,7 +271,7 @@ public class SysLoginService
// 通过openId查询用户
String openId = wxAuthService.getOpenId(body.getLoginCode());
ServiceUtil.assertion(openId == null, "获取微信openId失败");
SmUser user = smUserService.selectSmUserByWxOpenId(openId);
SmUserVO user = smUserService.selectSmUserByWxOpenId(openId);
// 若用户不存在则使用openId进行注册
if (user == null || Objects.equals(user.getDelFlag(), UserStatus.DELETED.getCode())) {
@ -281,7 +282,7 @@ public class SysLoginService
mobile = wxAuthService.getWxPhoneNumber(body.getMobileCode());
}
// 用户注册
user = registerWx(openId, mobile);
user = smUserService.registerWx(openId, mobile);
}
ServiceUtil.assertion(user == null, "用户不存在");
@ -308,34 +309,6 @@ public class SysLoginService
return tokenService.createToken(loginUser);
}
/**
* 注册微信用户
* @param openId 微信OpenId
*/
private SmUserVO registerWx(String openId, String mobile) {
if (StringUtils.isBlank(openId)) {
return null;
}
String name = "微信" + openId.substring(openId.length() - 4);
// 添加用户
SmUserVO newUser = new SmUserVO();
newUser.setUserName(name);
newUser.setWxOpenId(openId);
newUser.setPhonenumber(mobile);
newUser.setType(UserType.USER.getType());
smUserService.insertSmUser(newUser);
// 添加微信账户
// Account accountData = new Account();
// accountData.setUserId(newUser.getUserId());
// accountData.setAccountNo(newUser.getWxOpenId());
// accountData.setAccountType(AccountType.WECHAT.getType());
// accountService.insertSmAccount(accountData);
return newUser;
}
public String userLogin(String username, String password, String code, String uuid) {
// 验证码校验
@ -344,7 +317,7 @@ public class SysLoginService
return this.appLogin(username, password);
}
public String aliLogin(WxLoginBody body) {
public String aliLogin(AliLoginBody body) {
// 通过支付宝openId查询用户
String openId = aliAuthService.getOpenId(body.getLoginCode());
ServiceUtil.assertion(openId == null, "获取支付宝openId失败");
@ -353,24 +326,23 @@ public class SysLoginService
// 若用户不存在则使用openId进行注册
if (user == null || Objects.equals(user.getDelFlag(), UserStatus.DELETED.getCode())) {
// 获取手机号
boolean loginWithPhone = sysConfigService.getBoolean(ConfigKey.ARRIVAL_DELAY);
String mobile = null;
if (loginWithPhone && StringUtils.hasText(body.getMobileCode())) {
mobile = wxAuthService.getWxPhoneNumber(body.getMobileCode());
if (loginWithPhone && StringUtils.hasText(body.getMobileCiphertext())) {
mobile = aliAuthService.getPhoneNumber(body.getMobileCiphertext());
}
// 用户注册
user = registerWx(openId, mobile);
user = smUserService.registerAli(openId, mobile);
}
ServiceUtil.assertion(user == null, "用户不存在");
Authentication authentication = null;
try {
UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(user.getUserId(), Constants.CUSTOM_LOGIN_WX);
UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(user.getUserId(), Constants.CUSTOM_LOGIN_ALI);
// 用户名和密码等信息保存在一个上下文中只要是同一线程等会就能拿到用户名和密码也就是能在loadUserByUsername(String username)方法中进行密码验证等
AuthenticationContextHolder.setContext(authenticationToken);
// 把用户登录类型放在上下文中的details属性中在UserDetailsServiceImpl.loadUserByUsername中获取
authenticationToken.setDetails(Constants.USER_TYPE_WX);
authenticationToken.setDetails(Constants.USER_TYPE_ALI);
// 该方法会去调用UserDetailsServiceImpl.loadUserByUsername
authentication = authenticationManager.authenticate(authenticationToken);
}

View File

@ -58,7 +58,7 @@ public class UserDetailsServiceImpl implements UserDetailsService
this.checkUser(user, username);
passwordService.validate(user);
return createLoginUser(user);
} else if(Constants.USER_TYPE_WX.equals(userType)) {
} else if(Constants.USER_TYPE_WX.equals(userType) || Constants.USER_TYPE_ALI.equals(userType) ) {
// app 用户微信登录
SmUser user = smUserService.selectSmUserByUserId(Long.parseLong(username));
this.checkUser(user, username);

View File

@ -37,4 +37,7 @@ public class SmUserQuery extends SmUser {
@ApiModelProperty("实名或用户名")
private String realOrUserName;
@ApiModelProperty("精准支付宝OpenId")
private String eqAliOpenId;
}

View File

@ -60,6 +60,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
su.show_bill_mobile_price,
su.agent_device_service,
su.agent_allow_mch_switch,
su.ali_open_id,
if(su.is_real, su.real_name, su.user_name) as real_or_user_name,
(select sum(stb.money) from sm_transaction_bill stb where stb.user_id = su.user_id and stb.type = '1' and stb.status = '2') as recharge_amount,
(select sum(stb.arrival_amount) from sm_transaction_bill stb where stb.user_id = su.user_id and stb.type = '2' and stb.status = '14') as with_drawl_amount,
@ -91,6 +92,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="readMchLicence != null "> and read_mch_licence = #{readMchLicence}</if>
<if test="showBillMobile != null "> and show_bill_mobile = #{showBillMobile}</if>
<if test="excludeUserId != null">and su.user_id != #{excludeUserId}</if>
<if test="aliOpenId != null and aliOpenId != ''">and su.ali_open_id like concat('%', #{aliOpenId}, '%')</if>
<if test="eqAliOpenId != null and eqAliOpenId != ''">and su.ali_open_id = #{eqAliOpenId}</if>
<if test="agentAllowMchSwitch != null">and su.agent_allow_mch_switch != #{agentAllowMchSwitch}</if>
<if test="realOrUserName != null and realOrUserName != ''">and if(su.is_real, su.real_name, su.user_name) like concat('%', #{realOrUserName}, '%')</if>
<if test="tenantDeviceId != null">
@ -201,6 +204,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="showBillMobilePrice != null">show_bill_mobile_price,</if>
<if test="agentDeviceService != null">agent_device_service,</if>
<if test="agentAllowMchSwitch != null">agent_allow_mch_switch,</if>
<if test="aliOpenId != null">ali_open_id,</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="userName != null and userName != ''">#{userName},</if>
@ -249,6 +253,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="showBillMobilePrice != null">#{showBillMobilePrice},</if>
<if test="agentDeviceService != null">#{agentDeviceService},</if>
<if test="agentAllowMchSwitch != null">#{agentAllowMchSwitch},</if>
<if test="aliOpenId != null">#{aliOpenId},</if>
</trim>
</insert>
@ -313,6 +318,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="showBillMobilePrice != null">show_bill_mobile_price = #{showBillMobilePrice},</if>
<if test="agentDeviceService != null">agent_device_service = #{agentDeviceService},</if>
<if test="agentAllowMchSwitch != null">agent_allow_mch_switch = #{agentAllowMchSwitch},</if>
<if test="aliOpenId != null">ali_open_id = #{aliOpenId},</if>
</trim>
where user_id = #{userId}
</update>

View File

@ -268,4 +268,18 @@ public interface ISmUserService
* @return
*/
SmUserVO selectSmUserByAliOpenId(String openId);
/**
* 注册支付宝账号
*/
SmUserVO registerAli(String openId, String mobile);
/**
* 注册微信账号
* @param openId
* @param mobile
* @return
*/
SmUserVO registerWx(String openId, String mobile);
}

View File

@ -1,5 +1,6 @@
package com.ruoyi.ss.user.service.impl;
import com.github.pagehelper.PageHelper;
import com.ruoyi.common.auth.wx.WxAuthService;
import com.ruoyi.common.constant.CacheConstants;
import com.ruoyi.common.core.domain.entity.SmUser;
@ -633,8 +634,58 @@ public class SmUserServiceImpl implements ISmUserService
*/
@Override
public SmUserVO selectSmUserByAliOpenId(String openId) {
// TODO
return null;
if (StringUtils.isBlank(openId)) {
return null;
}
SmUserQuery query = new SmUserQuery();
query.setEqAliOpenId(openId);
return this.selectOne(query);
}
@Override
public SmUserVO registerAli(String openId, String mobile) {
if (StringUtils.isBlank(openId)) {
return null;
}
String name = "支付宝" + openId.substring(openId.length() - 4);
// 添加用户
SmUserVO data = new SmUserVO();
data.setUserName(name);
data.setAliOpenId(openId);
data.setPhonenumber(mobile);
data.setType(UserType.USER.getType());
int insert = this.insertSmUser(data);
ServiceUtil.assertion(insert != 1, "注册支付宝用户失败");
return this.selectSmUserByUserId(data.getUserId());
}
@Override
public SmUserVO registerWx(String openId, String mobile) {
if (StringUtils.isBlank(openId)) {
return null;
}
String name = "微信" + openId.substring(openId.length() - 4);
// 添加用户
SmUserVO data = new SmUserVO();
data.setUserName(name);
data.setWxOpenId(openId);
data.setPhonenumber(mobile);
data.setType(UserType.USER.getType());
int insert = this.insertSmUser(data);
ServiceUtil.assertion(insert != 1, "注册微信用户失败");
return this.selectSmUserByUserId(data.getUserId());
}
private SmUserVO selectOne(SmUserQuery query) {
PageHelper.startPage(1, 1);
List<SmUserVO> list = this.selectSmUserList(query);
return CollectionUtils.getFirst(list);
}
private int selectCountByPhone(String phone) {

View File

@ -4,6 +4,7 @@ import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.constant.Constants;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.domain.model.AliLoginBody;
import com.ruoyi.common.core.domain.model.LoginBody;
import com.ruoyi.common.core.domain.model.WxLoginBody;
import com.ruoyi.common.enums.BusinessType;
@ -65,7 +66,7 @@ public class AppAuthController extends BaseController {
@Log(title = "支付宝授权登录", businessType = BusinessType.OTHER)
@ApiOperation("支付宝授权登录")
@PostMapping("/aliLogin")
public AjaxResult aliLogin(@RequestBody @Validated WxLoginBody body)
public AjaxResult aliLogin(@RequestBody @Validated AliLoginBody body)
{
AjaxResult ajax = AjaxResult.success();
// 生成令牌

View File

@ -138,5 +138,11 @@ liveness:
# 支付宝小程序
ali:
# 应用ID
appId: 2021004193649611
privateKey: D:\project\smart-switch\alipayPublicKey_RSA2.txt
# 应用私钥
privateKey: MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCLmoyeJgMCIh5xeYOzg1mnRTTPplkBTJAeXozAV/dTCu6vaKNPPRXjDwYILFzpYGAVhe9NNw6mcVq9WU4WEh4k05unDQIFNg0gXFQ9RNmcrV7uokVYAbTpPzmJHHF0oNXddsj9J37fFymP9GJCVuVGEkTHGP2DA6Odgq0xuHPiqQeyDzSldzpSwiRiYW71U534aJGz1MZQx3aI8KlANr2Z0c4WPdmYKmd0x137zHFU5yclsginrZL2tE34nBS5OJHqZQ/WLZIKhv8nGSvcILHhxktU6ggNhhGyf2OdlO9dr0z1exIZPrTMtAUQTEh/X/KqV8DgwNMFtNtT2LC47F+pAgMBAAECggEAAoSRELEi0MEIx4cnhu9RiKDI6Q3ZARr+Zm3SIA32GftSfrtmZqF1aZj1xOP38QWZ9glqXXwmuX3F4zBfJirBfGyMnCCx7qIg7np70ncRba/6zFcE5Sdyudo4EW7/5NiZwtrHmTlDIobqavw/YW7rx63Aq86Zk+lW5BpdQU5QWMAot4aFEPq91eo10a7EVigZKs9vkxKuW7OX/mI/BixkK9YBuq1xS6lefKjQfPPMPCRis3QQtkJWOw2myKXn7qcmCsecQwc3XdrV+6iFpYLOR2V4V3ALVFrDuGFb/2PBThWTiijPAypxQdb/Onu86Z3ObWDXYnPNspBODVxCWBWM2QKBgQDqJ31c37ZXUIfavFMBKp86evF9J+6cjGUOoU4iOd7NWW5QkLvNGAjw138ZQo7OKZ26LtzM2+4bbRVgNjdkVmj4ebdF0kijs7ruF+UhFneodFbwGCBXkMc3yLDLlYjZdeI9B/npGrwFuZAnmM1z+La6z0TlZoQnWe+WED5EUiKbJwKBgQCYoNOOPjb2ysXS/CEM/wX4TUDZ9Ykn85wVLOOhW17LYiMLBJq+uZj8BdN/rzdQ4YO4XqBaDA/t7GhiphaYAfsyy7f1oGEp4jtsyHz21uOPOz4ITnbJ9SUPz5VVmFgsCBjyh6KxckiMXEovcoV1Xqd535BPSQg5q1Y/RbOcaIswrwKBgBtqHjJWeunEIvPIIsu7KsNVC5sEptorUdWhqx00u1I9iz3hhCtiCgHwqQ/TDBc1JiNbQzy07y7E2cDW+CtGNqoIzh1dnmWUMGmZ4Ji8IaxWWqtnl7nI2Jo+Y/yh+FDFjYRpv6e8GpFtBWStbjiKwRIkHEPjecuFqxhdtHyZRTX3AoGAYbogm6SUdwMxFb4gv3yPawS0MJs6Hh2q5BghDJE/qkSFIanqF5MpNL3aRZiAd8ZeG/BjBiVREcvcrsWgE+a43DZ67MirTjEwUaAx+69ud6i8OH9dKkVQXMZS3UK1ukPZDXnxn2MItu7lBWpzr8pSvAN9GHcv0BU4HT1ZGx4JebsCgYEAjIbfv7CwfTwyRbevwVscmjEnvH1r336rU3GfC1C8tvPHVdjzVOEezRHwliT/uPLcUWmTLVtwnEGCcwqoz8PUpgvWeriHXlEqBX3pPixYa2kMLm+5se4qDO32QG1EQXeLPs5UWgqfItgqNEsdeFdsE27LEIqjmRzHoPTEKaylUVs=
# 应用公钥
publicKey: MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAi5qMniYDAiIecXmDs4NZp0U0z6ZZAUyQHl6MwFf3Uwrur2ijTz0V4w8GCCxc6WBgFYXvTTcOpnFavVlOFhIeJNObpw0CBTYNIFxUPUTZnK1e7qJFWAG06T85iRxxdKDV3XbI/Sd+3xcpj/RiQlblRhJExxj9gwOjnYKtMbhz4qkHsg80pXc6UsIkYmFu9VOd+GiRs9TGUMd2iPCpQDa9mdHOFj3ZmCpndMdd+8xxVOcnJbIIp62S9rRN+JwUuTiR6mUP1i2SCob/Jxkr3CCx4cZLVOoIDYYRsn9jnZTvXa9M9XsSGT60zLQFEExIf1/yqlfA4MDTBbTbU9iwuOxfqQIDAQAB
# 支付宝公钥
alipayPublicKey: MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAi1vuaEyUkCgagVodfOJp/rk1gwVzs8f/QzEXAEUwZZne+VE8be0rUv9SLY0uOjixanw0yhG9LinHJlePCvuK0Y31Cxx0BXgOt27nGTSqm4oINFYd5WL1vNMPzPE2gat+7ohO3h6FRlmsxsq9W5ZRkko+04Be4lEGZ+Ter/b2v3m4I3CzX6kr42e39QlDRUpD9l9ixpkmfEatdDf01Xp++Tvr/3EZcYoG3oPGztI7B8Kw8KV/6he3ZBlGROWz8ywZSBtR294Y1PRDv+3QXC3nr7J6OrTbnvj+MAtKmwjdkFHiFVr3gfenzeI87LnXrDPahda7Mn6ToQ1NU9tsWCcJgQIDAQAB